S_lion's Studio

k8s-etcd理解

字数统计: 670阅读时长: 2 min
2021/10/03 Share

etcd作用

是用来存储所有 Kubernetes 的集群状态的,它除了具备状态存储的功能,还有事件监听和订阅、Leader选举的功能。

存储k8s集群状态

整个kubernetes系统需要用到etcd用来协同和存储配置的有:

  • 网络插件flannel、calico等网络插件也需要用到etcd存储网络的配置信息
  • kubernetes本身,包括各种对象的状态和元信息配置

很多网上资料讲flannel操作etcd使用的是v2的API,而kubernetes操作etcd使用的v3的API,所以在下面我们执行etcdctl的时候需要设置ETCDCTL_API环境变量,该变量默认值为2。实际环境中没有找到。

直接删除etcd中的数据在k8s中也会直接删除,但是由于apiserver会有对etcd的缓存,有段时间会显示数据显示不一致。

事件监听和订阅

所谓事件监听和订阅,各个其他组件通信,都并不是互相调用 API 来完成的,而是把状态写入 ETCD(相当于写入一个消息),其他组件通过监听 ETCD 的状态的的变化(相当于订阅消息),然后做后续的处理,然后再一次把更新的数据写入 ETCD。

leader选举

在k8s的组件中,其中有kube-scheduler和kube-controller-manager两个组件是有leader选举的,这个选举机制是k8s对于这两个组件的高可用保障。需要–leader-elect=true启动参数。即正常情况下kube-scheduler或kube-manager-controller组件的多个副本只有一个是处于业务逻辑运行状态,其它副本则不断的尝试去获取锁,去竞争leader,直到自己成为leader。如果正在运行的leader因某种原因导致当前进程退出,或者锁丢失,则由其它副本去竞争新的leader,获取leader继而执行业务逻辑。

在K8s中, 通过创建资源对象(当前的实现中实现了 ConfigMap 和 Endpoint 两种类型的资源)来维护锁的状态。这两种资源对象存在etcd里,也可以说是用etcd来实现的。

分布式锁一般实现原理就是大家先去抢锁,抢到的成为 leader ,然后 leader 会定期更新锁的状态,声明自己的活动状态,不让其他人把锁抢走。K8s 的资源锁也类似,抢到锁的节点会将自己的标记。设为锁的持有者,其他人则需要通过对比锁的更新时间和持有者来判断自己是否能成为新的 leader ,而 leader 则可以通过更新RenewTime来确保持续保有该锁。

CATALOG
  1. 1. etcd作用
    1. 1.1. 存储k8s集群状态
    2. 1.2. 事件监听和订阅
    3. 1.3. leader选举