污点和容忍度 ¶
污点和容忍度
-
污点(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
。
-
一个容忍度和一个污点相“匹配”是指它们有一样的键名和效果,并且:
- 如果
operator
是Exists
(此时容忍度不能指定 value),或者 - 如果
operator
是Equal
,则它们的 value 应该相等。
- 如果
effect 字段的允许值包括:
-
NoExecute
- 这会影响已在节点上运行的 Pod,具体影响如下:
- 如果 Pod 不能容忍这类污点,会马上被驱逐。
- 如果 Pod 能够容忍这类污点,但是在容忍度定义中没有指定 tolerationSeconds, 则 Pod 还会一直在这个节点上运行。
- 如果 Pod 能够容忍这类污点,而且指定了 tolerationSeconds, 则 Pod 还能在这个节点上继续运行这个指定的时间长度。 这段时间过去后,节点生命周期控制器从节点驱除这些 Pod。
- 这会影响已在节点上运行的 Pod,具体影响如下:
-
NoSchedule
- 除非具有匹配的容忍度规约,否则新的 Pod 不会被调度到带有污点的节点上。 当前正在节点上运行的 Pod 不会被驱逐。
-
PreferNoSchedule
- PreferNoSchedule 是“偏好”或“软性”的 NoSchedule。 控制平面将尝试避免将不能容忍污点的 Pod 调度到的节点上,但不能保证完全避免。