【原创】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日


 
 (版权声明:本文为作者原创。如需转载请通知本人。并标明出处和作者。擅自转载的。保留追究其侵权的权利。)
【推广】 免费学中医,健康全家人
原文地址:https://www.cnblogs.com/llguanli/p/8377050.html