浅析Kubernetes Informer

本文深入剖析Kubernetes中Informer组件的功能与实现原理,详细介绍了其如何通过List和Watch方法从APIServer同步对象至本地缓存,以及AddEventHandler方法如何在对象变更时触发处理器函数,减轻APIServer负担。

熟悉Kubernetes的小伙伴们想必会有一窥源码的动机,领略大师的设计和实现,从官方开放出来的go-sdk来切入Kubernetes应该是个不错的选择。在client-go的工具包里面,informer是一个主要的工具,下文是小编对inform组件的主要功能和部分代码的简单介绍,若有错误之处,欢迎指出,小编果然献出铁头,供大家轻拍。

 

主要功能:

  1. List和Watch方法,从APIServer同步/解码对象到本地缓存,另外提供本地缓存的访问入口,减少对APIServer的访问压力。
  2. AddEventHandler方法,handler注册的入口,用户变更对象之后触发handler对应的函数,将对象状态信息写到workqueue,供worker消费。

 

逻辑关系图(引用徐超大神的分享):

 

代码结构浅析:

 

sharedInformerFactory

  • infomers成员:维护Type接口到SharedIndexInformer的map,此处映射到sharedIndexInformer struct指针变量,工厂设计模式。
  • startedInformers成员:维护Type接口到BOOL值的映射,启动informer之前在此判断,避免重复启动infromer。
  • 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指针变量的切片。
  • run方法:迭代listeners,调用processorListener.run/pop方法,触发processorListener.handler.OnAdd/OnUpdate/OnDelete方法。
  • ...

 

reflector

  • store成员:实现Store接口,此处赋值为DeltaFIFO struct指针对象。
  • listerWatcher成员:实现ListerWatcher的List/Watch方法,从APIServer同步/解码对象,此处赋值为ListWatch struct指针变量。
  • ListAndWatch方法:调用listerWatcher成员的List/Watch方法,完成对象从APIServer的同步/解码,然后调用syncWith和watchHandler方法,把事件和对象同步到store的存储成员中。
  • syncWith方法:调用Store接口的Replace方法,同步事件和对象信息。
  • watchHandler方法:调用Store接口的Add/Update/Delete方法,同步事件和对象信息。
  • ...

 

config

  • Queue成员:实现Queue接口,此处赋值为DeltaFIFO struct指针对象。
  • Process成员:值为sharedIndexInformer.HandleDelta方法。
  • ...

 

DeltaFIFO

  • items成员:map[string]Deltas,存储对象和操作信息。
  • queue成员:[]string,简单的链队列。
  • knownObjects成员:实现KeyListerGetter接口,此处赋值为cache struct指针对象。
  • Pop方法:从queue成员pop,调用config.Process方法。
  • Add/Delete/Update/Replace方法:调用queueActionLocked方法。
  • queueActionLocked方法:维护items和queue成员。
  •  ...

 

processorListener

  • nextCh成员:从本地pendingNotifications或者addCh生产消息,run方法消费消息。
  • addCh成员:从调用add方法生产消息,写入本地pendingNotifications或者传递给nextCh。
  • pendingNotifications成员:维护本地缓冲消息,此处赋值为RingGrowing struct值对象。
  • pop方法:维护nextCh和addCh的消息传递。
  • run方法:消费nextCh消息,按需调用processorListener.OnAdd/OnUpdate/OnDelete方法。
  • ...

 

 

总结:

熟悉Informer实现的主要策略和机制之后,会对后续开发controller带来很多的信心和好处,方便大家持续工作在Kubernetes平台上。本文简单描述了informer的主要结构,还有一些需要研究的地方,比如说缓存压缩,protobuf decode/encode机制,processListener的消息缓存机制,锁通知机制等等,谢谢。

 

