knowledge-base

我的知识库 / Kubernetes / Informer

Informer

Informer是client-go中实现的一个工具包,目前已经被kubernetes中各个组件所使用,例如controller-manager。Informer本质是一个api资源的缓存。

主要功能

目的

本地缓存,避免组件直接与api-server交互,减缓对api-server及etcd的访问压力。

组件

下面结合流程示意图简单介绍这些组件的角色。

流程示意图

image

这张示意图展示了client-go类库中各个组件的工作机制,以及它们与咱们将要编写的自定义控制器的交互点(黄颜色标注的块是需要自行开发的部分)。

使用示例

自定义控制器

clientset, err := kubernetes.NewForConfig(config)
stopCh := make(chan struct{})
defer close(stopch)
sharedInformers := informers.NewSharedInformerFactory(clientset, time.Minute)
informer := sharedInformer.Core().V1().Pods().Informer()

informer.AddEventHandler(cache.ResourceEventHandlerFuncs{
  AddFunc: func(obj interface{} {
     // ...
   },
   UpdateFunc: func(obj interface{} {
     // ...
   },
   DeleteFunc  : func(obj interface{} {
     // ...
   })
   informer.Run(stopCh)
})

上面这个示例,当触发了 Add,Update 或者 Delete 事件,就通知 Client-go,告知 Kubernetes 资源事件发生变更并且需要进行相应的处理。

Infromer机制

资源Informer

每个内置的k8s资源对实现了对应的Informer机制,均包含Lister和Informer方法,例如:

type PodInformer interface {
    Lister()  cache.SharedIndexInformer
    Informer()  v1.PodLister
}

SharedInformer共享机制

每实例化一个Informer对象,都需要维护一个对应的Reflector。当同一对象Informer实例被实例化多次时,运行过多的ListAndWatch,这其中包括的


« HTTP 客户端调用 Kubernetes APIServer

» 通过 Ingress 进行灰度发布