美文网首页
client-go源码分析(1):informer

client-go源码分析(1):informer

作者: charles_hahaha | 来源:发表于2019-05-16 16:20 被阅读0次

    前言

    本文聚焦client-go v11.0.0 controller框架Informer对象,分析源码理解informer的实现。更全面的介绍参考官方文档: https://github.com/kubernetes/client-go

    1 informer对象关系

    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。

    controller机制官方概览

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

    informer机制简化图

    2.2 controller内部对象处理分析

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

    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类型,该类型定义如下:

    Deltas类型定义

    Process的入参是Deltas类型的对象,即某个runtime.object的一组Delta状态,因此Process能实现有顺序的更新Indexer,资源的状态是同步+增量的方式同步的。下列代码中,clientState是indexer对象,clientState.Get(), clientState.Update(), clientState.Delete()就是对Indexer对象的操作。

    Process回调函数定义

    3 结语

    4 参考文档

    https://github.com/kubernetes/client-go

    https://blog.csdn.net/weixin_42663840/article/details/81699303

    相关文章

      网友评论

          本文标题:client-go源码分析(1):informer

          本文链接:https://www.haomeiwen.com/subject/yibiaqtx.html