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)参考
- https://www.jianshu.com/u/a004b422adae