【原创】k8s源代码分析-----EndpointController




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

一、controller manager创建endpointController


代码在k8s.io\kubernetes\cmd\kube-controller-manager\controller-manager.go main函数路口



代码k8s.io\kubernetes\cmd\kube-controller-manager\app\controllermanager.go Run函数


构建endpointcontroller

 


二、endpointcontroller初始化

EndpointController结构体

代码k8s.io\kubernetes\pkg\controller\endpoint\endpoints_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.io\kubernetes\pkg\controller\endpoint\endpoints_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.io\kubernetes\pkg\controller\framework\ controller.go



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


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

       其传入的keyfunc为代码在k8s.io\kubernetes\pkg\controller\framework\ controller.go


代码在k8s.io\kubernetes\pkg\client\cache\delta.go



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


3、NewDeltaFIFO中传入的keyfunc

       代码在k8s.io\kubernetes\pkg\client\cache\store.go


我们回到工作流程中 代码k8s.io\kubernetes\pkg\controller\framework\ controller.go


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

 

下层reflector工作流程

代码在k8s.io\kubernetes\pkg\client\cache\reflector.go






入口ListAndWatch

 

我们看看list返回的是什么


我们以service的list为例

代码在k8s.io\kubernetes\pkg\client\unversioned\ services.go


代码在k8s.io\kubernetes\pkg\api\typess.go


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



再插入下fifo的处理

代码在k8s.io\kubernetes\pkg\client\cache\fifo.go


 


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

我们继续ListAndWatch

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



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

代码在k8s.io\kubernetes\pkg\client\unversioned\ services.go


代码在k8s.io\kubernetes\pkg\watch\watch.go

 

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

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







 


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


 

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

以上便是reflector的工作流程

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

 

Controller的工作流程

我们回到Controller中,代码在k8s.io\kubernetes\pkg\controller\framework\controller.go




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


下图代码在k8s.io\kubernetes\pkg\client\cache\fifo.go


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




四、endpointController工作流程

 

我们再回到之前初始化时候注冊的接口,代码在k8s.io\kubernetes\pkg\controller\endpoint\ 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日


 
 (版权声明:本文为作者原创。如需转载请通知本人。并标明出处和作者。擅自转载的。保留追究其侵权的权利。)
posted @ 2018-01-29 14:12  llguanli  阅读(522)  评论(0编辑  收藏  举报