Kubernetes(k8s)中的DaemonSet是如何确保每个节点都运行指定的Pod的?

问题浏览数Icon
13
问题创建时间Icon
2025-05-09 12:10:00
回答 | 共 3 个
作者头像
xiaoming99

Kubernetes中的DaemonSet通过控制器模式与集群节点状态动态绑定,确保每个符合条件的节点运行指定的Pod。其核心机制包括:1. 节点监控:DaemonSet控制器实时监听集群节点变化(新增/删除);2. 自动扩展:新节点加入时立即调度Pod,节点移除时回收Pod;3. 节点选择策略:通过nodeSelector匹配节点标签,结合Tolerations绕过节点污点限制;4. 直接绑定:绕过Kubernetes默认调度器,直接通过节点控制器将Pod绑定到目标节点;5. 版本更新:支持RollingUpdate或OnDelete策略维护Pod版本一致性。这种设计特别适用于节点级守护进程(如日志采集、监控代理)的场景需求。

作者头像
shizhong77

Kubernetes中的DaemonSet通过以下机制确保每个节点运行指定Pod,并提供常用解决方案步骤:

  1. 节点匹配机制

    • DaemonSet Controller监听集群节点列表,根据nodeSelectornodeAffinity规则筛选目标节点。
    • 默认无规则时,覆盖全部节点(包括新加入节点)。
  2. Pod自动部署与维持

    • 每个匹配节点自动创建Pod副本,若Pod被删除或节点重启,Controller重新创建。
    • 新节点加入集群时,Controller在10秒内(默认同步周期)触发Pod部署。
  3. 更新与驱逐策略

    • 使用RollingUpdateOnDelete策略更新Pod模板,确保滚动替换或手动控制。
    • 节点被标记为不可调度(cordon)或删除时,Pod保留但不会被迁移(需结合toleration配置)。

常见解决方案步骤

  • 检查DaemonSet配置

    nodeSelector:  # 确认目标节点标签匹配
    role: storage-node
    tolerations:  # 确保容忍节点污点
    - key: "disk-type"
    operator: "Exists"
  • 验证节点状态

    • kubectl get nodes --show-labels 检查节点标签是否正确。
    • kubectl describe node <node-name> 查看污点(Taints)。
  • 排查Pod状态

    • kubectl get pods -l <daemonset-label> -o wide 确认Pod分布。
    • kubectl describe daemonset <name> 查看事件(Events)及错误原因(如资源不足)。
  • 强制触发同步

    • 删除目标节点上的Pod,触发Controller立即重建(kubectl delete pod <name>)。
作者头像
rickfox88

DaemonSet通过控制器监控节点状态变化,确保每个匹配标签的节点运行指定Pod。其核心机制依赖节点亲和性规则与调度器协作:1) 节点加入集群时,控制器基于Pod模板创建实例并绑定至节点;2) 节点标签变更时触发Pod重建逻辑;3) 节点移除时自动回收Pod。实践案例:曾部署Fluentd日志收集器时,需配置tolerations容忍master节点的NoSchedule污点,并通过resource limits防止资源争抢。挑战包括:滚动更新时旧版本Pod未终止导致版本冲突,需设置updateStrategy为OnDelete模式手动控制;节点磁盘压力导致Pod反复驱逐时,需优化日志轮转策略并设置合适terminationGracePeriodSeconds。