Taint 和 Toleration 是 Kubernetes 中用于控制 Pod 调度的双向机制:Taint 施加于 Node 表示拒绝不匹配 Pod,Toleration 定义于 Pod 表示其可容忍特定 Taint;三类 effect 为 NoSchedule、PreferNoSchedule 和 NoExecute。
在 Kubernetes 中,Taint(污点)和 Toleration(容忍)是一对用于
精细控制 Pod 调度行为
的核心机制。它们不是用来“禁止调度”,而是让节点主动“拒绝”不满足条件的 Pod,同时允许特定 Pod “申请豁免”——这种双向约束比单纯靠标签选择器更安全、更灵活。
什么是 Taint 和 Toleration?
Taint 是施加在
Node
上的标记,表示“此处不欢迎某类 Pod”。只要节点有 Taint,Scheduler 就默认不会把 Pod 调度过去,除非该 Pod 明确声明了匹配的 Toleration。
Toleration 是定义在
Pod spec
中的字段,相当于 Pod 的“准入许可证”,表明它能容忍某个 Taint。只有 Toleration 与节点 Taint 完全匹配(key、value、effect 一致),Pod 才可能被调度到该节点。
注意:Toleration 不是“强制调度”,只是移除调度障碍;最终是否调度成功,还取决于资源、亲和性、污点 effect 类型等其他条件。
三种 Taint Effect 及其作用
每个 Taint 都有一个 effect,决定不匹配时的行为:
NoSchedule
:新 Pod 不会调度到该节点(已运行的 Pod 不受影响)
PreferNoSchedule
:软性策略,Scheduler 尽量避免调度,但不保证(适合非关键场景的倾向性隔离)
NoExecute
:硬性驱逐——不仅阻止新 Pod 调度,还会驱逐当前运行在该节点上、且没有对应 Toleration 的 Pod(常用于节点维护或故障隔离)
常用操作示例
给节点添加污点:
给 Pod 添加容忍(YAML 片段):
常见简写形式(省略 operator 和 value):
容忍所有 key 为
的 NoSchedule 污点:
容忍任意 effect 的
污点:
(effect 为空表示匹配所有 effect)
典型使用场景
专用节点池(如 GPU、高内存):
给 GPU 节点打上
污点,只给需要 GPU 的 Pod 加对应 Toleration,避免普通 Pod 占用资源。
Master 节点保护:
Kubeadm 部署的集群默认给 master 节点加了
污点,防止工作负载误调度;若需部署监控等系统组件,就在其 Pod 中添加对应 Toleration。
节点维护前平滑驱逐:
先给节点加
,带该 Toleration 的运维 Pod 仍可运行,其他 Pod 会被自动驱逐,不影响业务连续性。
kubectl taint nodes node-1 key1=value1:NoScheduletolerations:
- key: "key1"
operator: "Equal"
value: "value1"
effect: "NoSchedule"dedicatedkey: dedicated, effect: NoSchedulenode-type=gpukey: node-type, operator: Equal, value: gpu, effect: ""gpu=true:NoSchedulenode-role.kubernetes.io/master:NoSchedulemaintenance=ongoing:NoExecute