关键不是“主动申请”,而是“出示通行证”——这个通行证就是tolerations,它写在pod的yaml中,要求匹配污点的key、value(或exists通配)和effect三要素;equal模式需完全一致,exists模式只校验key和effect;noexecute容忍可配tolerationseconds延缓驱逐;多污点节点要求pod声明全部匹配容忍,否则调度失败。

让 Pod 调度到带污点的节点上,关键不是“主动申请”,而是“出示通行证”——这个通行证就是 Tolerations。它写在 Pod 的 YAML 里,告诉调度器:“我清楚这个节点有污点,但我被允许进来。”
容忍必须匹配污点三要素
节点上的污点格式是 key=value:effect,而 Pod 的 toleration 必须在 key、value(或存在性)、effect 三方面达成一致,才算有效。不匹配就进不去。
-
Equal 模式(最常用):要求 key、value、effect 全部精确一致
例如节点有污点gpu-type=A100:NoSchedule,Pod 就得写:
tolerations: - key: "gpu-type" operator: "Equal" value: "A100" effect: "NoSchedule"
-
Exists 模式(灵活通配):只校验 key 和 effect,忽略 value
适合应对多个值的同一类污点,比如所有维护中的节点都打了under-maintain:NoExecute,但没设 value;或你想容忍任意database=xxx的 NoSchedule 污点,可省略 value:
tolerations: - key: "under-maintain" operator: "Exists" effect: "NoExecute"
容忍 NoExecute 时要加驱逐缓冲期
当节点污点 effect 是 NoExecute,已运行的 Pod 若无对应容忍,会被立即驱逐。为避免服务中断,可在 toleration 中加 tolerationSeconds,表示“容忍失效后,再留我 X 秒才走”:
tolerations: - key: "maintenance" operator: "Equal" value: "true" effect: "NoExecute" tolerationSeconds: 300
上面配置表示:该 Pod 可以在污点生效后继续运行 5 分钟,之后被自动驱逐。
评估 Kubernetes 集群安全态势,覆盖 RBAC、工作负载安全、网络策略、基础设施即代码(IaC)、运行时监控和密钥管理等 30 项控制项……
一个 Pod 可声明多个容忍,应对多污点节点
现实节点常打多个污点,比如同时标记了硬件类型和区域:
node-01 污点: - gpu-type=A100:NoSchedule - region=cn-east:NoExecute
那 Pod 必须同时容忍两者,缺一不可:
tolerations: - key: "gpu-type" operator: "Equal" value: "A100" effect: "NoSchedule" - key: "region" operator: "Equal" value: "cn-east" effect: "NoExecute"
调度器会逐条检查,只要有一条污点找不到匹配容忍,整个调度就会失败。
调试技巧:快速定位调度失败原因
如果 Pod 卡在 Pending 状态,别猜,直接查:
- 看节点有没有污点:
kubectl describe node <node-name> | grep Taints</node-name> - 看 Pod 为什么卡住:
kubectl describe pod <pod-name></pod-name>,重点看 Events 区域,通常会明确提示 “Taints not tolerated” - 确认污点和容忍是否完全对得上:注意大小写、空格、冒号位置、effect 类型是否一致










