Kubernetes 中的 Taints 和 Tolerations 是什么?

在 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 的工作流程是:

  1. 管理员在 Node 上添加 Taint,如 {key: “disk”, value: “ssd”, effect: “NoSchedule”}。
  2. 用户在Pod的 .spec.tolerations 定义与Taint匹配的容忍,如:
yaml
tolerations: 
- key: "disk"
  operator: "Equal"  
  value: "ssd"
  effect: "NoSchedule"
  1. Scheduler 在调度Pod时,会检查:
  • Pod没有定义与Node Taint匹配的容忍:不会调度到该节点。
  • Pod定义了与Node Taint匹配的容忍:会忽略该污点,允许调度到该节点。
  1. 如果Pod定义了容忍但与Node污点不匹配,会忽略该容忍,遵循与上面同样的检查规则。
  2. 如果Node Taint的effect是 NoExecute,则已存在的Pod需要定义相应的容忍,否则会被驱逐。

例如,一个Node上定义了污点 {cpu: high, effect: PreferNoSchedule},一个Pod定义了容忍:

yaml
tolerations:
- key: "cpu"
  operator: "Equal"
  value: "high"
  effect: "NoSchedule" 
  1. 根据 effect 为 PreferNoSchedule,Pod 不会优先调度到该 Node,但还是可以调度。
  2. Pod 定义了与该污点匹配的容忍,所以可以忽略该污点,允许调度到该 Node。
  3. 如果Pod没有定义该容忍,则Scheduler尽量不会调度到该Node。

所以总结来说,Taints 和 Tolerations 的主要作用是隔离特定的节点和控制Pod调度,其主要特征是:

  1. Taint定义在Node上,表示节点上的污点。
  2. Toleration定义在Pod上,表示对特定Taint的容忍。
  3. 根据effect控制Pod是否可以调度和驱逐。
  4. 可以实现基于节点特性的高级调度。