client-go源码分析--informer机制流程分析

版本

version: v12.0.0

1 informer对象关系

client-go源码分析--informer机制流程分析

 

informer对象即controller struct(下文的controller即informer,注意这里的controller和k8s中的controller概念是不一样的)。controller对象关联关系比较复杂,上面的组件关系主要抓住几个关键对象:controller,Reflector,cache。这几个对象就是client-go Controller Framework的三个核心对象。从controller组件关系看,controller对象包含了reflector, 并通过DeltaFIFO关联了indexer(cache对象)。

2 一个controller创建和运行流程

我们首先分析controller的总体流程,其次分析controller框架内部如何处理DeltaFIFO弹出的Object。

2.1 controller总体流程分析

下图来自client-go Controller Framework官方文档,有几个重要的概念: reflector,informer,indexer。
client-go源码分析--informer机制流程分析

  • reflector:Reflector利用List&&Watch机制,获取k8s ApiServer中runtime.object对象变化状态并同步到DeltaFIFO。Reflector机制将在《Client-Go源码分析:Reflector》中详细介绍。
  • informer:即controller struct。Informer不断从DeltaFIFO中弹出对象,并和内存存储对象Indexer同步,随后调用用户注册的回调函数ResourceEventHandlers。
  • indexer:Indexer是内存存储对象,具有存储和快速索引的功能。Indexer机制将在《Client-Go源码分析:Indexer, cache, threadSafeMap》中详细介绍。
    下图对官方架构图的简化,聚焦在Informer对象。
    client-go源码分析--informer机制流程分析

2.2 controller内部对象处理分析

我们以函数调用关系图关联上面的简化图。
client-go源码分析--informer机制流程分析
解释:以函数func NewIndexerInformer( lw ListerWatcher, objType runtime.Object, resyncPeriod time.Duration, h ResourceEventHandler, indexers Indexers,)为起始(tools/cache/controller.go中)。其中ListerWatcher, ResourceEventHandler,Indexers等作为函数的参数输入,创建一个controller和一个Indexer(本质是cache,也就是代码中的clientState)。其中controller创建过程需要经过一系列的复杂过程(见上图左边方框流程),newInformer-->NewDeltaFIFO-->func New(c *Config)。controller创建成功后会通过func (c *controller) Run启动(见上图右边方框流程)。其中Reflector.Run()用来将watch到的信息写入到DeltaFIFO队列,并写入到indexer中存储;c.processLoo调用customer Controller注册的ResourceEventHandler,在用户态进行处理。

参考:

https://www.jianshu.com/p/d17f70369c35

https://www.jianshu.com/p/2aaa0fe53db9

https://www.cnblogs.com/charlieroro/p/10330390.html