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杂谈!




