controller-client-go机制简介
controller-client-go,个人翻译。
client-go under the hood
client-go库包含了多种机制,我们可以在开发自定义的controllers
的时候使用这些机制。这些机制定义在tools/cache folder库中。
下图展示了client-go
中的各种组件如何运行以及与我们自定义的controller
是如何交互的。
client-go components
Reflector
:定义在type Reflector inside package cache,watch
着Kubernetes API
中具体的resource type(kind)
。此功能是在ListAndWatch
中实现的。watch
的资源可以是内置的k8s
资源也可以是自定义的资源。当reflector
通过watch API
接收到新的资源实例的存在的话,它将通过相关listing API
接口获取到新创建的资源,并将其放在Delta Fifo
队列中。Informer
:定义在base controller inside package cache将从Delta Fifo
队列中pop
出对象。此功能通过processLoop
实现。base controller
的工作即保存此对象以便后续的检索,以便调用我们的控制器并将对象传递给它们。Indexer
:提供对象的索引功能。其定义在type Indexer inside package cache。
一个典型的indexing
使用场景就是基于对象的labels
来创建索引。Indexer
是线程安全的来存储对象以及它们的key
,在type Store inside package cache定义了默认的MetaNamespaceKeyFunc
的方法来生成该对象的key
,形如<namespace>/<name>
的组合。
Custom Controller components
Informer reference
:Informer reference
知晓如何与自定义的资源对象协同工作。在我们自定义的controller
中需要构建相关的Informer
。Indexer reference
:Indexer reference
知晓如何与自定义的资源对象协同工作。我们自定义的controller
需要创建它们。我们将使用这个引用来检索对象,以便以后进行处理。
client-go
提供的base controller
中已经提供了NewIndexerInformer
函数来创建Informer
和Indexer
,我们也可以通过直接调用此函数或者使用工厂方法来创建通知者。
Resource Event Handlers
:Informer
将会调用其中的回调函数将其中的对象传递给我们的controller
。函数中典型的参数维护着那些将要分发的对象的key
并将此key
入队列以便后续处理。Work Queue
:此work queue
主要用于解耦作用。资源事件处理器函数用于提取对象的key
并将其添加到工作队列中。Process Item
:用于处理工作队列中的元素项目。在其中可以有一个或者多个执行实际处理逻辑的行数。这些函数通常使用Indexer reference
或者Listing wrapper
来检索与key
对应的相关对象。
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 kirago杂谈!