【原创】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函数
三、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
下层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日
(版权声明:本文为作者原创。如需转载请通知本人。并标明出处和作者。擅自转载的。保留追究其侵权的权利。)
|
最新文章
- Redis系列(四)-低成本高可用方案设计
- MySQL数据库优化的八种方式(经典必看)
- XML学习笔记(二)-- DTD格式规范
- SQL2008R2日志传送需要注意点
- maven创建web项目
- java定时任务接口ScheduledExecutorService
- SQL中 patindex函数的用法
- linux内核交互,设备驱动控制管理接口
- 简单谈谈js中的MVC
- 响应式布局 —— Demo
- 第十四节,OpenCV学习(三)图像的阈值分割
- For each...in / For...in / For...of 的解释与例子
- Envoy 源码分析--event
- python学习博客地址集合。。。
- VP9 vs H.265——下一代视频编码标准的王道之争
- 关于Jedis是否线程安全的测试
- Shooting Contest 射击比赛 [POJ1719] [CEOI1997] [一题多解]
- centos7升级内核
- Vue项目打包常见问题整理
- 洛谷P3302 森林