You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何临时移除节点上的DaemonSet Pod以排空节点(不删除DaemonSet)

临时移除节点上的DaemonSet Pod(不删除DaemonSet)的可行方案

你遇到的问题很典型——DaemonSet的核心特性就是要在所有符合条件的节点上维持一个Pod副本,哪怕节点被标记为Unschedulable也不会影响它的调度。下面给你几个不用删除DaemonSet就能临时移除目标节点上Pod的方法:

方法一:给节点添加DaemonSet无法容忍的污点(最推荐)

这是最直接的方式,利用Kubernetes的污点与容忍度机制,让DaemonSet主动放弃目标节点:

  • 给目标节点添加一个NoExecute类型的污点,这种污点会直接驱逐现有不兼容的Pod:
    kubectl taint nodes <你的节点名称> ds-temp-evict:NoExecute
    
  • 因为你的DaemonSet默认不会配置对这个自定义污点的容忍度,所以节点上的DaemonSet Pod会被立刻删除,而且DaemonSet不会再往这个节点调度新Pod。
  • 等节点排空完成、需要恢复的时候,移除这个污点即可:
    kubectl taint nodes <你的节点名称> ds-temp-evict:NoExecute-
    
    之后DaemonSet会自动在该节点重建Pod。

方法二:临时修改DaemonSet的节点选择器

通过调整DaemonSet的节点选择规则,让它排除目标节点:

  1. 先给所有需要保留DaemonSet的节点添加统一标签,再移除目标节点的该标签:
    kubectl label nodes --all ds-allowed=true
    kubectl label nodes <你的节点名称> ds-allowed-
    
  2. 编辑DaemonSet的配置,添加节点选择器:
    kubectl edit daemonset <你的DaemonSet名称>
    
    在spec.template.spec下添加:
    nodeSelector:
      ds-allowed: "true"
    
  3. 保存后,DaemonSet会自动删除目标节点上的Pod,只在有ds-allowed=true标签的节点运行。
  4. 完成节点操作后,恢复DaemonSet的nodeSelector配置,再给目标节点加回标签,Pod就会重新创建。

方法三:临时配置节点亲和性让DaemonSet避开目标节点

通过节点亲和性规则,强制DaemonSet不调度到目标节点:

  1. 编辑DaemonSet:
    kubectl edit daemonset <你的DaemonSet名称>
    
  2. 在spec.template.spec下添加亲和性配置:
    affinity:
      nodeAffinity:
        requiredDuringSchedulingIgnoredDuringExecution:
          nodeSelectorTerms:
          - matchExpressions:
            - key: kubernetes.io/hostname
              operator: NotIn
              values:
              - <你的节点名称>
    
    注意:IgnoredDuringExecution意味着现有Pod不会被立刻驱逐,需要手动删除一次目标节点的DaemonSet Pod,之后DaemonSet就不会再调度回来。如果想要自动驱逐,可以改用requiredDuringSchedulingRequiredDuringExecution,但这个规则更严格,使用时要谨慎。
  3. 恢复时,删除这段亲和性配置即可。

最后提醒:不管用哪种方法,操作完成后一定要记得恢复配置,避免影响DaemonSet的正常运行。

内容的提问来源于stack exchange,提问作者vascop

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 07:01:14