Kubernetes 集群中的List-Watch 机制介绍

2020-08-14 0 By admin

Kubernetes 集群中 List-Watch机制是一个非常精彩的设计。
如下以一个完整的Pod调度过程为例,对API Server的 List-Watch 机制进行说明。

Pod 调度过程中List-Watch 机制
Pod 调度过程中List-Watch 机制

一、etcd 服务将事件通知到 API Server

首先,借助 etcd 提供的 Watch API接口,API Server 可以监听(Watch)在 etcd 上发生的数据操作事件,比如 Pod 创建事件、更新事件、删除事件等。在这些事件发生后,etcd 会及时通知API Server。

如上图所示 API Server 与 etcd 之间的交互:当一个 ReplicaSet 对象被创建并被保存到 etcd 中后,etcd 会立即发送一个对应的 Create 事件给 API Server,与其类似的6、7、10、11箭头都是针对 Pod 的创建、更新事件的。

二、API Server组件将事件通知到其他组件

然后,为了让 Kubernetes 中的其他组件在不访问底层 etcd 数据库的情况下,也能及时获取资源对象的变化事件,API Server 模仿 etcd 的Watch API接口提供了自己的 Watch 接口,从而,其他组件就能近乎实时地获取希望获取的任意资源对象的相关事件通知。

如上图所示 controller-manager、scheduler、kubelet 等组件与API Server之间的3个标记有List-Watch的虚框表明了此过程。
提示:其他组件在监听希望获取的资源事件的时候,可以增加过滤条件,如上图List-Watch3为例,node1节点上的kubelet进程只希望获取自己节点上的 Pod 事件。

三、全量和增量的结合

最后,Kubernetes List-Watch 用于实现数据同步的代码逻辑。
客户端首先调用API Server 的 List 接口获取相关资源对象的全量数据并将其缓存到内存中,然后启动对应资源对象的 Watch 协程,在接收到 Watch 事件后,再根据事件的类型(比如新增、修改或删除)对内存中的全量资源对象列表做出相应的同步修改。从实现上来看,这是一种全量结合增量的、高性能的、近乎实时的数据同步方式。