前言
本文聚焦client-go v11.0.0 controller框架Informer对象,分析源码理解informer的实现。更全面的介绍参考官方文档: https://github.com/kubernetes/client-go
1 informer对象关系
informer对象即controller struct(下文的controller即informer)。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。
reflector:
Reflector利用List&&Watch机制,获取k8s runtime.object对象变化状态并同步到DeltaFIFO。Reflector机制在《Client-Go源码分析:Reflector》中详细介绍。
informer:
Informer不断从DeltaFIFO中弹出对象,并和内存存储对象Indexer同步,随后调用用户注册的回调函数ResourceEventHandlers。
indexer:
Indexer是内存存储对象,具有存储和快速索引的功能。Indexer机制在《Client-Go源码分析:Indexer, cache, threadSafeMap》中详细介绍。
下图对官方架构图的简化,聚焦在Informer对象。
2.2 controller内部对象处理分析
我们以函数调用关系图关联上面的简化图。
Controller,Reflector,Indexer对象创建过程不再赘述。这里仅介绍fifo pop后续的流程,ListAndWatch push到fifo的过程在《client-go源码分析:Reflector》介绍。processLoop调用c.config.Queue.Pop()持续从fifo (DeltaFIFO)中弹出对象,并调用Process回调函数处理弹出的对象。
根据delta_fifo.go的Pop函数实现,DeltaFIFO Pop对象是Deltas类型,该类型定义如下:
Process的入参是Deltas类型的对象,即某个runtime.object的一组Delta状态,因此Process能实现有顺序的更新Indexer,资源的状态是同步+增量的方式同步的。下列代码中,clientState是indexer对象,clientState.Get(), clientState.Update(), clientState.Delete()就是对Indexer对象的操作。
3 结语
4 参考文档
https://github.com/kubernetes/client-go
https://blog.csdn.net/weixin_42663840/article/details/81699303