zoukankan      html  css  js  c++  java
  • 【原创】k8s源代码分析-----EndpointController




    转自本人空间 http://user.qzone.qq.com/29185807/blog/1459325937

    一、controller manager创建endpointController


    代码在k8s.iokubernetescmdkube-controller-managercontroller-manager.go main函数路口



    代码k8s.iokubernetescmdkube-controller-managerappcontrollermanager.go Run函数


    构建endpointcontroller

     


    二、endpointcontroller初始化

    EndpointController结构体

    代码k8s.iokubernetespkgcontrollerendpointendpoints_controller.go


    1、client

           就是kubeClient,与apiserver连接的接口部分。用于service的list和watch的获取,pod的list和watch的获取

    2、serviceStore与serviceController

           serviceStore,service信息的存储

           serviceController。service信息的生产者

    3、podStore与podController

           podStore,pod信息的存储

           podController,pod信息的生产者

    4、queue

           处理队列

     

    初始化

    代码k8s.iokubernetespkgcontrollerendpointendpoints_controller.go

     


    从上面的代码能够到,结构体里的各个成员进行了初始化。


    1、client

           就是kubeClient,与apiserver连接的接口部分。

    用于service的list和watch的获取。pod的list和watch的获取

    2、serviceStore与serviceController

           初始化为framework.NewInformer

           并将service的list和watch获取接口传入

    3、podStore与podController

           初始化为framework.NewInformer

           并将pod的list和watch获取接口传入

    4、queue

           就是一个队列(简单。所以不做分析)

     

    继续看Run函数



     

    三、serviceControllerpodController工作流程


    初始化流程

    代码在k8s.iokubernetespkgcontrollerframework controller.go



    上面的初始化几个地方比較重要


    1、clientState也就是Store(serviceStore,podStore)

           其传入的keyfunc为代码在k8s.iokubernetespkgcontrollerframework controller.go


    代码在k8s.iokubernetespkgclientcachedelta.go



    2、cfg是兴许非常重要的配置信息


    3、NewDeltaFIFO中传入的keyfunc

           代码在k8s.iokubernetespkgclientcachestore.go


    我们回到工作流程中 代码k8s.iokubernetespkgcontrollerframework controller.go


    从上面的代码来看,listerwatcher真正执行的还在下层的reflector

     

    下层reflector工作流程

    代码在k8s.iokubernetespkgclientcachereflector.go






    入口ListAndWatch

     

    我们看看list返回的是什么


    我们以service的list为例

    代码在k8s.iokubernetespkgclientunversioned services.go


    代码在k8s.iokubernetespkgapi ypess.go


    在此处插入一下对于list结果的处理



    再插入下fifo的处理

    代码在k8s.iokubernetespkgclientcachefifo.go


     


    ok我们回到ListAndWatch,上面的list获取到后,直接所有更新掉fifo中的信息

    我们继续ListAndWatch

    以下轮到watch信息的获取和处理



    我们看看watch的返回是什么(我们以service的watch为例)

    代码在k8s.iokubernetespkgclientunversioned services.go


    代码在k8s.iokubernetespkgwatchwatch.go

     

    我们继续watchHandler的处理(函数比較长,贴了几张图)

    以下的处理,事实上就是从watch获取到的事件,所有加入到fifo中







     


    我们看看fifo中的add函数。update函数,delete函数


     

    以上的loop会退出,但最顶层的reflector.Runutil会继续反复执行listAndwatch

    以上便是reflector的工作流程

    总结下,就是获取到list信息,然后更新掉store(fifo中的信息),然后watch获取到事件,然后依据不同的事件改动store(fifo)中的信息

     

    Controller的工作流程

    我们回到Controller中,代码在k8s.iokubernetespkgcontrollerframeworkcontroller.go




    当中的queue就是fifo。从中获取到一个item


    下图代码在k8s.iokubernetespkgclientcachefifo.go


    然后调用最上层传入的处理接口




    四、endpointController工作流程

     

    我们再回到之前初始化时候注冊的接口,代码在k8s.iokubernetespkgcontrollerendpoint endpoints_controller.go

    以下是serviceController的处理接口




    以下是podController的处理接口



     





     上面的所有处理接口。最后都把serviceController和podController中的信息加入到了endpointController的queue中


    以下我们看真正的处理work,这个是在func (e *EndpointController) Run(workers int, stopCh <-chan struct{}) 开启的


     继续跟踪处理











    至此所有的处理流程都完毕了

     


    五、总结

    整个流程为一个生产者与消费者模型

     

    endpoint初始化了两个Controller(serviceController,podController)

    然后这两个Controller通过listwatcher,通过kubeClient訪问apiserver

    获取到service和pod信息。然后将信息通过framework.controller的处理接口将信息上传到

    endpointController中,然后endpointController中的work进行处理,然后又通过kubeClient将信息通过apiserver进行更新



     



     

    龚浩华

    qq 月牙寂 29185807

    2016年3月30日


     
     (版权声明:本文为作者原创。如需转载请通知本人。并标明出处和作者。擅自转载的。保留追究其侵权的权利。)
  • 相关阅读:
    linux下使用g++编译cpp工程
    c++字符串互相转换
    MFC双缓冲绘图实例
    Python进阶之迭代器和生成器
    <大话设计模式>笔记
    配置程序成为Linux服务
    Django的设计模式
    Django ModelForm修改默认的控件属性
    Android活动生命周期
    MySQL必知必会笔记
  • 原文地址:https://www.cnblogs.com/llguanli/p/8377050.html
Copyright © 2011-2022 走看看