client-go SharedInformer
在client-go中,informer是一个核心的概念,用于从Kubernetes API服务器中读取对象。它可以监视一个或多个API对象,并在对象发生变化时自动更新本地缓存。 Informer主要组成部分: SharedInformerFactory SharedInformerFactory是创建并管理一组 informer 的入口。它会根据资源类型复用同一个 SharedIndexInformer,避免同一资源重复创建多个 informer。 Reflector Reflector负责和 Kubernetes API Server 交互。它会先执行一次 List 拉取当前对象集合,然后进入 Watch 循环持续监听变更。它把 List/Watch 的结果包装成 Delta,并交给后续的 FIFO 缓存。 DeltaFIFO DeltaFIFO是一个带去重和顺序处理能力的队列,用来缓存 Reflector 产生的增删改事件。它会把对象的变化状态按 Delta 组织起来,供 controller 处理。 SharedIndexInformer SharedIndexInformer是 informer 的核心实现。它负责把 Reflector 的结果落到本地缓存中,并把变化事件分发给注册的事件处理器。它内部通常包含一个 controller、一个 store/indexer,以及一个 sharedProcessor。 Indexer/Store Indexer 是 informer 本地缓存的核心抽象,底是一个线程安全的 store。它可以按对象名和索引进行查询,供 lister 和 handler 使用。 ResourceEventHandler ResourceEventHandler 是事件处理器接口,实现是 cache.ResourceEventHandlerFuncs,其中包含 AddFunc、UpdateFunc、DeleteFunc。它用于接收 informer 分发出来的对象变化事件。 ListerWatcher ListerWatcher 是 informer 用来执行 List/Watch 的接口,底层通常由 clientset 对应的资源 client 实现。 在运行时,Reflector 负责从 API Server 拿到变化,DeltaFIFO 负责缓存和去重,SharedIndexInformer 再把这些变化写入 Indexer,并通过 sharedProcessor 分发给注册的事件处理器。处理链路是:Reflector -> DeltaFIFO -> SharedIndexInformer -> SharedProcessor -> ResourceEventHandler。 ...