污点和容忍

污点(Taint) 它使节点能够排斥一类特定的 Pod。

容忍度(Toleration) 是应用于 Pod 上的。容忍度允许调度器调度带有对应污点的 Pod。 容忍度允许调度但并不保证调度:作为其功能的一部分, 调度器也会评估其他参数。

讲解

每个污点由三个部分组成,格式为:key=value:effect

effect(效果)指示了污点的影响。Kubernetes 中定义了以下几种效果:

  • NoSchedule:新 Pod 不会被调度到该节点(除非容忍),已运行的 Pod 不受影响

  • PreferNoSchedule:尽量不调度新 Pod 到该节点,但不是强制要求

  • NoExecute:立即驱逐已经在节点上运行的不容忍该污点的 Pod,并且不允许调度新的不容忍该污点的 Pod

  1. operator 为 Exists:

  • 容忍度会匹配所有具有相同 effect 的污点

  • 如果 key 为空,则匹配所有 key

  • 如果 effect 为空,则匹配所有 effect

  1. operator 为 Equal:

  • key 和 value 必须完全匹配

  • effect 必须匹配

  1. 特殊容忍度:

  • operator: "Exists" (无 key 和 effect):容忍所有污点

  • 容忍 key: "node.kubernetes.io/not-ready"key: "node.kubernetes.io/unreachable" 可以处理节点故障情况

# 添加一个不允许普通Pod调度的污点
kubectl taint nodes node1 app=special:NoSchedule

# 添加一个尽量不调度的污点
kubectl taint nodes node2 gpu=nvidia:PreferNoSchedule

# 添加一个会驱逐Pod的污点
kubectl taint nodes node3 maintenance=true:NoExecute

# 查看污点
kubectl describe node <node-name> | grep Taints

## 删除
# 删除指定key和effect的污点
kubectl taint nodes <node-name> key:effect-
# 删除NoExecute污点
kubectl taint nodes node3 maintenance:NoExecute-

# 删除所有key的特定effect污点
kubectl taint nodes <node-name> key-
# 删除所有maintenance相关的污点
kubectl taint nodes node3 maintenance-

示例

使用命令 kubectl taint 给节点增加、移除一个污点:

# 添加污点
kubectl taint nodes node1 key1=value1:NoSchedule

# 容忍上边的污点
tolerations:
- key: "key1"
  operator: "Equal"
  value: "value1"
  effect: "NoSchedule"
# 或者
tolerations:
- key: "key1"
  operator: "Exists"
  effect: "NoSchedule"



# 移除污点
kubectl taint nodes node1 key1=value1:NoSchedule-



# 容忍所有污点
tolerations:
- operator: "Exists"


# 容忍特定污点效果的所有污点
tolerations:
- operator: "Exists"
  effect: "NoSchedule"