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 条评论
登录 后参与评论

相关文章

来自专栏嵌入式程序猿

带你走进飞思卡尔Flashloader(3)

学习完协议篇,今天我们来学习飞思卡尔Flashloader之命令API。 获取属性命令 获取属性命令用来查询Flashloader的各种属性和设置,每一个支...

2697
来自专栏Flutter入门到实战

快速在线制作json接口,从此写项目引入接口就简单多了

901
来自专栏Kubernetes

docker v1.11 源码重构分析

基于docker v1.12的源代码,对docker engine v1.11中重构后的源码结构进行分析,涵盖dockerd, containerd, cont...

3878
来自专栏乐百川的学习频道

Java学习笔记 调用外部程序

在Java中可以调用外部程序,这需要通过Process等类来实现。 创建进程 先来介绍一下Process的创建,我们需要使用ProcessBuilder类。如果...

1857
来自专栏从零开始的linux

文件查找

文件查找:locate, find 实时查找:遍历所有文件进行条件匹配 非实时查找:根据索引查找 locate...

2668
来自专栏java 成神之路

jvm 性能调优工具之 jmap

36612
来自专栏娱乐心理测试

实现简单的python爬虫功能

2126
来自专栏天天

跨域问题

843
来自专栏前端说吧

vuex - 项目结构目录及一些简单配置

3486
来自专栏coder修行路

Python爬虫从入门到放弃(十七)之 Scrapy框架中Download Middleware用法

这篇文章中写了常用的下载中间件的用法和例子。 Downloader Middleware处理的过程主要在调度器发送requests请求的时候以及网页将respo...

3218

扫码关注云+社区