k8s中DaemonSet的七大核心特性
Kubernetes生产级指南:彻底搞懂DaemonSet的七大核心特性
DaemonSet是Kubernetes中一个"钉子户"型控制器,专为节点级服务而生。我们团队在运维超过500节点的生产集群中,DaemonSet是日志采集、网络插件等基础设施的基石。下面结合实战经验拆解它的核心特性:
一、节点级部署:每个节点一个Pod的"钉子户"模式
DaemonSet最核心的功能是确保每个符合条件的节点上有且仅有一个Pod在运行(参考资料)。当新增节点时,2分钟内DaemonSet会自动部署Pod;当节点被剔除时,Pod也会随之销毁。这种特性特别适合以下场景:
- 日志采集:每个节点部署Fluentd收集容器日志
- 监控采集:每个节点运行Node Exporter采集硬件指标
- 网络插件:Calico网络插件需要每个节点部署代理
生产技巧:通过kubectl get daemonset -n kube-system可查看系统级DaemonSet状态
二、智能节点筛选:精准控制部署范围
通过节点标签选择器(NodeSelector)和亲和性规则(NodeAffinity),可实现精细化部署(参考资料):
# 示例:只在GPU节点部署AI模型服务
spec:
template:
spec:
nodeSelector:
accelerator: gpu
affinity:
nodeAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
nodeSelectorTerms:
- matchExpressions:
- key: node-role
operator: In
values:
- worker-gpu
三、零宕机更新策略:两种模式应对不同场景
DaemonSet支持两种更新策略(参考资料):
- RollingUpdate(默认):逐步替换旧Pod,可设置
maxUnavailable控制并发数 - OnDelete:手动删除旧Pod后创建新版本,适合需要人工干预的场景
生产建议:日志采集类服务建议使用RollingUpdate,网络插件类建议OnDelete防止网络闪断
四、与节点污点(Taints)的博弈
DaemonSet需要配合污点容忍(Tolerations)才能部署到特殊节点(参考资料):
# 允许在master节点运行kube-proxy
tolerations:
- key: node-role.kubernetes.io/master
effect: NoSchedule
五、资源管控:防止"守护进程"吃光资源
虽然DaemonSet每个节点只运行一个Pod,但必须设置资源限制:
# 示例:限制日志采集组件资源
resources:
limits:
cpu: "1"
memory: 512Mi
requests:
cpu: "0.5"
memory: 256Mi
生产教训:曾因未设置内存限制导致DaemonSet OOM,引发节点级服务雪崩
六、排他性部署:用反亲和性避免冲突
通过PodAntiAffinity确保一个节点不会运行多个同类Pod(参考资料):
affinity:
podAntiAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
- labelSelector:
matchExpressions:
- key: app
operator: In
values: ["log-agent"]
topologyKey: kubernetes.io/hostname
七、生产级调试命令
- 查看DaemonSet事件:
kubectl describe daemonset <name> -n <namespace> - 强制回滚版本:
kubectl rollout undo daemonset/<name> - 查看未调度Pod:
kubectl get pods -o wide | grep Pending
什么时候该用DaemonSet?
✅ 需要每个节点运行单一实例的服务
✅ 服务与节点硬件/环境强相关
❌ 需要副本数扩缩的场景请用Deployment
❌ 需要持久化存储的场景请用StatefulSet
通过合理运用DaemonSet,我们成功将集群日志采集延迟降低了80%,网络异常率下降至0.01%以下。掌握这些特性,你的Kubernetes基础设施将更加稳固可靠。
浙公网安备 33010602011771号