如何临时移除节点上的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。
- 等节点排空完成、需要恢复的时候,移除这个污点即可:
之后DaemonSet会自动在该节点重建Pod。kubectl taint nodes <你的节点名称> ds-temp-evict:NoExecute-
方法二:临时修改DaemonSet的节点选择器
通过调整DaemonSet的节点选择规则,让它排除目标节点:
- 先给所有需要保留DaemonSet的节点添加统一标签,再移除目标节点的该标签:
kubectl label nodes --all ds-allowed=true kubectl label nodes <你的节点名称> ds-allowed- - 编辑DaemonSet的配置,添加节点选择器:
在kubectl edit daemonset <你的DaemonSet名称>spec.template.spec下添加:nodeSelector: ds-allowed: "true" - 保存后,DaemonSet会自动删除目标节点上的Pod,只在有
ds-allowed=true标签的节点运行。 - 完成节点操作后,恢复DaemonSet的nodeSelector配置,再给目标节点加回标签,Pod就会重新创建。
方法三:临时配置节点亲和性让DaemonSet避开目标节点
通过节点亲和性规则,强制DaemonSet不调度到目标节点:
- 编辑DaemonSet:
kubectl edit daemonset <你的DaemonSet名称> - 在
spec.template.spec下添加亲和性配置:
注意:affinity: nodeAffinity: requiredDuringSchedulingIgnoredDuringExecution: nodeSelectorTerms: - matchExpressions: - key: kubernetes.io/hostname operator: NotIn values: - <你的节点名称>IgnoredDuringExecution意味着现有Pod不会被立刻驱逐,需要手动删除一次目标节点的DaemonSet Pod,之后DaemonSet就不会再调度回来。如果想要自动驱逐,可以改用requiredDuringSchedulingRequiredDuringExecution,但这个规则更严格,使用时要谨慎。 - 恢复时,删除这段亲和性配置即可。
最后提醒:不管用哪种方法,操作完成后一定要记得恢复配置,避免影响DaemonSet的正常运行。
内容的提问来源于stack exchange,提问作者vascop
相关产品推荐
相关产品推荐

