DaemonSet 应用


DaemonSet 是能够保证每个或部分节点只运行一个 Pod 副本的控制器,当有节点加入集群的时候,会自动创建对应的 Pod,同时如果有节点从集群中移除,则会回收对应的 Pod

典型应用

  1. 每个节点上运行的集群守护进程
  2. 每个节点上运行的日志收集进程
  3. 每个节点的监控守护进程,如 prometheus

即为每种类型的守护进程在所有节点上都启动一个 DaemonSet。或者为同一种守护进程部署多个 DaemonSet,每个具有不同的标识来区分不同类型资源的守护进程

如何调度 DaemonSet 控制的 Pods

通过spec.affinity.nodeAffinity来匹配目标 node,有以下 2 种

  1. requiredDuringSchedulingIgnoredDuringExecution 强制要求必须满足条件
  2. preferredDuringSchedulingIgnoredDuringExecution 提供一种优先选择的条件,如果不满足也可以被调度到对应的节点

Taints and tolerations Effect 说明

  1. NoExecute
  2. NoSchedule

Daemon Pod 通信

与 DaemonSet 中 Pod 通信模式:

  1. Push
  2. NodeIP 和已知端口,如 hostPort
  3. DNS
  4. Service

更新 DaemonSet

如果节点的标签被修改,DaemonSet 将立刻向新匹配上的节点添加 Pod,同时删除不匹配的节点上运行的 Pod。可以修改 DaemonSet 创建的 Pod,但不是 Pod 所有的字段都可以修改,如果没有修改,当下次有新节点加入集群的时候,该节点的 Pod 会使用 DaemonSet 初始化时用的模版。

替代方案

  1. init 脚本,也就是 linux 系统守护进程
  2. bare Pod,直接创建 Pod,这样就会失去高可用特性
  3. static Pod,通过在一个指定的、受 kubelet 监视的目录下编写文件来创建 Pod,将来可能会被废弃
  4. Deployment,这是最常用的方式