污点和容忍
在 Kubernetes (k8s) 中,污点(Taint) 和 容忍(Toleration) 是一对配合使用的机制,用来控制 Pod 可以调度到哪些节点上。
可以理解为:
-
污点(Taint)= 节点的限制条件
-
容忍(Toleration)= Pod 的适应能力
1. 污点(Taint)
污点是加在 Node(节点) 上的属性,用来 拒绝不符合条件的 Pod 调度到该节点。 格式:
kubectl taint nodes <node-name> key=value:effect
其中:
-
key=value:污点的键值对(自定义)
-
effect:作用方式,有三种
-
NoSchedule—— 不允许新的 Pod 调度到该节点(除非 Pod 有匹配的容忍) -
PreferNoSchedule—— 尽量避免调度到该节点,但不是强制 -
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. 常见用途
-
专用节点:
比如某些节点专门跑数据库,就给这些节点打污点dedicated=database:NoSchedule,
只有声明容忍的数据库 Pod 能调度上去。 -
隔离关键业务:
一些节点只跑系统组件(如 kube-proxy、CoreDNS),普通业务 Pod 不允许调度。 -
驱逐机制:
使用NoExecute,可以让不匹配的 Pod 从节点上被驱逐,比如节点进入不可用状态时。