【k8s】Taint污点)、Toleration(容忍)
文章目录
- 1. 什么是Taint
- 1.1 Master 节点的 Taint 示例
- 1.2 普通 Pod 默认不容忍 master taint
- 1.3 示例:Pod 添加 toleration 来容忍 master taint
- 2. Taint 和 Label 概念区别
1. 什么是Taint
Taint(污点)是 Kubernetes 给节点贴的“禁止调度标签”,它告诉调度器:“除非 Pod 明确表示可以容忍,否则不要把它调度到这个节点上。”
通俗点说:
🧱 节点说:“我有特殊情况,不欢迎一般 Pod,除非你能接受我(加 toleration)。”
【Taint 的结构】:
一个 Taint 由三个部分组成:
key=value:effect
例如:
node-role.kubernetes.io/master=:NoSchedule
含义如下:
字段 | 解释 |
---|---|
key | 污点的名称,比如节点角色、资源状态 |
value | 可选,比如说 taint 的值 |
effect | 生效方式:见下方解释 |
【Taint 的 effect(生效方式)】:
effect | 意义 |
---|---|
NoSchedule | 不调度新的 Pod 到这个节点(除非 Pod 有 toleration) |
PreferNoSchedule | 尽量不要调度,但不是强制的(调度器尽量避免) |
NoExecute | 不仅不调度新的 Pod,还会驱逐已经在运行但不容忍的 Pod |
1.1 Master 节点的 Taint 示例
你可以运行下面命令看看 master 节点带了什么 taint:
kubectl describe node <master-node-name> | grep -i taint
结果通常类似这样:
Taints: node-role.kubernetes.io/master:NoSchedule
这个 taint 的含义是:
-
key: node-role.kubernetes.io/master
-
effect: NoSchedule(不允许 Pod 调度)
一般情况下,master节点不希望pod部署到其上面,因此会增加污点
1.2 普通 Pod 默认不容忍 master taint
如果你的 Pod 没有添加 toleration,它就会被默认 scheduler 拒之门外:
## 1.3 普通 Pod(默认不带 toleration)
apiVersion: v1
kind: Pod
metadata:name: test-pod
spec:containers:- name: busyboximage: busyboxcommand: ["sleep", "3600"]
这个 Pod 无法调度到 master 节点。
1.3 示例:Pod 添加 toleration 来容忍 master taint
如果你想让这个 Pod 可以调度到 master 节点,需要这样添加 toleration:
apiVersion: v1
kind: Pod
metadata:name: test-pod
spec:tolerations:- key: "node-role.kubernetes.io/master"operator: "Exists"effect: "NoSchedule"containers:- name: busyboximage: busyboxcommand: ["sleep", "3600"]
2. Taint 和 Label 概念区别
对象 | 用于 | 示例 |
---|---|---|
Label | 选择目标节点(配合 nodeSelector/affinity) | node-role.kubernetes.io/master=true |
Taint | 驱逐策略,Pod不能调度上去 | node-role.kubernetes.io/master:NoSchedule |
Toleration | Pod 对 taint 的容忍 | toleration: key=node-role.kubernetes.io/master |