在 Kubernetes 中,Taints 和 Tolerations 用于容忍节点污点,实现更高级的 Nodes 选择与调度。
- Taints(污点):节点上的标识,影响其他对象(如 Pod)调度到该节点上。
- Tolerations(容忍):Pod 对象上的设置,允许(容忍)其调度到具有匹配污点的节点上。
Taints 和 Tolerations 的主要作用是:
- 控制 Pod 调度到特定 Node 上。
- 隔离特定节点,避免 Pod 调度上去。
- 实现更丰富的调度规则。
Taint 定义在 Node 的 .spec.taints 字段,包含以下主要属性:
- key:污点键,如 disk。
- value:污点值,如 ssd。
- effect:
- NoSchedule:不能调度Pod。
- PreferNoSchedule:尽量不调度Pod。
- NoExecute:不能调度新Pod,会驱逐已存在的Pod。
Toleration 定义在 Pod 的 .spec.tolerations 字段,包含以下主要字段:
- key:与 Taint 的 key 相匹配,为空表示匹配任意污点键。
- operator:
- Equal:与 Taint 的 value 相等。
- Exists:忽略 Taint 的 value,只要存在对应键的污点就匹配。
- value:与 Taint 的 value 相等。
- effect:与 Taint 的 effect 匹配,为空表示匹配任意effect。
Taints 和 Tolerations 的工作流程是:
- 管理员在 Node 上添加 Taint,如 {key: “disk”, value: “ssd”, effect: “NoSchedule”}。
- 用户在Pod的 .spec.tolerations 定义与Taint匹配的容忍,如:
yaml
tolerations:
- key: "disk"
operator: "Equal"
value: "ssd"
effect: "NoSchedule"
- Scheduler 在调度Pod时,会检查:
- Pod没有定义与Node Taint匹配的容忍:不会调度到该节点。
- Pod定义了与Node Taint匹配的容忍:会忽略该污点,允许调度到该节点。
- 如果Pod定义了容忍但与Node污点不匹配,会忽略该容忍,遵循与上面同样的检查规则。
- 如果Node Taint的effect是 NoExecute,则已存在的Pod需要定义相应的容忍,否则会被驱逐。
例如,一个Node上定义了污点 {cpu: high, effect: PreferNoSchedule},一个Pod定义了容忍:
yaml
tolerations:
- key: "cpu"
operator: "Equal"
value: "high"
effect: "NoSchedule"
- 根据 effect 为 PreferNoSchedule,Pod 不会优先调度到该 Node,但还是可以调度。
- Pod 定义了与该污点匹配的容忍,所以可以忽略该污点,允许调度到该 Node。
- 如果Pod没有定义该容忍,则Scheduler尽量不会调度到该Node。
所以总结来说,Taints 和 Tolerations 的主要作用是隔离特定的节点和控制Pod调度,其主要特征是:
- Taint定义在Node上,表示节点上的污点。
- Toleration定义在Pod上,表示对特定Taint的容忍。
- 根据effect控制Pod是否可以调度和驱逐。
- 可以实现基于节点特性的高级调度。