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

版本

version: v12.0.0

1 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。

  • 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对象。

2.2 controller内部对象处理分析

我们以函数调用关系图关联上面的简化图。

解释:以函数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

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值