iis怎么建设网站内容,wordpress钢琴导航,企业所得税计税依据,app定制的价格开发Client-go 主要用在 k8s 控制器中
什么是 k8s Informer
Informer 负责与 kubernetes APIServer 进行 Watch 操作#xff0c;Watch 的资源#xff0c;可以是 kubernetes 内置资源对象#xff0c;也可以 CRD。
Informer 是一个带有本地缓存以及索引机制的核心工具包#x…Client-go 主要用在 k8s 控制器中
什么是 k8s Informer
Informer 负责与 kubernetes APIServer 进行 Watch 操作Watch 的资源可以是 kubernetes 内置资源对象也可以 CRD。
Informer 是一个带有本地缓存以及索引机制的核心工具包当请求为查询操作的时候会优先从本地缓存内存去查询数据而 创建、更新、删除这类操作则会根据事件通知写入队列 DeltaFIFO 中同时对应的事件处理过后更新本地缓存使得本地缓存与 ETCD 的数据保持一致性。
Informer 内部主要组件
Reflector使用 List-Watch 来保证本地缓存数据的准确性和顺序一致性。List 从 k8s APIServer 中获取该资源的所有实例得到最新的 ResourceVersion然后使用 Watch 方法监听该方法resourceVersion之后的所有变化如果发现对象的实例有如Added、Updated、Deleted 动作Reflector 收到”事件通知“并利用反射机制将监听的结果实例化成具体的对象然后将资源对象的变化事件存到本地队列 DeltaFIFO 中。DeltaFIFO是一个增量的队列记录了资源变化过程Reflector 就相当于队列的生产者。这个组件可以拆分为两个部分来理解。FIFO 就是一个队列拥有队列基本操作方法如ADD、UPDATE、DELETE、LIST、POP及CLOSE等而Delta是一个资源对象存储保存存储对象的消息类型如 Added、Updated及Deleted 等。LocalStoreIndexerInformer 不断从 DeltaFIFO 中读取增量。如果遇到事件类型是 Added操作那么 Informer 会把这个增量对象保持到本地缓存里头并且还为它创建索引如果遇到类型为 Deleted 操作那么 Informer 会在本地缓存删除该对象。此外LocalStore 不仅用来存储资源对象而且还自带索引功能的本地存储LocalStoreIndexer 与 Etcd 中的数据是完全一致的当要查询 Get 或 Listk8s 对象时可直接请求 LocalStore这样就减少 Kubernetes APIServer 的资源交互压力。WorkqueueDeltaFIFO 在同步完 LocalStore 后会 Pop 这个事件到 Controller 中 Controller 会调用事先注册的 ResourceEventHandler 回调函数如 OnAdd、OnUpdate、 OnDelete进行处理 回调函数处理得到的 obj-key放入 Workqueue 中供 Worker 中的业务逻辑处理。
List-Watch
List-Watch 机制是 k8s 中的异步消息通知机制通过它能有效的确保了消息的实时性、顺序性及可靠性。
List-Watch 分为两个部门 List 负责调用资源对应的 k8s APIServer 的 RESTful API 获取全局数据列表并且同步到本地缓存中DeltaFIFO。 Watch 负责监听资源的变化并调用相应事件处理函数进行处理同时维护更新本地缓存使得本地队列与 Etcd 总数据保持一致。
List 是基于 HTTP 中的短链接实现Watch 则是基于 HTTP 长链接实现的Watch 使用长链接方式是为了减轻 k8s APIServer 的访问压力。
Reflector
Reflector 是client-go 中用来监听指定资源的组件当资源发生变化的时候如ADDED、UPDATE及DELETE操作时会以事件的形式存入本地队列然后有对应的方法处理。
在 Reflector 中核心的部分分别是 List-Watch其他功能基本都是围绕它来搞的。
在实例化 Reflector 的过程中其中有ListerWatcher的接口对象这个结构体对象有两个方法分别是List和Watch这两个方法实现List-Watch功能。
Reflector 核心逻辑 List调用List方法获取资源全部列表数据转换为资源对象列表然后保存到本地缓存中 定时同步定时器定时触发同步机制定时更新缓存数据在Reflector结构体对象中是可以配置定时同步的周期时间的。 Watch监听资源的变化并且调用对应的事件处理函数来处理
Reflector 组件对于数据更新同步都是基于 ResourceVersion 来进行每个资源对象都会有 ResourceVersion 这个属性当数据发生变化时候 ResourceVersion 也会将以递增的形式更新这样就确保事件的更新顺序了。
DeltaFIFO
DeltaFIFO 是一个增量的本地队列记录资源对象的变化过程。它生产者是 Reflector 组件将监听到的对象同步到 DeltaFIFO中。 FIFO 是一个先进先出的本地队列负责接收 Reflector 传递过来的事件并将其按照顺序存储然后等待事件的处理若同时出现多个相同的事件则会被处理一次。FIFO 是队列那么它也会拥有队列相关操作的方法可以通过 Queue 这个接口对象来实现队列需求的方法的同时还根据需要扩展一些其他的方法如PopAddIfNotPresent等。 Delta 是一个资源对象的存储有两个属性分别是 Type 和 Object Type 表示这个事件类型如Added表示增量Update 表示更新等 Object 是一个接口类型它表示k8s 资源对象如Pod和Service等。
总结
Reflector 的主要作用是通过 Kubernetes Watch API 监听某种 resource 下的所有事件DeltaFIFO 和 LocalStore 是 Informer 的两级缓存Lister 主要是被调用 List/Get 方法Processor 中记录了所有的回调函数实例(即 ResourceEventHandler 实例)并负责触发这些函数。
https://github.com/cloudnativeto/sig-kubernetes/issues/11