Kubernetes技术详解-从理论到实践-(16)-控制器-DaemonSet

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的区别

维度DaemonSetJob
目的长期守护进程(节点级)一次性/批量任务
副本策略每节点1个副本(随节点伸缩)固定completions数,与节点无关
生命周期持续运行,Pod崩溃重启Pod成功退出即完成,不重启
调度逻辑节点加入即创建;节点下线即删除调度器随机选可用节点,完成后不迁移
重启策略AlwaysNever/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适合日志、监控、网络插件等节点节点级任务。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值