Bootstrap

为什么DaemonSet是Kubernetes运维的“隐形守护者”?

 

目录

前言

一.什么是DaemonSet?

 二.典型应用场景与案例

场景1:日志收集(每个节点都需要)

场景2:节点监控(监控所有节点资源)

 三.常见问题与解决方案

问题1:Pod未均匀分布在所有节点上

 问题2:DaemonSet的Pod占用资源过高

 问题3:Pod无法访问宿主机目录或设备

 四.总结


前言

如果你用过Kubernetes,可能听说过Deployment、StatefulSet,但DaemonSet这个“低调”的控制器,却常被新手忽略。
它像“保安”一样默默守护每个节点,确保关键服务无处不在——比如日志收集、节点监控。本文用大白话+实操案例,带你彻底搞懂DaemonSet!


一.什么是DaemonSet?

一句话总结:DaemonSet确保集群中每个符合条件的节点上都运行一个Pod副本。

  • 当新节点加入集群时,DaemonSet自动部署Pod。

  • 当节点被删除时,Pod也被回收。

适用场景

  1. 日志收集(如Fluentd、Filebeat)

  2. 节点监控(如Prometheus Node Exporter)

  3. 网络插件(如Calico、Flannel)


 二.典型应用场景与案例

场景1:日志收集(每个节点都需要)

需求:实时收集所有节点的系统日志,并发送到Elasticsearch。

案例:用DaemonSet部署Filebeat

apiVersion: apps/v1
kind: DaemonSet
metadata:
  name: filebeat
spec:
  selector:
    matchLabels:
      app: filebeat
  template:
    metadata:
      labels:
        app: filebeat
    spec:
      containers:
      - name: filebeat
        image: docker.elastic.co/beats/filebeat:8.10.0
        volumeMounts:
        - name: varlog
          mountPath: /var/log  # 挂载节点日志目录
      volumes:
      - name: varlog
        hostPath:
          path: /var/log       # 直接使用宿主机的日志路径
      tolerations:             # 允许在污点节点上运行
      - operator: Exists

场景2:节点监控(监控所有节点资源)

需求:采集每个节点的CPU、内存、磁盘数据。

案例:部署Prometheus Node Exporter

apiVersion: apps/v1
kind: DaemonSet
metadata:
  name: node-exporter
spec:
  selector:
    matchLabels:
      app: node-exporter
  template:
    metadata:
      labels:
        app: node-exporter
    spec:
      hostNetwork: true       # 使用主机网络,直接暴露节点指标
      containers:
      - name: node-exporter
        image: prom/node-exporter:v1.6.0
        ports:
        - containerPort: 9100

 三.常见问题与解决方案

问题1:Pod未均匀分布在所有节点上

表现:部分节点没有生成Pod。
原因:节点可能设置了污点(Taint),或DaemonSet未配置容忍(Toleration)。
解决:在DaemonSet配置中添加tolerations

tolerations:
- key: "key1"
  operator: "Equal"
  value: "value1"
  effect: "NoSchedule"

 问题2:DaemonSet的Pod占用资源过高

表现:节点资源被大量占用,影响其他服务。
解决:在Pod模板中配置资源限制:

containers:
- name: my-daemon
  image: my-image
  resources:
    limits:
      cpu: "500m"
      memory: "512Mi"
    requests:
      cpu: "200m"
      memory: "256Mi"

 问题3:Pod无法访问宿主机目录或设备

表现:日志收集失败,提示“权限不足”或“路径不存在”。
解决:通过hostPath挂载宿主机目录,并配置权限:

volumes:
- name: host-log
  hostPath:
    path: /var/log
    type: Directory         # 明确指定类型为目录

 四.总结

DaemonSet是Kubernetes中节点级任务的核心解决方案,尤其适合需要“无处不在”的服务。

  • 优点:自动扩缩容、与节点生命周期绑定。

  • 避坑点:注意污点容忍、资源限制、目录挂载权限。

动手建议:尝试用DaemonSet部署一个日志收集器,观察节点变化,体验其自动化能力!


关注我,获取更多Kubernetes运维实战技巧!
遇到问题? 评论区留言,我会一一解答!