4. Taint 与 Toleration 概念:Effect 与匹配规则
污点(Taint)与容忍(Toleration)是 Kubernetes 调度系统中用于实现“节点排斥”与“Pod 豁免”的核心机制。通过 Taint,节点可以主动拒绝不符合条件的 Pod 调度上来;而 Toleration 则允许 Pod 声明自己能够“容忍”某些污点,从而被调度到对应节点上。
4.1 Taint 的三种 Effect
每个 Taint 由 key、value 和 effect 三部分组成。其中 effect 决定了节点对 Pod 的排斥行为,共有三种类型:
| Effect 类型 | 行为描述 | 调度影响 | 对已有 Pod 的影响 |
|---|---|---|---|
| NoSchedule | 节点拒绝所有不匹配该污点的 Pod 调度上来 | 硬限制,调度器直接跳过该节点 | 不影响已在运行的 Pod |
| PreferNoSchedule | 节点尽量不调度不匹配的 Pod,但不强制 | 软限制,调度器优先避开该节点 | 不影响已在运行的 Pod |
| NoExecute | 节点拒绝不匹配的 Pod 调度,并驱逐已在运行的 Pod | 硬限制 + 驱逐 | 立即驱逐不匹配的已有 Pod |
关键区别: NoSchedule 只影响未来调度,NoExecute 还会驱逐当前运行的不匹配 Pod。PreferNoSchedule 是“尽力而为”的软限制,在资源紧张或调度器压力大时可能被忽略。
4.2 Toleration 匹配规则
Toleration 定义在 Pod 的 spec.tolerations 字段中,用于声明 Pod 能够容忍哪些 Taint。匹配规则基于 key、value、operator 和 effect 四个字段的组合:
- key:要匹配的 Taint 的键,支持通配符
*表示匹配所有键。 - value:要匹配的 Taint 的值,仅在
operator: Equal时使用。 - operator:匹配操作符,支持
Equal和Exists两种。 - effect:要匹配的 Taint 的 Effect,可选
NoSchedule、PreferNoSchedule、NoExecute,留空则匹配所有 Effect。
| Operator | 匹配逻辑 | 示例 |
|---|---|---|
| Equal | key 和 value 必须同时匹配,effect 可选 | key: "gpu", value: "true", effect: NoSchedule |
| Exists | 仅匹配 key 是否存在,忽略 value;effect 可选 | key: "gpu", operator: Exists, effect: NoSchedule |
匹配优先级: 当 Pod 的 Toleration 与节点的 Taint 在 key、value、effect 上完全匹配时,该 Pod 可以调度到该节点。如果 Toleration 的 effect 留空,则匹配所有 effect 类型。
4.3 Taint 与 Toleration 匹配流程
下图展示了调度器在处理 Taint 与 Toleration 时的完整匹配流程:
4.4 典型配置示例
以下是一个完整的 Taint 与 Toleration 配置示例:
# 给节点添加 Taint
kubectl taint nodes node1 gpu=true:NoSchedule
# Pod 中定义 Toleration
apiVersion: v1
kind: Pod
metadata:
name: gpu-pod
spec:
tolerations:
- key: "gpu"
operator: "Equal"
value: "true"
effect: "NoSchedule"
containers:
- name: gpu-container
image: nvidia/cuda:11.0
注意事项:
- 使用
operator: Exists且不指定 key 时,表示容忍所有 Taint,应谨慎使用。 - NoExecute 的
tolerationSeconds字段可以设置 Pod 在被驱逐前继续运行的秒数。 - 多个 Taint 同时存在时,Pod 必须容忍所有 Taint 才能调度到该节点。
4.5 三种 Effect 的调度行为对比
下表从调度器角度对比三种 Effect 的实际行为差异:
| 场景 | NoSchedule | PreferNoSchedule | NoExecute |
|---|---|---|---|
| 新 Pod 调度 | 直接跳过节点 | 优先跳过,但可调度 | 直接跳过节点 |
| 已有 Pod 处理 | 不处理 | 不处理 | 立即驱逐 |
| 调度器优先级 | 最高 | 最低 | 最高 |
| 典型用途 | 专用硬件节点隔离 | 节点维护前软驱逐 | 节点故障时强制驱逐 |
4.6 多 Taint 与多 Toleration 的匹配逻辑
当一个节点上有多个 Taint 时,Pod 必须满足以下条件才能调度到该节点:
- 对于每个 NoSchedule 和 NoExecute 类型的 Taint,Pod 必须有一个对应的 Toleration 与之匹配。
- 对于 PreferNoSchedule 类型的 Taint,Pod 可以不匹配,但调度器会降低该节点的优先级。
- 如果 Pod 缺少对某个 NoSchedule 或 NoExecute Taint 的 Toleration,调度器将拒绝该 Pod 调度到该节点。
最佳实践: 在生产环境中,建议将专用节点(如 GPU、SSD 节点)打上 NoSchedule 污点,并在需要使用的 Pod 中显式声明 Toleration。这样可以避免普通 Pod 意外占用专用资源。