controller-client-go,个人翻译。

client-go under the hood

client-go库包含了多种机制,我们可以在开发自定义的controllers的时候使用这些机制。这些机制定义在tools/cache folder库中。
下图展示了client-go中的各种组件如何运行以及与我们自定义的controller是如何交互的。
client-go-controller-interaction


client-go components

  • Reflector:定义在type Reflector inside package cache,watchKubernetes 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 referenceInformer reference 知晓如何与自定义的资源对象协同工作。在我们自定义的controller中需要构建相关的Informer
  • Indexer referenceIndexer reference 知晓如何与自定义的资源对象协同工作。我们自定义的controller需要创建它们。我们将使用这个引用来检索对象,以便以后进行处理。

client-go 提供的base controller中已经提供了NewIndexerInformer函数来创建InformerIndexer,我们也可以通过直接调用此函数或者使用工厂方法来创建通知者

  • Resource Event HandlersInformer将会调用其中的回调函数将其中的对象传递给我们的controller。函数中典型的参数维护着那些将要分发的对象的key并将此key入队列以便后续处理。
  • Work Queue:此work queue主要用于解耦作用。资源事件处理器函数用于提取对象的key并将其添加到工作队列中。
  • Process Item:用于处理工作队列中的元素项目。在其中可以有一个或者多个执行实际处理逻辑的行数。这些函数通常使用Indexer reference或者Listing wrapper来检索与key对应的相关对象。