k8s源码分析-----EndpointController

说明:此文章为腾讯云机器自动从本人csdn博客搬迁过来。是本人授权操作。

申明:无本人授权,不可转载本文。如有转载,本人保留追究其法律责任的权利。

龚浩华,QQ 29185807,月牙寂 道长

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

一、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进行更新

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

编辑于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏云计算教程系列

如何在CentOS 7上配置Nginx以使用自定义错误页面

Nginx是一款高性能的Web服务器,能够以灵活性和强大的功能提供内容。在设计网页时,自定义用户将看到的每条内容通常很有帮助。这包括他们请求不可用内容时的错误页...

1120
来自专栏云计算教程系列

如何在Ubuntu 14.04上配置Nginx以使用自定义错误页面

Nginx是一款高性能的Web服务器,能够以灵活性和强大的功能提供内容。在设计网页时,自定义用户将看到的每条内容通常很有帮助。这包括他们请求不可用内容时的错误页...

480
来自专栏Java成神之路

Idea_学习_09_Idea 方法自动生成参数默认名

生成方法后,还空着参数,可以使用 ctrl + alt + 空格 ,列出参数,然后选择参数即可。

1094
来自专栏郭耀华‘s Blog

linux下安装git提示”无法打开锁文件 /var/lib/dpkg/lock - open (13: 权限不够)“

如图所示,输入命令:apt-get install git后提示权限不够 解决方法,在命令前加 sudo即可 sudo apt-get install git ...

4016
来自专栏耕耘实录

systemd-journald日志持久化的操作方法

版权声明:本文为耕耘实录原创文章,各大自媒体平台同步更新。欢迎转载,转载请注明出处,谢谢

1273
来自专栏大壮

iOS GCD定时器

2573
来自专栏吴伟祥

Redis实现消息队列 转

打开浏览器,输入地址,按下回车,打开了页面。于是一个HTTP请求(request)就由客户端发送到服务器,服务器处理请求,返回响应(response)内容。

1831
来自专栏前端小叙

win10系统下cmd输入一下安装的软件命令提示拒绝访问解决办法

问题:win10系统安装了nvm,cmd命令提示不是内部或外部命令 解决:卸载nvm,重新安装,再一次输入nvm,发现正常显示: ? 问题:win10安装了nv...

3974
来自专栏Java后端技术

使用Maven的assembly插件实现自定义打包

  最近我们项目越来越多了,然后我就在想如何才能把基础服务的打包方式统一起来,并且可以实现按照我们的要求来生成,通过研究,我们通过使用maven的assembl...

1102
来自专栏bboysoul

什么是EOF

EOF的意思是End Of File是文件尾的标志。在数值上来说就是-1。 当在文件操作的时候,碰到文件结束,或者数据读取错误是均会返回EOF。 在linu...

942

扫码关注云+社区