首页/云/Kubernetes 速查/节点污点命令操作
集群运维与排障54 条

节点污点命令操作

用 kubectl taint 添加/移除节点污点:移除是在同一表达式后加 -;组合键值要写全,避免删错。

Kubernetes 速查云更新于 2026-10-13

taint 命令做什么

kubectl taint 给节点打污点,配合 Pod 的 tolerations 实现「把某些 Pod 赶走或挡在外面」的调度控制。三种 effect 强度不同:NoSchedule 只阻止新 Pod 调度上来,已经在跑的 Pod 不受影响;PreferNoSchedule 是软性倾向;NoExecute 会驱逐节点上不容忍该污点的既有 Pod。移除污点的写法是在同一个表达式后追加连字符,表达式必须与原污点完全一致。

三种 effect 的差别

effect对已有 Pod对新 Pod典型用途
NoSchedule不影响不容忍则不调度节点维护前阻止新副本落上来
PreferNoSchedule不影响尽量不调度,但可被挤上来弱隔离,允许作为兜底位置
NoExecute驱逐不容忍的 Pod不容忍则不调度彻底腾空节点,常用于下线与专用节点

典型使用场景

  • 节点维护:先打 NoSchedule 阻止新副本上来,再按计划排水,影响面可控
  • 专用节点:给 GPU 或高内存机器打污点,只让带对应容忍的业务使用
  • 故障隔离:节点出现硬件问题时打 NoExecute 把 Pod 赶到其他节点
  • 批次区分:为不同业务线划分节点池,用污点与容忍实现隔离
  • 恢复开放:维护结束移除污点,节点重新参与正常调度

添加与移除

添加与移除
kubectl taint nodes node1 maintenance=true:NoSchedule          # 添加污点
kubectl describe node node1 | grep -i -A2 taints                # 复核当前污点列表
kubectl taint nodes node1 maintenance=true:NoSchedule-          # 移除:末尾加连字符
kubectl taint nodes node1 dedicated-                            # 按 key 移除(不带 value 与 effect)
kubectl get pods -A -o wide --field-selector spec.nodeName=node1  # 看该节点上有哪些 Pod

节点污点读法

观察点含义注意
key=value:effect污点完整表达式移除时必须逐字一致
Taints 列表节点当前全部污点系统组件也会自动打污点
TolerationsPod 的容忍声明声明了容忍才允许落在该节点上
Evicted 事件NoExecute 造成的驱逐驱逐由节点侧执行,事件里能看到原因
给承载业务的节点打 NoExecute 污点会立刻驱逐不容忍的 Pod,可用容量同步下降。动手前先确认副本冗余与其他节点余量,并检查关键服务的 PodDisruptionBudget,避免一次性削减过多副本。
节点还有一类由系统自动维护的污点,例如未就绪或网络未就绪时打上的标记。日常看到的污点未必是人工添加的,清理前先确认来源,误删系统污点会让节点提前承接流量。

易错点

  • 移除污点时漏写 value 或 effect:表达式匹配不上,命令看似成功但污点仍在,后续以为已恢复调度
  • 对业务节点直接打 NoExecute:Pod 被立即驱逐,可用容量下降,遇到副本不足会直接引发故障
  • 只打污点不考虑容忍与冗余:Pod 无处可去直接 Pending,排障时容易误判为调度器故障
  • 把系统自动污点当人工污点删除:节点尚未真正就绪就开始承接流量,引发更隐蔽的稳定性问题

数据来源与参考

  • Kubernetes 官方文档 · kubectl taint 与节点污点
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