kubernetes daemonset基础原理

1)概述

代理性质的进程需要在每一个节点上,或多个节点上运行,此时可以使用kuberntes daemonset来实现。在实际中,一般会将日志采集的代理、网络插件通过daemonset方式及进行部署。

2)大致原理

daemonset的控制器会监听kuberntes的daemonset对象、pod对象、node对象,这些被监听的对象之变动,就会触发syncLoop循环让kubernetes集群朝着daemonset对象描述的状态进行演进。

3)细节实现

控制器每一次syncLoop都会进行下面5步操作

1)获取当前状态的map: 这个map描述着坐落到每一个节点的daemonset pod
nodename --> [daemonPod 1, daemonPod 2 …]

2)遍历每一个node:
podsShouldBeOnNode(node, map, ds) --> 得到两个列表(具体过程会受调度器的预选算法影响):
a、一个node name列表(不为空,则表示该node需要新建一个pod)
b、该node上待删除的pod列表。

3)pod数量一致性:实际创建Pod和删除pod:
把node name列表汇总,待删除pod列表汇总,最后将这两者输入到一个方法来实际调用apiserver接口创建pod和删除pod即可,这样就达到期望状态。

4)pod版本一致性:
调用rollingUpdate(),本质还是通过删除部分Running状态pod和非Running状态的pod来实现更新

5)更新daemonset对象的status字段

4)重点方法

                                |-> dsc.getNodesToDaemonPods()  //获取当前状态
                                |
                                |
                  |-> manage -->|-> dsc.podsShouldBeOnNode() --> dsc.nodeShouldRunDaemonPod	//汇总需要创建的pod和待删除的Pod
                  |             |
                  |             |
syncDaemonSet --> |             |-> dsc.syncNodes  //Pod数量一致性
                  |
                  |-> rollingUpdate  //Pod版本一致性
                  |
                  |
                  |-> updateDaemonSetStatus  //更新daemonset对象的status字段

5)参考

  1. https://www.jianshu.com/u/a004b422adae

猜你喜欢

转载自blog.csdn.net/nangonghen/article/details/103640299