跳转至

污点和容忍

Kubernetes (k8s) 中,污点(Taint)容忍(Toleration) 是一对配合使用的机制,用来控制 Pod 可以调度到哪些节点上

可以理解为:

  • 污点(Taint)= 节点的限制条件

  • 容忍(Toleration)= Pod 的适应能力

1. 污点(Taint)

污点是加在 Node(节点) 上的属性,用来 拒绝不符合条件的 Pod 调度到该节点。 格式:

kubectl taint nodes <node-name> key=value:effect

其中:

  • key=value:污点的键值对(自定义)

  • effect:作用方式,有三种

    1. NoSchedule —— 不允许新的 Pod 调度到该节点(除非 Pod 有匹配的容忍)

    2. PreferNoSchedule —— 尽量避免调度到该节点,但不是强制

    3. NoExecute —— 不仅禁止新的 Pod 调度,还会驱逐已经在该节点上但不匹配的 Pod

例子:

kubectl taint nodes node1 dedicated=database:NoSchedule

意思是:node1 节点被打上一个污点,只有能容忍 dedicated=database 的 Pod 才能调度上去。

2. 容忍(Toleration)

容忍是加在 Pod 上的配置,表示这个 Pod 可以容忍某些节点的污点
在 Pod 的 YAML 文件中定义:

tolerations:
- key: "dedicated"
  operator: "Equal"
  value: "database"
  effect: "NoSchedule"

这表示该 Pod 可以容忍 dedicated=database:NoSchedule 的节点污点,因此它可以被调度到这种节点。


3. 关系总结

  • 节点有污点,就像挂了个牌子:“没带这个通行证的 Pod 不许进”。

  • Pod 有容忍,就像带了“通行证”,允许进入挂了该污点的节点。

  • 只有污点,没有容忍 → Pod 不能调度过去

  • 只有容忍,没有对应污点 → Pod 照样可以调度到别的节点

  • 两者同时存在,匹配 → Pod 可以调度过去


4. 常见用途

  1. 专用节点
    比如某些节点专门跑数据库,就给这些节点打污点 dedicated=database:NoSchedule
    只有声明容忍的数据库 Pod 能调度上去。

  2. 隔离关键业务
    一些节点只跑系统组件(如 kube-proxy、CoreDNS),普通业务 Pod 不允许调度。

  3. 驱逐机制
    使用 NoExecute,可以让不匹配的 Pod 从节点上被驱逐,比如节点进入不可用状态时。