污点与容忍是什么
污点(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 时该效果下所有键都被容忍,写得太宽会削弱节点隔离效果。