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 时的完整匹配流程:

Taint 与 Toleration 匹配流程 节点 Taint 集合 Pod Toleration 集合 匹配引擎 匹配失败:拒绝调度 匹配成功:允许调度 检查 Effect 类型 NoSchedule:硬拒绝 PreferNoSchedule:软避开 NoExecute:拒绝 + 驱逐 说明:匹配引擎先检查 key/value/operator,再根据 effect 决定调度行为

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 意外占用专用资源。