首页/云/云与容器速查/kubectl taint 节点污点与容忍
Kubernetes68 条

kubectl taint 节点污点与容忍

污点让节点拒绝/劝退特定 Pod:NoSchedule 不调度新 Pod、PreferNoSchedule 尽量避免、NoExecute 驱逐不满足容忍的存量 Pod;与容忍(Toleration)配对使用。

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

污点与容忍是什么

污点(taint)是写在节点上的排斥标记,容忍(toleration)是写在 Pod 上的接受声明:两者配对后,调度器才知道哪些 Pod 可以落在哪些节点上。污点有三种效果,从“不调度新 Pod”到“连存量 Pod 一起驱逐”。常见用途是把专用硬件节点、专属租户或尚未准备好的节点从普通调度池里摘出去,而不是靠人为记忆去避开。

基本信息

语法kubectl taint nodes <节点> key=value:effect
删除污点把同样的表达式末尾加短横线,如 key=value:NoSchedule-
修改同键同效果的污点要改值需加 --overwrite
Pod 侧spec.tolerations 声明 容忍的键、值与效果(可只匹配键)
常见场景GPU 专用节点、专属租户隔离、节点上线前隔离、控制面节点
查看kubectl describe node 看 Taints 列表,kubectl get nodes -o json 看完整字段

典型使用场景

  • GPU 或特定硬件节点只让带容忍的负载落上
  • 把某几个节点划给特定团队,避免被其他业务占用
  • 节点刚加入集群或尚未完成初始化时先隔离
  • 维护窗口前用污点挡住新调度,再从容处理存量
  • 排查 Pod 为什么 Pending:先确认是不是节点污点与容忍不匹配

使用示例

使用示例
kubectl taint nodes node-gpu-1 gpu=true:NoSchedule   # 只让带容忍的 Pod 落上
kubectl describe node node-gpu-1 | grep -i taints   # 复核节点当前污点
kubectl taint nodes node-gpu-1 gpu=true:NoSchedule-   # 按同样表达式删除
kubectl taint nodes node-1 maintenance=true:NoExecute --overwrite   # 改已有污点的值
kubectl get pod web-1 -o jsonpath='{.spec.tolerations}'   # 看 Pod 的容忍声明

三种效果对照

效果对新 Pod对存量 Pod典型用法
NoSchedule不调度保留常规专用节点隔离
PreferNoSchedule尽量避免保留软隔离,资源紧张时仍可用
NoExecute不调度驱逐无容忍的 Pod故障节点、独占维护
键值匹配容忍需与污点键值一致NoExecute 可用容忍时间限制写错键值即无法匹配
集群会自动给节点打污点,例如 node.kubernetes.io/not-ready 与 unreachable(NoExecute,默认容忍 300 秒):这正是节点失联后 Pod 会被重排的原因。
看到 Pod Pending 且 describe 提示污点不匹配时只有两条路:给 Pod 加容忍,或确认该节点本就不该接收这个负载。
容忍的写法有细节:operator=Exists 时只匹配键、不比较值,容忍任意值;只写 effect 时该效果下所有键都被容忍,写得太宽会削弱节点隔离效果。

易错点

  • 加了 NoExecute 忘记删除:存量 Pod 被驱逐,业务无端抖动且难定位
  • 污点键值写错:容忍匹配不上,Pod 永远 Pending
  • 只加污点不给容忍:以为能定向调度,结果新 Pod 全被挡住
  • 节点故障恢复后忘了删除手工污点:可用容量少一块,排障时容易漏看
  • 容忍写得过宽(不写键或只写 effect):本意隔离的节点上照样落下普通负载

数据来源与参考

  • Kubernetes Docs:Taints and Tolerations

相关工具

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