数据结构

Controller:

sigs.k8s.io/controller-runtime/pkg/internal/controller/controller.go
包含一个Queue:
1.这个Queue里的数据,都会调用实现的Reconcile
2.这个Queue的数据来源,就是业务controller中add方法Watch的事件

Source:

sigs.k8s.io/controller-runtime/pkg/source/source.go

Kind 结构体,controller主要使用这个

Start 启动
在toolscache.SharedIndexInformer 中 增加 internal.EventHandler

Channel 结构体:是给外部event,例如Github Webhook callback使用的。

Start 启动
syncLoop -》distribute 会将监听到的事件,广播到所有监听这个source的eventhandler

eventhandler.EventHandler 接口

sigs.k8s.io/controller-runtime/pkg/handler/eventhandler.go

将k8s中的event转换成 reconcile.Request
internal.EventHandler 将eventhandler.EventHandler 转换成 cache.ResourceEventHandler


整体流程:

每个namespace:
manager.New -> 每个controller controller.New

一个namespace,构建一个manager (controllerManager)
每个controller manager分别 管理自己的所有的controller
每个controller manager分别 有一个 cache,这个cache是**NewInformersMap**(存储所有informer对象)

controller manager (start方法**) 启动的时候
1.启动cache中所有的informer
2.WaitForCacheSync:等待所有watch的informer synced
3.启动所有的controller:启动reconcile


InformerMap

  1. DelegatingReader : controllerManager的Client对象
  2. informerCache (InformersMap):

MapEntry{
Informer: ni, // client-go的informer
Reader: CacheReader{indexer: ni.GetIndexer(), groupVersionKind: gvk},
}

  1. CacheReader
  2. cache.Indexer (client-go)