【原创】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日
(版权声明:本文为作者原创。如需转载请通知本人。并标明出处和作者。擅自转载的。保留追究其侵权的权利。)
|
【原创】k8s源代码分析-----EndpointController的更多相关文章
- 【原创】k8s源代码分析-----kubelet(1)主要流程
本人空间链接http://user.qzone.qq.com/29185807/blog/1460015727 源代码为k8s v1.1.1稳定版本号 kubelet代码比較复杂.主要是由于其担负的任 ...
- 【原创】k8s源代码分析-----kubelet(8)pod管理
本文QQ空间链接:http://user.qzone.qq.com/29185807/blog/1460540474 本文csdn博客链接:http://blog.csdn.net/screscent ...
- 服务器程序源代码分析之三:gunicorn
服务器程序源代码分析之三:gunicorn 时间:2014-05-09 11:33:54 类别:网站架构 访问: 641 次 gunicorn是一个python web 服务部署工具,类似flup,完 ...
- Spark SQL 源代码分析之 In-Memory Columnar Storage 之 in-memory query
/** Spark SQL源代码分析系列文章*/ 前面讲到了Spark SQL In-Memory Columnar Storage的存储结构是基于列存储的. 那么基于以上存储结构,我们查询cache ...
- Spark SQL Catalyst源代码分析之TreeNode Library
/** Spark SQL源代码分析系列文章*/ 前几篇文章介绍了Spark SQL的Catalyst的核心执行流程.SqlParser,和Analyzer,本来打算直接写Optimizer的,可是发 ...
- Spark SQL Catalyst源代码分析Optimizer
/** Spark SQL源代码分析系列*/ 前几篇文章介绍了Spark SQL的Catalyst的核心运行流程.SqlParser,和Analyzer 以及核心类库TreeNode,本文将具体解说S ...
- Robotium原则的实施源代码分析
从前面的章节<Robotium源代码分析之Instrumentation进阶>中我们了解到了Robotium所基于的Instrumentation的一些进阶基础.比方它注入事件的原理等,但 ...
- Akka FSM 源代码分析
Akka FSM 源代码分析 萧猛 <simonxiao@qq.com> 啰嗦几句 有限状态机本身不是啥新奇东西,在GoF的设计模式一书中就有状态模式, 也给出了实现的建议.各种语言对状态 ...
- Spark SQL 源代码分析系列
从决定写Spark SQL文章的源代码分析,到现在一个月的时间,一个又一个几乎相同的结束很快,在这里也做了一个综合指数,方便阅读,下面是读取顺序 :) 第一章 Spark SQL源代码分析之核心流程 ...
随机推荐
- shell单引号屏蔽变量方法
[goforit ~]$ name="玖零後大叔" [goforit~]$ echo $name 玖零後大叔 [goforit ~]$ echo "$name" ...
- 【问题:SSH】win10使用SSH链接服务器时,提示:Host key verification failed
异常原因:当前连接新建的验证信息与之前保存的验证信息不一致,将原来的验证信息删除就可以了. 1 使用以下命令,清空之前缓存的信息.或者直接打开C:\Users\Nolan\.ssh\known_hos ...
- zico源代码分析(一) 数据接收和存储部分
zorka和zico的代码地址:https://github.com/jitlogic 由于zico是zorka的collecter端,所以在介绍zico之前首先说一下zorka和数据结构化存储和传输 ...
- 129.C++面试一百题(1-51)
- 利用Eventlog Analyzer分析日志
利用EventlogAnalyzer分析日志 ManageEngineEventLogAnalyzer是一个基于Web技术.实时的事件监控管理解决方案,能够提高企业网络安全.减少工作站和服务器的宕机事 ...
- Atcoder ABC 069 C - 4-adjacent D - Grid Coloring
C - 4-adjacent Time limit : 2sec / Memory limit : 256MB Score : 400 points Problem Statement We have ...
- CentOS桥接网卡配置
网桥方式配置步骤 1.增加网桥设备br0 vi /etc/sysconfig/network-scripts/ifcfg-br0 DEVICE=br0 ONBOOT=yes TYPE=Bridge B ...
- 比JLRoutes更强大更好用的iOS开源路由框架—FFRouter
目前iOS常用路由框架是JLRouter.HHRouter.MGJRouter. 但是这些路由库都各有不足,首先是JLRouter,用不到的功能繁多,而且基于遍历查找URL,效率低下.HHRouter ...
- 五十个UI设计资源网站
五十个UI设计资源网站 用户体验团队网站 1.UCD大社区 http://ucdchina.com/ 2.腾讯WSD http://wsd.tencent.com/ 3.腾讯CDC http://cd ...
- 洛谷 P1244 青蛙过河
P1244 青蛙过河 题目描述 有一条河,左边一个石墩(A区)上有编号为1,2,3,4,…,n的n只青蛙,河中有k个荷叶(C区),还有h个石墩(D区),右边有一个石墩(B区),如下图所示.n只青蛙要过 ...