污点和容忍
污点(Taint) 它使节点能够排斥一类特定的 Pod。
容忍度(Toleration) 是应用于 Pod 上的。容忍度允许调度器调度带有对应污点的 Pod。 容忍度允许调度但并不保证调度:作为其功能的一部分, 调度器也会评估其他参数。
讲解
每个污点由三个部分组成,格式为:key=value:effect
effect(效果)指示了污点的影响。Kubernetes 中定义了以下几种效果:
NoSchedule:新 Pod 不会被调度到该节点(除非容忍),已运行的 Pod 不受影响
PreferNoSchedule:尽量不调度新 Pod 到该节点,但不是强制要求
NoExecute:立即驱逐已经在节点上运行的不容忍该污点的 Pod,并且不允许调度新的不容忍该污点的 Pod
operator 为 Exists:
容忍度会匹配所有具有相同 effect 的污点
如果 key 为空,则匹配所有 key
如果 effect 为空,则匹配所有 effect
operator 为 Equal:
key 和 value 必须完全匹配
effect 必须匹配
特殊容忍度:
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"