daemonset确保每个符合条件节点运行且仅运行一个pod:通过监听node事件自动响应节点增删,依赖nodeselector/tolerations精准控制部署范围,维持pod唯一性与自愈能力,并支持滚动更新保持版本一致。

Kubernetes 中 DaemonSet 通过控制器持续感知节点状态、按需创建 Pod 并严格匹配调度规则,来确保每个符合条件的节点上都运行且仅运行一个 Pod 实例。
自动响应节点生命周期变化
DaemonSet 控制器监听 API Server 的 Node 资源事件(如 Added、Deleted),一旦有新节点加入集群(例如 kubelet 注册成功并创建 Node 对象),控制器立即触发协调循环(reconcile):
- 检查该节点是否满足 DaemonSet 的节点选择条件(如 nodeSelector、nodeAffinity、Tolerations)
- 若匹配,就基于 Pod 模板生成一个新 Pod,并提交到 API Server
- 若节点被移除或标记为不可调度(如 cordoned),控制器会自动清理其上的对应 Pod
精准控制部署范围:节点选择机制
DaemonSet 不默认在所有节点上运行,而是依赖显式配置决定“哪些节点”需要部署:
-
不设 nodeSelector 或亲和性规则时:Pod 会尝试调度到所有 Ready 状态的节点(包括 master 节点,除非其带有
node-role.kubernetes.io/control-plane:NoSchedule等污点) -
配置 nodeSelector:只在带指定标签的节点上部署,例如
ssd: "true";若节点无此标签,就不会创建 Pod - 配合 tolerations:允许 Pod 忽略某些污点(taints),从而能在被污染的节点(如 GPU 节点、专用系统节点)上运行
保障 Pod 唯一性与自愈能力
DaemonSet 的设计目标是“每个匹配节点一个 Pod”,它通过以下方式维持这一状态:
- 控制器定期扫描所有节点,对比当前运行的 Pod 数量与预期(应为 0 或 1)
- 若发现某匹配节点上无 Pod,立即创建;若发现有多个,会终止多余副本(极少发生,通常因手动干预或异常残留)
- 当节点重启或 kubelet 异常恢复后,Pod 若消失,DaemonSet 会检测到并重建,无需人工介入
滚动更新与版本一致性
更新 DaemonSet 的 Pod 模板(如镜像版本、环境变量)时,Kubernetes 默认执行滚动更新:
- 逐个替换旧 Pod,确保任意时刻每个节点最多只有一个该 DaemonSet 的 Pod 运行
- 支持
updateStrategy.type: RollingUpdate及参数(如maxUnavailable)精细控制更新节奏 - 更新完成后,所有匹配节点上的 Pod 自动升级为新版本,保持配置统一











