跳转至

污点和容忍度

污点和容忍度

  • 污点(Taint):

    • 它使节点能够排斥一类特定的 Pod
  • 容忍度(Toleration):

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

(1) 你可以给一个节点添加多个污点,也可以给一个 Pod 添加多个容忍度设置。

(2) 污点和容忍度(Toleration)相互配合,可以用来避免 Pod 被分配到不合适的节点上。

使用命令 kubectl taint 对节点污点操作。

给节点 node1 增加一个污点,它的键名是 key1,键值是 value1,效果是 NoSchedule。 这表示只有拥有和这个污点相匹配的容忍度的 Pod 才能够被分配到 node1 这个节点。

kubectl taint nodes node1 key1=value1:NoSchedule

移除上述命令所添加的污点

kubectl taint nodes node1 key1=value1:NoSchedule-

查找节点有什么污点

kubectl describe nodes|grep Taint

Pod 添加容忍度

说明

  • 存在两种特殊情况:

    • 如果一个容忍度的 key 为空且 operator 为 Exists, 表示这个容忍度与任意的 key、value 和 effect 都匹配,即这个容忍度能容忍任何污点。

    • 如果 effect 为空,则可以与所有键名 key1 的效果相匹配。

with-pod-affinity.yaml
apiVersion: v1
kind: Pod
metadata:
  name: nginx
  labels:
    env: test
spec:
  tolerations:
  - key: "example-key"
    operator: "Exists"
    effect: "NoSchedule"
  containers:
  - name: nginx
    image: nginx
    imagePullPolicy: IfNotPresent

operator 的默认值是 Equal

  • 一个容忍度和一个污点相“匹配”是指它们有一样的键名和效果,并且:

    • 如果 operatorExists(此时容忍度不能指定 value),或者
    • 如果 operatorEqual,则它们的 value 应该相等。

effect 字段的允许值包括:

  • NoExecute

    • 这会影响已在节点上运行的 Pod,具体影响如下:
      • 如果 Pod 不能容忍这类污点,会马上被驱逐。
      • 如果 Pod 能够容忍这类污点,但是在容忍度定义中没有指定 tolerationSeconds, 则 Pod 还会一直在这个节点上运行。
      • 如果 Pod 能够容忍这类污点,而且指定了 tolerationSeconds, 则 Pod 还能在这个节点上继续运行这个指定的时间长度。 这段时间过去后,节点生命周期控制器从节点驱除这些 Pod。
  • NoSchedule

    • 除非具有匹配的容忍度规约,否则新的 Pod 不会被调度到带有污点的节点上。 当前正在节点上运行的 Pod 不会被驱逐。
  • PreferNoSchedule

    • PreferNoSchedule 是“偏好”或“软性”的 NoSchedule。 控制平面将尝试避免将不能容忍污点的 Pod 调度到的节点上,但不能保证完全避免。