讲解
DaemonSet 的语义一句话:保证每个(或选定的)节点上恰好跑一个 Pod 副本。它不管「要几个副本」,副本数由节点数决定——加一台节点自动多一个,删一台自动少一个。这个语义正好匹配「节点级代理」类负载:日志采集(Fluent Bit)、监控 agent(Node Exporter)、网络插件(Calico 的节点组件)、存储插件——每台机器都需要一份,且只需要一份。
清单结构和 Deployment 几乎一样(有 selector 和 template,没有 replicas),调度逻辑却完全不同:普通 Pod 由调度器挑节点,DaemonSet 的 Pod 直接绑定节点。两个配套字段控制「铺在哪些节点上」:nodeSelector/nodeAffinity 限定节点范围(比如只铺在打了 GPU 标签的机器上);tolerations(容忍)决定能否铺到有「污点」(taint)的节点——最典型的就是控制平面节点自带的 node-role.kubernetes.io/control-plane:NoSchedule 污点,不容忍它,单节点集群(比如我们的 kind 集群)里 DaemonSet 一个 Pod 都起不来。
更新策略默认 RollingUpdate(逐节点滚动),还有个 OnDelete(删 Pod 才更新,适合谨慎的系统组件)。日常运维命令和 Deployment 一致:get ds 看 DESIRED/CURRENT(期望数 = 匹配节点数)、rollout status/history 管更新。判断标准同样简单:「每个节点一份」的节点级服务用 DaemonSet;「要 N 个副本、放哪随意」用 Deployment;「实例有身份」用 StatefulSet——三个控制器的分工至此完整。
示例
一个节点守护 agent(busybox 模拟日志采集器)。注意 tolerations——它容忍控制平面污点,单节点集群里才能跑起来:
# wait: ds/ohmydocs-verify-agent
apiVersion: apps/v1
kind: DaemonSet
metadata:
name: ohmydocs-verify-agent
spec:
selector:
matchLabels:
app: ohmydocs-verify-agent
template:
metadata:
labels:
app: ohmydocs-verify-agent
spec:
tolerations:
- key: node-role.kubernetes.io/control-plane
effect: NoSchedule
containers:
- name: agent
image: busybox:1.36
command:
- sh
- -c
- |
echo "agent 已在节点 $(hostname) 上启动"
sleep infinity
DESIRED 等于节点数(kind 单节点集群就是 1),Pod 落在节点上:
kubectl get daemonset ohmydocs-verify-agent
kubectl get pods -l app=ohmydocs-verify-agent -o wide
kubectl logs ds/ohmydocs-verify-agent
对照感受一下「节点数决定副本数」——当前节点清单与 DaemonSet 的期望数:
kubectl get nodes --no-headers | wc -l
kubectl get ds ohmydocs-verify-agent -o jsonpath='期望副本数(=节点数): {.status.desiredNumberScheduled}'
echo
常见坑
- 控制平面节点上没有 Pod:没加容忍控制平面污点的 toleration;单节点测试集群里表现为 DaemonSet 永远 0/1。
- 当成「精确 N 副本」用:DaemonSet 的副本数跟着节点走,想固定 3 个副本请用 Deployment。
- 滚动更新把节点 agent 搞挂:节点级组件更新失败影响面是全节点,生产上常用 OnDelete 策略逐个手动确认。
- resource 没设 limit 的 agent:日志/监控 agent 是每台节点的基础设施,一旦失控吃光节点资源会连累所有业务 Pod——requests/limits 必须给。
小结
DaemonSet = 每个匹配节点恰好一个 Pod,靠 nodeSelector 选节点、靠 tolerations 过污点;日志/监控/网络类节点代理的标准载体。三大工作负载控制器(Deployment/StatefulSet/DaemonSet)到此齐活,下一章让副本数自己动起来:HPA 自动伸缩。