目录
1. 写在前面
个人主页: https://gzh.readthedocs.io
关注容器技术、关注
Kubernetes
。问题或建议,请公众号(
double12gzh
)留言。
依然秉承本系列的传统,在文章开始都会再次上一下下面这经经典的图(足见其重要性,哈哈哈)。
在client-go系列之1—client-go代码结构讲解中简单介绍一个client-go中的相关的模块(即图中上半部分),其实,在client-go中不只是有前面提到的模块,还包括上图中下半部分的内容,即自定义控制器部分,如:
- informer reference: 是一个
Informer
的实例,主要用于处理与CRD(自定义资源)对象相关的。当我们开发自定义控制器(custom controller)时,需要这个控制器开创建相匹配的Informer
。 - indexer reference:是一个
Indexer
的实例,主要用于处理与CRD(自定义资源)对象相关的。当我们开发自定义控制器时,需要创建Indexer
的实例,这个实例主要作用是实现存储+索引
。 - WorkQueue:工作者队列。前面我们提到过
Informer
,它除了更新本地缓存之外,还要将数据同步给相应控制器,WorkQueue
就是为了数据同步的问题而产生的。当有资源被添加、修改或删除,Informer
/SharedInformer
就会将相应的事件加入到WorkQueue
中。其它所有的控制器需要排队对这个queue进行读取,如果某个控制器发现这个事件与自己相关,就执行相应的操作。如果操作失败,就会把刚才取出的事件再放回到WorkQueue
中,等再轮到自己执行时会再去重试这次失败的操作。如果操作成功,就将该事件从队列中删除。 - Resource Event Handler:这是一个回调函数,当一个
Informer
/SharedInformer
要分发一个对象到控制器时,会调用此函数。例如:将对象的Key
放在WorkQueue
中并等待后续的处理。 - Process Item:用户自定义的处理
WorkQueue
中的相应Item
的函数。 如,我们可以在这里面使用Indexer
或Listing wrapper
来根据相应的Key
检索对象。
Item的内容如下:
queue中的内容如下:
在client-go的controller中给出了如何定义
Indexer
和Informer
的方法,代码位置:client-go/tools/cache/controller.go,代码如下:
344 func NewIndexerInformer(
345 lw ListerWatcher, // 用于获取/监控需要Informer处理的资源
346 objType runtime.Object, // 订阅的对象类型
347 resyncPeriod time.Duration, // 非0时,将会一直list我们所关心的对象; 0时,‘重新list’将会被推迟
348 h ResourceEventHandler, // 用于处理与resources相关的事件
349 indexers Indexers,
350 ) (Indexer, Controller) {
351 // This will hold the client state, as we know it.
352 clientState := NewIndexer(DeletionHandlingMetaNamespaceKeyFunc, indexers)
353
354 return clientState, newInformer(lw, objType, resyncPeriod, h, clientState)
355 }
ResourceEventHandler的定义如下。其代码位置: client-go/tools/cache/controller.go。这里的
Evnet
只是具有通知
的作用,因为,我们不应该对这里收到的对象进行任何修改。
212 type ResourceEventHandler interface {
213 OnAdd(obj interface{
}) // 当有新的对象被创建时,将会调用这个函数
214 OnUpdate(oldObj, newObj interface{
}) // 当对象被修改时,将会调用这个函数。除此之外,当有`re-list`操作时,这个函数也会被再次调用
215 OnDelete(obj interface{
}) // 当对象被删除时,将会调用这个函数。
216 }
2. Informer简介
一句话背景介绍:为了减少当多个控制器对k8s-api-server进行大量访问时对api-server造成压力。