首页/云/云与容器速查/DaemonSet 每节点一个 Pod
Kubernetes68 条

DaemonSet 每节点一个 Pod

在(符合条件的)每个节点上运行一个 Pod:日志采集、监控代理、CNI、kube-proxy 这类节点级组件标配;节点加入自动补、移除自动清。

云与容器速查云更新于 2026-10-13

每节点一个 Pod

DaemonSet 在符合条件的每个节点上运行一份 Pod:节点加入集群后自动补齐,节点移除后自动清理。日志采集、监控代理、网络插件、kube-proxy 这类节点级组件都用它部署。它不参与常规调度的资源抢占计算,而是直接为每个合格节点创建一个 Pod,因此实际覆盖范围由选择器与污点容忍共同决定。

基本信息

调度特性忽略常规调度器的占用计算,为每个合格节点启动一个 Pod
限定范围nodeSelector、nodeAffinity 与 tolerations 决定覆盖哪些节点
典型组件日志采集、节点监控导出器、CNI 插件、kube-proxy
更新策略RollingUpdate 为默认,需关注并发度与节点负载
观察指标期望副本数应与期望覆盖的节点数一致
资源占用requests 会占用每个节点的可分配容量,需按节点规模估算

典型使用场景

  • 采集每个节点的容器日志并转发到集中式日志系统
  • 部署节点级监控指标导出器,提供节点维度指标
  • 运行网络插件与 kube-proxy 这类必须每节点存在的组件
  • 节点安全扫描与合规检查 Agent,覆盖全部节点
  • 特殊硬件节点的驱动与设备插件,只在对应节点运行

DaemonSet 示例

DaemonSet 示例
apiVersion: apps/v1
kind: DaemonSet
metadata:
  name: node-agent
  namespace: kube-system
spec:
  selector:
    matchLabels: { app: node-agent }
  template:
    metadata:
      labels: { app: node-agent }
    spec:
      tolerations:
        - key: node-role.kubernetes.io/control-plane
          effect: NoSchedule       # 容忍控制面污点,才能覆盖该节点
      containers:
        - name: agent
          image: registry.example.com/infra/node-agent:2.1.0
          resources:
            requests: { cpu: 50m, memory: 64Mi }   # 每节点都会占用

状态列读法

状态项含义异常表现
DESIRED期望运行的节点数小于节点总数说明部分节点被选择器或污点排除
CURRENT已调度的 Pod 数小于 DESIRED 说明仍在创建中
READY就绪的 Pod 数长期小于 CURRENT 说明探针失败或资源不足
UP-TO-DATE已使用最新模板的 Pod 数更新期间长期不推进说明滚动被卡住
AVAILABLE可用 Pod 数与 READY 一致才算健康
控制面节点自带不可调度污点:想让 DaemonSet 覆盖它必须配置对应容忍,否则 DESIRED 会一直小于节点总数,而 Pod 本身没有任何异常。
requests 设置过大会挤占业务容量:DaemonSet 在每个节点上都消耗资源,估算时要乘以节点数量,长期忽略会出现「节点已扩容但业务仍调度不上」的现象。

易错点

  • DESIRED 小于节点数:多半是污点未容忍,或选择器把节点范围收窄了
  • requests 给得过大:节点容量不足,节点级组件与业务相互挤占,最终都受影响
  • 用 DaemonSet 部署需要单实例的组件:每个节点都会跑一份,产生重复写入或端口冲突
  • 更新时不控制并发:一次滚动重启大量节点上的 Agent,短时间内丢失可观测性

数据来源与参考

  • Kubernetes Docs:DaemonSet

相关工具

​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