1 DaemonSet控制器简介
DaemonSet是Kubernetes的一种控制器,用于在集群的每一台(或特定)节点上运行且仅运行一个Pod副本。当节点加入/退出时,DaemonSet自动在新节点创建Pod,或在旧节点回收Pod,长期守护而非一次性任务。
2 DaemonSet的核心特点
| 特性 | 说明 |
|---|---|
| 每节点1个副本 | 默认全局调度,也可通过亲和性选特定节点。 |
| 节点生命周期感知 | 新增节点 -> 自动起Pod;节点下线 -> Pod被回收。 |
| 长期运行 | 控制器持续保活,Pod崩溃会重启(restartPolicy=Always)。 |
| 更新策略 | 支持滚动更新(RollingUpdate)或 OnDelete模式。 |
| 共享宿主机资源 | 常挂载/proc、/sys、/var/log或hostNetwork,做监控/转发。 |
3 DaemonSet典型使用场景
- 日志收集:Fluentd / Filebeat / Logstash 每个节点落盘收日志。
- 监控代理:Prometheus Node Exporter、Datadog agent、Grafana Alloy。
- 网络插件:Calico、Flannel、Cilium 的 daemon Pod 负责节点网络配置。
- 安全审计:Falco、AuditBeat 实时抓系统调用/审计事件。
- 存储代理:Ceph OSD、Rook、Portworx 的守护进程。
- 节点级运维工具:自动清理镜像、巡检脚本、硬件发现。
4 DaemonSet和Job的区别
| 维度 | DaemonSet | Job |
|---|---|---|
| 目的 | 长期守护进程(节点级) | 一次性/批量任务 |
| 副本策略 | 每节点1个副本(随节点伸缩) | 固定completions数,与节点无关 |
| 生命周期 | 持续运行,Pod崩溃重启 | Pod成功退出即完成,不重启 |
| 调度逻辑 | 节点加入即创建;节点下线即删除 | 调度器随机选可用节点,完成后不迁移 |
| 重启策略 | Always | Never/OnFailure |
| 典型镜像 | 日志/监控/网络插件 | 离线计算、数据导入、备份脚本 |
5 DaemonSet示例
下面将在有一个控制平面节点和两个工作节点的集群运行一个DaemonSet示例,查看其与Job、CronJob的区别。
(1) 编写DaemonSet资源清单文件
这份资源清单,创建了一个DaemonSet,作用是在集群的每台节点上长期运行一个busybox容器,每分钟把当前时间、节点名追加写到宿主机目录/root/k8s-test/data/time-daemon.log中,实现节点级定时日志采集。
[root@master 16-daemonset]# cat busybox-daemonset.yaml
apiVersion: apps/v1
kind: DaemonSet
metadata:
name: time-writer-ds
spec:
selector:
matchLabels:
app: time-writer-ds
template:
metadata:
labels:
app: time-writer-ds
spec:
containers:
- name: writer
image: busybox:1.34.1
command:
- /bin/sh
- -c
- |
while :; do
echo "$(date '+%F %T') - hello from busybox on $(hostname)" \
>> /opt/cronjob/time-daemon.log
sleep 60
done
volumeMounts:
- name: hostdir
mountPath: /opt/cronjob
volumes:
- name: hostdir
hostPath:
path: /root/k8s-test/data
type: DirectoryOrCreate
(2) 查看集群状态
# 当前集群有三个Node节点
[root@master 16-daemonset]# kubectl get node -o wide
NAME STATUS ROLES AGE VERSION INTERNAL-IP EXTERNAL-IP OS-IMAGE KERNEL-VERSION CONTAINER-RUNTIME
master Ready control-plane,master 30m v1.29.6+k3s1 192.168.88.132 <none> openEuler 22.03 LTS 5.10.0-60.18.0.50.oe2203.x86_64 docker://20.10.0
worker1 Ready <none> 29m v1.29.6+k3s1 192.168.88.134 <none> openEuler 22.03 LTS 5.10.0-60.18.0.50.oe2203.x86_64 docker://20.10.0
worker2 Ready <none> 28m v1.29.6+k3s1 192.168.88.135 <none> openEuler 22.03 LTS 5.10.0-60.18.0.50.oe2203.x86_64 docker://20.10.0
# 查看当前运行的Pod,没有和DaemonSet相关的Pod
[root@master 16-daemonset]# kubectl get pod
NAME READY STATUS RESTARTS AGE
time-writer-cj-29246282-hrsw2 0/1 Completed 0 2m3s
time-writer-cj-29246283-q2l4g 0/1 Completed 0 63s
time-writer-cj-29246284-jggsr 0/1 Completed 0 3s
time-writer-job-cxr4c 0/1 Completed 0 17m
# 查看DaemonSet资源,也没有。ds是daemonset的缩写。
[root@master 16-daemonset]# kubectl get daemonset
No resources found in default namespace.
[root@master 16-daemonset]# kubectl get ds
No resources found in default namespace.
(3) 创建daemonset资源对象
[root@master 16-daemonset]# kubectl apply -f busybox-daemonset.yaml
daemonset.apps/time-writer-ds created
(4) 查看DaemonSet资源对象
# 可以看到,因为有3个节点,所以DESIRED是3,当前创建了3个,全部已经就绪。
[root@master 16-daemonset]# kubectl get ds
NAME DESIRED CURRENT READY UP-TO-DATE AVAILABLE NODE SELECTOR AGE
time-writer-ds 3 3 3 3 3 <none> 7s
# 查看Pod,发现time-writer-ds-xxxxx的几个Pod,分别在master,worker1和worker2上。DaemonSet会为每个节点创建一个Pod。
[root@master 16-daemonset]# kubectl get pod -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
time-writer-cj-29246283-q2l4g 0/1 Completed 0 2m16s 10.42.1.7 worker1 <none> <none>
time-writer-cj-29246284-jggsr 0/1 Completed 0 76s 10.42.2.8 worker2 <none> <none>
time-writer-cj-29246285-8wh5w 0/1 Completed 0 16s 10.42.1.8 worker1 <none> <none>
time-writer-ds-5ps2c 1/1 Running 0 13s 10.42.2.9 worker2 <none> <none>
time-writer-ds-hjhwb 1/1 Running 0 13s 10.42.1.9 worker1 <none> <none>
time-writer-ds-rllmg 1/1 Running 0 13s 10.42.0.4 master <none> <none>
time-writer-job-cxr4c 0/1 Completed 0 19m 10.42.1.2 worker1 <none> <none>
(5) 查看DaemonSet的输出
master节点上daemonset的输出
【本命令在master虚拟机执行】
[root@master 16-daemonset]# cat /root/k8s-test/data/time-daemon.log
2025-08-09 22:05:04 - hello from busybox on time-writer-ds-rllmg
worker1节点上daemonset输出
【本命令在worker1虚拟机执行】
[root@worker1 data]# cat /root/k8s-test/data/time-daemon.log
2025-08-09 22:04:03 - hello from busybox on time-writer-ds-hjhwb
2025-08-09 22:05:03 - hello from busybox on time-writer-ds-hjhwb
worker2节点上daemonset输出
【本命令在worker2虚拟机执行】
[root@worker2 install-k3s]# cat /root/k8s-test/data/time-daemon.log
2025-08-09 22:04:02 - hello from busybox on time-writer-ds-5ps2c
2025-08-09 22:05:02 - hello from busybox on time-writer-ds-5ps2c
6 小结
DaemonSet会在所有节点运行Pod,新添加进来的节点,会被调度一个DaemonSet的Pod,删除的节点,Pod会被DaemonSet回收。DaemonSet适合日志、监控、网络插件等节点节点级任务。
3912

被折叠的 条评论
为什么被折叠?



