在Kubernetes中,DaemonSet 是一种特殊的控制器,用于确保在集群中的每个节点(或特定标签的节点)上自动运行且仅运行一个副本的Pod。这种设计使其适用于系统级组件或基础设施服务,具有以下核心作用:
1. 运行集群基础设施组件
DaemonSet最常见的用途是部署必须在每个节点上运行的系统组件,例如:
- 网络插件:如Flannel、Calico、Weave Net等,负责节点间的Pod网络通信。
- 存储插件:如GlusterFS、Ceph等的客户端,为节点提供存储卷挂载能力。
- 节点监控:如Prometheus Node Exporter(收集节点指标)、ELK Filebeat(收集节点日志)。
- 安全组件:如Falco(容器运行时安全监控)、反病毒软件等。
示例:Kubernetes官方网络插件Flannel通过DaemonSet部署,确保每个节点都有网络代理:
apiVersion: apps/v1
kind: DaemonSet
metadata:
name: kube-flannel-ds
spec:
selector:
matchLabels:
app: flannel
template:
spec:
hostNetwork: true # 直接使用节点网络
containers:
- name: kube-flannel
image: quay.io/coreos/flannel:v0.15.1
2. 自动节点扩展与收缩
当集群添加新节点时,DaemonSet会自动在新节点上部署Pod;当节点被移除时,对应的Pod也会自动清理。这种特性使基础设施服务能与集群规模动态匹配,无需人工干预。
3. 资源隔离与优化
通过DaemonSet部署的组件通常需要访问节点的底层资源(如网络栈、文件系统),可通过以下方式实现:
- hostNetwork:直接使用节点网络(如Flannel)。
- hostPID/hostIPC:访问节点的进程空间或IPC(如某些监控工具)。
- hostPath挂载:读写节点文件系统(如日志收集器)。
示例:Node Exporter通过挂载节点文件系统收集硬件和系统指标:
volumes:
- name: proc
hostPath:
path: /proc
- name: sys
hostPath:
path: /sys
4. 节点级别的系统服务
某些服务需要在每个节点上独立运行,例如:
- 节点级别负载均衡:如MetalLB(裸机环境的负载均衡器)。
- 节点自动修复:如Node Problem Detector(检测节点硬件/系统问题)。
- 节点预热:如缓存预热工具,在应用部署前提前加载数据到节点。
5. 与其他控制器的对比
控制器类型 | 部署模式 | 适用场景 |
DaemonSet | 每个节点(或匹配标签的节点)1个副本 | 系统组件、网络/存储插件、监控 |
Deployment | 副本数由用户指定,分散在集群中 | 无状态应用(如Web服务器) |
StatefulSet | 固定ID、有序部署、持久化存储 | 有状态应用(如数据库) |
Job/CronJob | 一次性或定时任务,完成后退出 | 批处理任务、定时任务 |
总结
DaemonSet的核心价值在于自动化节点级别的服务部署,确保关键组件与集群节点生命周期同步。通过合理使用DaemonSet,可大幅降低集群运维成本,提升基础设施的可靠性和可扩展性。