<think>好的,我现在需要回答用户关于Kubernetes Informer架构中Lister的作用和原理的问题。首先,我要回忆一下自己了解的Kubernetes控制器相关知识。记得InformerKubernetes客户端库client-go中的一个重要组件,用于监控资源的变化,比如Pod、Deployment等。而Lister可能和缓存有关,用来获取资源列表而不必每次都去访问API Server。 接下来,我应该查阅用户提供的引用内容。引用3中提到,client-go提供对原生资源的编程接口,而处理CRD需要生成的clientset和informers。这说明了Informer在自定义资源中的作用。引用2提到编写控制器需要实现ListAndWatch,获取Informer和Indexer,使用工作队列处理事件。这里可能涉及到Lister作为缓存访问的一部分。 Lister的作用可能包括本地缓存资源的访问,减少对API Server的压力。比如,当控制器需要获取某个资源列表时,直接查询本地缓存而不是每次都远程请求,这样可以提高效率。原理方面,Lister可能利用Informer维护的Indexer来快速检索资源。Indexer是一个带索引的缓存,Lister通过它来获取数据。 另外,引用4提到control manager是集群运作的核心,负责处理存储在apiserver中的资源状态变化。Informer作为监控资源变化的机制,其缓存机制(如Lister)对于control manager的高效运作至关重要。 需要确认Lister如何与Informer协作。Informer负责从API Server监听资源变化,并更新本地缓存(Indexer)。Lister则是对这个缓存的封装,提供查询接口。例如,当需要列出所有Pod时,Lister直接从缓存读取,而不需要网络请求。 总结来说,Lister的作用是提供对本地缓存的只读访问,减少API调用,提高性能。其工作原理依赖于Informer维护的Indexer,确保缓存与API Server状态一致。这样,控制器可以高效、可靠地访问资源数据。</think>### Kubernetes Informer 中 Lister 的作用与原理 #### 1. **Lister 的核心作用** **Lister 是 Informer 架构中用于本地缓存数据访问的核心组件**,其核心用途包括: - **缓存查询优化**:提供对 Kubernetes 资源的本地缓存访问,避免频繁调用 Kubernetes API Server,降低网络开销和服务器压力[^3]。 - **数据一致性保障**:通过 Informer 的 List-Watch 机制,保证本地缓存与 Kubernetes 集群中的资源状态实时同步[^3][^4]。 - **高效数据检索**:基于索引(Indexer)实现快速查询,例如通过资源名称、标签等条件过滤数据[^2][^3]。 #### 2. **Lister 的工作原理** Lister 的工作流程可分为以下步骤: 1. **缓存初始化** Informer 启动时,通过 `List` 方法从 Kubernetes API Server 全量拉取资源列表,存入本地缓存(Indexer)[^3][^4]。 ```go // 示例代码逻辑(非完整代码) list, err := kubeClient.CoreV1().Pods(namespace).List(context.TODO(), metav1.ListOptions{}) indexer.Add(list.Items) // 存入本地缓存 ``` 2. **增量更新监听** Informer 通过 `Watch` 监听资源变更事件(Add/Update/Delete),实时更新缓存[^3][^4]。 ```go watcher, err := kubeClient.CoreV1().Pods(namespace).Watch(context.TODO(), metav1.ListOptions{}) for event := range watcher.ResultChan() { switch event.Type { case "ADDED": indexer.Add(event.Object) case "MODIFIED": indexer.Update(event.Object) case "DELETED": indexer.Delete(event.Object) } } ``` 3. **数据查询** Lister 通过封装 Indexer 提供两类接口: - **列表查询**:如 `List(labels.Selector)`,根据标签选择器过滤资源。 - **单资源查询**:如 `Get(name string)`,通过资源名称直接获取对象[^2]。 #### 3. **Lister 与 Indexer 的关系** - **Indexer 是底层存储**:本质是一个线程安全的本地缓存,支持自定义索引(如按命名空间、标签等)[^3]。 - **Lister 是查询封装**:对 Indexer 的访问进行抽象,提供符合 Kubernetes 资源模型(如 `PodLister`、`DeploymentLister`)的查询接口[^3]。 #### 4. **性能优势分析** - **减少 API 调用**:直接读取本地缓存,避免高频请求 API Server(例如控制器循环检查资源状态时)[^4]。 - **降低延迟**:本地缓存查询通常在微秒级,而远程 API 调用可能达到毫秒级。 - **提升可靠性**:即使 API Server 短暂不可用,控制器仍可通过缓存继续工作[^4]。 --- ### 架构示意图 ``` +----------------+ Watch 监听 +-------------------+ | Kubernetes API | <-------------------> | Informer (Client) | +----------------+ List 全量同步 +-------------------+ | 更新缓存 v +--------------+ | Indexer | | (本地缓存) | +--------------+ | | 查询封装 v +--------------+ | Lister | +--------------+ ``` ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值