Kubernetes Informer 核心机制与源码结构解析
主要功能
- List 和 Watch 方法,从 APIServer 同步/解码对象到本地缓存,另外提供本地缓存的访问入口,减少对 APIServer 的访问压力。
- AddEventHandler 方法,handler 注册的入口,用户变更对象之后触发 handler 对应的函数,将对象状态信息写到 workqueue,供 worker 消费。
代码结构浅析
sharedInformerFactory
- infomers 成员:维护 Type 接口到 SharedIndexInformer 的 map,此处映射到 sharedIndexInformer struct 指针变量,工厂设计模式。
- startedInformers 成员:维护 Type 接口到 BOOL 值的映射,启动 informer 之前在此判断,避免重复启动 informer。
- Start 方法:迭代 informers 成员,调用 informer.run 方法启动 informer。
- InformerFor 方法:为 informers 成员持续增加 entry。
- ...
deploymentInformer
- factory 成员:实现 SharedInformerFactory 接口的结构变量,此处赋值为 sharedInformerFactory struct 指针变量。
- Informer 方法:调用 factory 的 InformerFor 方法,返回 sharedIndexInformer 指针对象。
- Lister 方法:返回 informer 的 indexer 成员,用以读取本地缓存。
- ...
sharedIndexInformer
- indexer 成员:实现 Indexer 接口,维护本地缓存 (map[string]interface{}),此处赋值为 cache struct 指针变量。
- controller 成员:实现 Controller 接口,维护 APIServer 到本地缓存的同步机制,同时保持与 processor 的通讯,此处赋值为 controller struct 指针对象。
- processor 成员:保持与 controller 的通讯,触发 handler 对应的方法,此处赋值为 sharedProcessor struct 指针对象。
- AddEventHandler 方法:创建 processorListener struct 值对象,append 到 processor 成员的 listeners 和 syncinglisteners。
- HandleDelta 方法:迭代 controller.config.Queue.items[key](Delta 切片),调用 indexer.Add/Delete/Update 更新本地缓存,同时调用 processor.distribute 方法,按需迭代 processor 的 listeners 和 syncinglisteners,下发消息到 listener 的消息队列。
- ...
indexer
- cacheStorage 成员:实现 ThreadSafeStore 接口,维护本地线程安全的缓存 map[string]interface{},此处赋值为 threadSafeMap struct 指针变量。
- keyFunc 成员:维护本地缓存 key 的函数。
- Add/Delete/Update/List 方法:支撑对本地缓存的常用操作。
- ...
controller
- reflector 成员:利用 resourceVersion 机制衔接调用 listerWatcher.List/Watch 方法,从 APIServer 同步/解码对象到 config.Queue.items(map[string]Deltas) 中,此处赋值为 Reflect struct 指针对象。
- config 成员:维护链队列和对象操作映射 (map[string]Deltas),此处赋值为 Config struct 值对象。
- processloop 方法:传入 config.Process 成员,循环调用 config.Queue.Pop 方法。
- ...
processor
- listeners 成员:processorListener struct 指针变量的切片。


