ETCD 的组件架构和内部通信

ETCD 常用术语

术语描述备注
Raftetcd实现一致性的核心etcd有etcd-raft模块
FollowerRaft中的从属节点竞争leader失败
LeaderRaft中的领导协调节点Leader 节点协调整个集群
Candidate候选节点当Follower接受Leader节点的消息超时会转变为Candidate
NodeRaft 状态机的实例Raft 中涉及多个节点
Memberetcd实例,管理着对应的Node节点可处理客户端请求
Peer同一集群中的另一个Member其他成员
Clusteretcd集群拥有多个etcd Member
Lease租期关键设置的租期,过期删除
Watch检测机制监控键值对的变化
Term任期某个节点成为Leader,到下一次竞选的时间
WAL预写式日志用户持久化存储的日志格式
Client客户端向etcd发起请求的客户端

ETCD 核心架构

在这里插入图片描述

  • etcd 是云原生架构中的存储基石,可以有效保证数据的一致性和可靠性。
  • etcd 内存实现机制复杂,但是对外提供了简单直接的api接口
  • 使用etcd的常见分布式场景包括键值对的存储服务注册与发现消息订阅与发布分布式锁等等

ETCD 网关和gRPC-gateway

ETCD网关:构建etcd集群的门户

  • etcd网关是一个简单的TCP代理,可将网络数据转发到etcd集群中
  • 网关是无状态且透明的,它既不会检查客户端请求,也不会干扰集群响应,支持多个etcd服务实例,并采用简单的循环策略。

如果同一服务器上的多应用程序访问的etcd集群,每个应用程序仍然需要知道etcd集群的广播客户端断点地址。
发生etcd集群实例的变更时,只需要网关更新其端点。

总而言之:为了自动传播集群端点更改,etcd网关在每台机器上都运行,为多个应用提供访问相同的etcd集群服务。

gRPC-Gateway:为非gRPC的客户端提供HTTP接口

HTTP的方式访问etcd服务端,需要考虑安全的问题,gRPC-Gateway中提供的API接口支持开启安全认证。
有的语言客户端不支持gRPC通信协议,此时就可以使用gRPC-Gateway对外提供HTTP API接口
,通过HTTP请求,实现与gRPC调用协议同样的功能。

gRPC-proxy

可伸缩的watch API

如果客户端监视同一键或某一范围内的键,gRPC代理可以将这些客户端程序(c-watcher)合并为链接到etcd服务器的单个监视程序(s-watcher)

当watch事件发生时,代理将所有事件(s-watcher)广播到其(c-watcher)

在这里插入图片描述

为了有效地将多个客户端监视程序合并为一个监视程序,gRPC代理在可能的情况下将新的c-watcher合并为现有地s-watcher。也有负载均衡的效果。

另外如果没有指定监视版本,gRPC代理将不能保证c-watcher从最近的存储修订版本开始监视。

可伸缩的lease API

如果etcd工作负载涉及很多的客户端租约活动,这些流可能会导致CPU使用率过高,为了减少核心集群上的流总数,gRPC代理支持将lease流合并。

在这里插入图片描述

可以缓存请求的响应,这个功能可以保护etcd服务器免遭恶意for循环中滥用客户端的攻击。

空间命名

当应用程序期望对整个空间有完全控制,etcd集群与其他应用程序共享的情况下,为了使所有应用程序都不会相互地干扰地运行,代理可以对etcd键空间进行分区,以便客户端大概率访问完整的键空间。

ETCD 组件架构

包名用途
auth访问权限
client/clientv3Go语言客户端SDK
embed主要是etcd的config
etcdmain入口程序
etcdctl命令行客户端实现
etcdserverserver主要的包
functional/hackCMD、Dockerfile 之类的杂项
integration和etcd集群相关
lease租约相关
mvccetcd的底层存储,包含Watch实现
pkg、proxyetcd使用的工具集合
raftraft算法模块
wal日志模块
scripts/security/tests/tools/version脚本、测试等相关内容

