博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【原创】k8s源码分析-----EndpointController
阅读量:4033 次
发布时间:2019-05-24

本文共 3172 字,大约阅读时间需要 10 分钟。

 

转自本人空间 

一、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日

 

 

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

如果你觉得本文对你有帮助,可以转到你的朋友圈,让更多人一起学习。

第一时间获取文章,可以关注本人公众号:月牙寂道长,也可以扫码关注

 

你可能感兴趣的文章
绘图和可视化(pandas)
查看>>
绘图和可视化(seaborn)
查看>>
Vim日常使用
查看>>
计算机网络第一记:网络核心
查看>>
信息检索:基于知识图谱和深度学习的文本表示和搜索(Explicit and distributed semantics for text representation and retrieval)
查看>>
计算机网络第二记:协议层次
查看>>
计算机网络第三记:网络安全
查看>>
深度学习训练中如何处理NaNs
查看>>
机器学习与其他相似概念
查看>>
深度学习库提供了什么?
查看>>
Theano中如何只更新一部分权重,用法及理由。
查看>>
深度学习实践
查看>>
机器学习探索性数据分析的数据类型
查看>>
机器学习探索性数据分析的数据类型(补充)
查看>>
机器学习中典型工作流程
查看>>
数据挖掘十大算法 and 算法概述
查看>>
机器学习中样本数据预处理
查看>>
机器学习中样本缺失值的处理方法
查看>>
机器学习中样本比例不平衡的处理方法
查看>>
机器学习中的文本处理
查看>>