转自本人空间 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日

 

 (版权声明:本文为作者原创。如需转载请通知本人。并标明出处和作者。擅自转载的。保留追究其侵权的权利。)

【原创】k8s源代码分析-----EndpointController的更多相关文章

  1. 【原创】k8s源代码分析-----kubelet(1)主要流程

    本人空间链接http://user.qzone.qq.com/29185807/blog/1460015727 源代码为k8s v1.1.1稳定版本号 kubelet代码比較复杂.主要是由于其担负的任 ...

  2. 【原创】k8s源代码分析-----kubelet(8)pod管理

    本文QQ空间链接:http://user.qzone.qq.com/29185807/blog/1460540474 本文csdn博客链接:http://blog.csdn.net/screscent ...

  3. 服务器程序源代码分析之三:gunicorn

    服务器程序源代码分析之三:gunicorn 时间:2014-05-09 11:33:54 类别:网站架构 访问: 641 次 gunicorn是一个python web 服务部署工具,类似flup,完 ...

  4. Spark SQL 源代码分析之 In-Memory Columnar Storage 之 in-memory query

    /** Spark SQL源代码分析系列文章*/ 前面讲到了Spark SQL In-Memory Columnar Storage的存储结构是基于列存储的. 那么基于以上存储结构,我们查询cache ...

  5. Spark SQL Catalyst源代码分析之TreeNode Library

    /** Spark SQL源代码分析系列文章*/ 前几篇文章介绍了Spark SQL的Catalyst的核心执行流程.SqlParser,和Analyzer,本来打算直接写Optimizer的,可是发 ...

  6. Spark SQL Catalyst源代码分析Optimizer

    /** Spark SQL源代码分析系列*/ 前几篇文章介绍了Spark SQL的Catalyst的核心运行流程.SqlParser,和Analyzer 以及核心类库TreeNode,本文将具体解说S ...

  7. Robotium原则的实施源代码分析

    从前面的章节<Robotium源代码分析之Instrumentation进阶>中我们了解到了Robotium所基于的Instrumentation的一些进阶基础.比方它注入事件的原理等,但 ...

  8. Akka FSM 源代码分析

    Akka FSM 源代码分析 萧猛 <simonxiao@qq.com> 啰嗦几句 有限状态机本身不是啥新奇东西,在GoF的设计模式一书中就有状态模式, 也给出了实现的建议.各种语言对状态 ...

  9. Spark SQL 源代码分析系列

    从决定写Spark SQL文章的源代码分析,到现在一个月的时间,一个又一个几乎相同的结束很快,在这里也做了一个综合指数,方便阅读,下面是读取顺序 :) 第一章 Spark SQL源代码分析之核心流程 ...

随机推荐

  1. dd---复制文件并对原文件的内容进行转换和格式化处理

    dd命令用于复制文件并对原文件的内容进行转换和格式化处理.dd命令功能很强大的,对于一些比较底层的问题,使用dd命令往往可以得到出人意料的效果.用的比较多的还是用dd来备份裸设备.但是不推荐,如果需要 ...

  2. 安装虚拟机(VM)(一)

    原创作品,允许转载,转载时请务必声明作者信息和本声明.  https://www.cnblogs.com/zhu520/p/10728248.html 本人小白,有错指出.谢谢! 一:安装虚拟机前奏 ...

  3. 移动端开发ios和安卓兼容问题

    移动端开发ios和安卓兼容问题 最近做移动端混合开的时候遇到一些安卓和iOS的兼容性问题,兼容想问题不仅在浏览器存在也在APP开发当中也会经常遇到这样的情况. 最近看了一下内容很不错的移动端开发相关的 ...

  4. Spring Cloud学习笔记【四】断路器Hystrix

    雪崩效应 在微服务架构中通常会有多个服务层调用,基础服务的故障可能会导致级联故障,进而造成整个系统不可用的情况,这种现象被称为服务雪崩效应.服务雪崩效应是一种因 “服务提供者” 的不可用导致 “服务消 ...

  5. C#做的CPU内存使用率

    using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; usin ...

  6. 千千万万的IT开发project师路在何方

    已经找不到该文章的最初出处了,有找到的人请告诉我.谢谢~~ 千千万万的IT开发project师路在何方 2007-06-25 21:41 恭喜,你选择开发project师作为自已的职业! 悲哀.你选择 ...

  7. Scala具体解释---------Scala是什么?可伸展的语言!

    Scala是什么 Scala语言的名称来自于"可伸展的语言". 之所以这样命名,是由于他被设计成随着使用者的需求而成长.你能够把Scala应用在非常大范围的编程任务上.从写个小脚本 ...

  8. 8. java操作mongodb——查询数据

    转自:https://www.cnblogs.com/adjk/p/6430074.html 通过find方法查询集合中的文档信息 ---------------------------------- ...

  9. phpMyAdmin出现找不到mysql扩展和Cannot log in to the MySQL server问题

    环境:Centos6.5,Apache2.4, PHP5.5, MySql5.6. phpMyAdmin版本:https://files.phpmyadmin.net/phpMyAdmin/4.4.1 ...

  10. BZOJ 4144 Dijkstra+Kruskal+倍增LCA

    思路: 先把所有的加油站 push进按weight排序的优先队列里 对于每个不是加油站的点 找到到它的点的最短路以及它来源的加油站 如果x和y有边 且x和y加油站的来源不一样 则它可以连边 跑一边Kr ...