在这里插入图片描述

  • client 层:etcd 的客户端
  • API 接口层:提供了客户端访问服务端的通信协议和接口定义以及服务端节点之间相互通信的协议,通过gRPC-gateway提供REST ful 代理,转换HTTP/JSON请求为gRPC的Protocol Buffer格式的消息。
  • etcd Raft层:负责Leader选举和日志复制等功能。
  • 逻辑层:包括鉴权,租约,KVserver,MVCC和Compactor压缩等核心功能特点。
  • etcd存储:实现了快照,预写式日志WAL(Write Ahead Log)

ETCD的交互总览

在这里插入图片描述

  • etcd Server:接收客户端的请求,在上述的etcd项目代码中对应etcd server包。etcd server中的raft模块,用于与etcd-raft库进行通信。
  • etcd Raft :etcd的raft库,raft库更重要的式负责与集群中的其他etcd server进行交互,实现分布式一致性。

在这里插入图片描述

首先写数据到etcd节点中,然后当前的etcd节点与集群中的其他etcd节点之间进行通信,确认存储数据成功之后回复客户端。

在raft协议中写入数据的etcd必定式leader节点,如果客户端提交数据到非leader节点时,该节点需要将请求转发到etcd leader节点处理

在这里插入图片描述

etcd的gRPC通信接口

Client定义

type Client struct{
	Cluster  // 向集群里增加etcd服务端节点之类,属于管理员操作
	KV // 我们主要使用的功能,即操作K-V
	Lease // 租约相关操作,比如申请一个TTL=10s的租约
	Auth // 管理ETCD的用户和权限 属于管理员操作
	Watcher // 观察订阅,从而监听最新的数据变化
	Maintenance // 维护etcd,比如主动迁移etcd的leader节点,管理员操作
	UserName string // 认证的用户名
	Password string // 认证的密码
}

etcd的核心API

  • KV Service :创建、更新获取和删除键值对
  • Watch Service :监视键的更改
  • Lease Service : 实现键值对过期客户端用来续租保持心跳
  • Lock Service : etcd提供分布式共享锁支持
  • Election Service :暴露客户端选举机制

读写过程概述

读请求

客户端通过负载均衡选择一个etcd节点,发出读请求,API接口层提供Range RPC方法,etcd服务端拦截gRPC 读取请求后调用相应的处理器处理请求。

  1. etcdctl会创建一个clientv3库对象,选取一个合适的etcd节点
  2. 调用KV Server模块的Range RPC方法,发送请求
  3. 拦截器拦截,主要做一些校验和监控
  4. 调用KV Server模块的Range接口获取数据

线性读:线性读是相对串行读来讲的概念,集群模式下会有多个etcd节点,不同节点可能存在一致性问题,串行读直接返回状态数据,不需要与集群中其他节点交互,这种方式速度快,开销小,但是会存在数据不一致的情况。 线性读需要集群成员之间达成共识,存在开销,响应速度相对满,但是能保证数据的一致性. etcd默认读模式是线性读。

etcd中的查询请求,查询单个键或一组键以及查询数量,到底层实际会调用Range keys方法。
在这里插入图片描述

  1. 在treeIndex中根据BTree快速查询该键对应索引项keyIndex,索引项中包含Revision
  2. 据查询到的版本号信息Revision,在Backend的缓存Buffer中用二分查找,如命中则直接返回
  3. 若缓存中不符合条件,在BlotDB中查找(基于BlotDB的索引),查询后返回键值对信息

写请求

客户端通过负载均衡选择一个etcd节点发起写请求etcd服务器拦截gRPC写请求,涉及校验和监控后,KV Server 向 raft模块发提案,内容为写入数据命令,经网络转发,当集群中多数节点达成一致,持久化数据后,状态变成MVCC模块执行提案内容。

  1. 客户端通过负载均衡算法选择一个etcd节点,发起gRPC调用
  2. etcd server收到客户端请求
  3. 经过gRPC拦截,Quota校验,Quota模块用于校验etcd db文件大小是否超过配额。
  4. KV Server模块将请求发送给本模块中的raft,负责与etcd raft模块进行通信发起一个提案,命令为put,foo,bar,即使用put方法将foo更新为bar
  5. 提案经过转发之后,半数节点成功持久化
  6. MVCC模块更新状态机

