DaemonSet 应用
DaemonSet 是能够保证每个或部分节点只运行一个 Pod 副本的控制器,当有节点加入集群的时候,会自动创建对应的 Pod,同时如果有节点从集群中移除,则会回收对应的 Pod
典型应用
- 每个节点上运行的集群守护进程
- 每个节点上运行的日志收集进程
- 每个节点的监控守护进程,如 prometheus
即为每种类型的守护进程在所有节点上都启动一个 DaemonSet。或者为同一种守护进程部署多个 DaemonSet,每个具有不同的标识来区分不同类型资源的守护进程
如何调度 DaemonSet 控制的 Pods
通过spec.affinity.nodeAffinity
来匹配目标 node,有以下 2 种
requiredDuringSchedulingIgnoredDuringExecution
强制要求必须满足条件preferredDuringSchedulingIgnoredDuringExecution
提供一种优先选择的条件,如果不满足也可以被调度到对应的节点
Taints and tolerations Effect 说明
NoExecute
NoSchedule
Daemon Pod 通信
与 DaemonSet 中 Pod 通信模式:
Push
- NodeIP 和已知端口,如 hostPort
- DNS
Service
更新 DaemonSet
如果节点的标签被修改,DaemonSet 将立刻向新匹配上的节点添加 Pod,同时删除不匹配的节点上运行的 Pod。可以修改 DaemonSet 创建的 Pod,但不是 Pod 所有的字段都可以修改,如果没有修改,当下次有新节点加入集群的时候,该节点的 Pod 会使用 DaemonSet 初始化时用的模版。
替代方案
- init 脚本,也就是 linux 系统守护进程
- bare Pod,直接创建 Pod,这样就会失去高可用特性
- static Pod,通过在一个指定的、受 kubelet 监视的目录下编写文件来创建 Pod,将来可能会被废弃
- Deployment,这是最常用的方式