说明:此文章为腾讯云机器自动从本人csdn博客搬迁过来。是本人授权操作。
申明:无本人授权,不可转载本文。如有转载,本人保留追究其法律责任的权利。
龚浩华,QQ 29185807,月牙寂 道长
第一时间获取文章,可以关注本人公众号 月牙寂道长 yueyajidaozhang
代码在k8s.io\kubernetes\cmd\kube-controller-manager\controller-manager.go main函数路口
代码k8s.io\kubernetes\cmd\kube-controller-manager\app\controllermanager.go Run函数
构建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函数
三、serviceController与podController工作流程
代码在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
代码在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中,代码在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进行更新