在这里插入图片描述

  • 6
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
### 回答1: K8s架构组件之间通信是通过API Server实现的。K8s中的所有组件都可以通过API Server进行通信和交互,包括kubelet、kube-proxy、scheduler、controller-manager等。API Server作为K8s的核心组件,负责接收和处理所有的API请求,并将请求转发给相应的组件进行处理。同时,API Server还负责对所有的资源对象进行验证和授权,确保系统的安全性和稳定性。 ### 回答2: K8s是一个容器编排和管理系统,它由多个组件构成,这些组件之间需要进行通信以实现集群管理和应用部署等功能。 K8s的架构中包含以下几个重要组件: 1. Master组件:包括API Server、Controller Manager、Scheduler等。Master组件负责整个集群的管理和决策。它们之间需要通过API Server进行通信。API Server提供了集群内各个组件的接口,其他组件可以通过发送RESTful请求给API Server来获取和操作集群状态。 2. Node组件:包括kubelet、kube-proxy等。Node组件是运行在每个节点上的代理程序,负责与Master组件通信。kubelet是K8s的主要工作进程,它从API Server获取Pod的配置信息,然后将Pod的容器创建、启动和管理工作交给容器运行时(如Docker)。kube-proxy则负责负载均衡和网络代理。 3. EtcdEtcd是一个分布式键值存储系统,用于存储集群的状态信息,包括节点状态、Pod定义、服务等。Master和Node组件通过与Etcd集群通信来读取和更新集群状态。 4. CNI插件:Container Network Interface(CNI)插件用于管理容器网络。它负责为Pod分配IP地址、配置容器网络和网络隔离等。不同的CNI插件可以与K8s集成,并提供网络通信能力。 以上组件之间的通信方式如下: 1. Master组件之间的通信:Master组件之间通过互相访问API Server进行通信,通过API Server获取集群状态和配置信息。 2. Master和Node组件之间的通信:Master组件与Node组件之间通过kubelet进行通信。Master通过API Server发送指令给kubelet,kubelet再调用容器运行时(如Docker)进行容器的创建和管理。 3. Node和Etcd之间的通信:Node组件通过kubelet与Etcd集群通信,从而读取和更新集群的状态信息。 4. Pod之间的通信:Pod中的容器之间可以通过localhost进行通信,它们可以互相访问和通信。同时,K8s通过CNI插件为每个Pod分配唯一的IP地址,从而允许不同节点上的Pod进行网络通信。 总体而言,K8s通过API Server、kubelet、Etcd和CNI插件等组件之间的通信来实现集群的管理和容器的部署。这些通信机制保证了集群的可靠性、可扩展性和高效性。 ### 回答3: Kubernetes(k8s)是一种开源的容器编排引擎,用于管理容器化应用程序的部署、扩展和管理。k8s架构由多个组件组成,包括Master节点上的控制器组件和Worker节点上的工作组件,它们之间通过各种通信机制进行协作和通信。 首先,k8s的控制器组件和工作组件之间通常通过API服务器进行通信。API服务器是k8s集群的主要接口,所有的操作和查询都通过API服务器进行处理。控制器和工作组件通过API服务器提供的API调用各种功能,例如创建、删除和更新资源。 其次,k8s中的控制器组件和工作组件之间还利用了etcd这个分布式键值存储系统来共享集群状态信息。etcd用于存储集群中的各种配置数据和运行时状态,包括Pod、Node和Service等的信息。控制器组件和工作组件可以通过etcd的API来读取和更新这些信息,以实现集群中各个组件的一致性。 另外,k8s中的控制器组件和工作组件之间通过网络通信来实现集群的管理和调度。它们通过kube-proxy组件来管理集群内部和外部的网络连接。kube-proxy负责配置底层网络实现(如iptables或IPVS)来处理流量转发和负载均衡。控制器组件和工作组件可以通过kube-proxy建立网络连接,并通过网络传输API调用和数据。 此外,k8s的控制器组件和工作组件之间还通过事件系统进行通信。每个组件可以通过事件系统发布和监听事件,以便及时获取其他组件的状态和变化。控制器组件可以监听工作组件的事件,并对其状态进行相应的调整。工作组件也可以监听控制器组件的事件,并根据事件进行相应的处理。 总之,k8s架构组件之间通过API服务器、etcd、网络通信和事件系统等多种通信机制进行协作和通信,保障了集群的正常运行和管理。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小生凡一

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值