2.2.3 Client-go 架构
Client-go 主要用在 Kubernetes 控制器中,包括内置控制器(如 kube-controller-manager)和 CRD 控制器,Client-go 架构如图 2-6 所示。根据图 2-6 介绍 Client-go 中的几个组件。
图 2-6 Client-go 架构
(1) Reflector:使用 List-Watch 的方法监控指定类型的资源对象,从 Kubernetes APIServer 中 List 该资源的所有实例,取得最新的 ResourceVersion,然后使用 Watch 方法监听该 resourceVersion 之后的所有变化,若过程中出现异常,Reflector 则会从断开的 ResourceVersion 处重现尝试监听所有变化,一旦该对象的实例有创建、删除、更新动作,Reflector 都会收到“事件通知”,并利用反射机制将监听的结果实例化成具体的对象。这时,该事件及它对应的实例对象的组合称为增量(Delta),之后会被存进 DeltaFIFO 中。
(2) DeltaFIFO:作为一个增量队列,将 Reflector 监控变化的对象形成一个 FIFO 队列,此处的 Delta 就是变化。
(3) LocalStore:Informer 会不断地从 DeltaFIFO 中读取增量,每出现一个对象,Informer 就会判断这个增量的事件类型,然后创建或更新本地缓存,也就是 LocalStore。例如,如果事件类型是 Added(添加对象),那么 Informer 会把这个增量中的对象保存到本地缓存中,并为它创建索引;若为删除操作,则在本地缓存中删除该对象。此外,LocalStore 还利用索引提供快速查找的能力,当使用者需要查询(Get/List) Kubernetes 对象时,可以直接请求 LocalStore ,以此减轻 Kubernetes APIServer 的压力。
(4) Workqueue:DeltaFIFO 在同步完 LocalStore 后,会 Pop 这个事件到 Controller 中,Controller 会调用事先注册的 ResourceEventHandler 回调函数(如 OnAdd、OnUpdate、OnDelete)进行处理,这些回调函数只做一些简单的过滤工作,最后将变更对象放入 Workqueue 中,供 Worker 中的业务逻辑处理。
(5) Clients:Client-go 中的各类客户端,当 Worker 中业务逻辑要操作 Kubernetes 资源时,可以通过客户端实现。