我们都知道 k8s 集群中 master 节点默认是存在不可调度的污点的,也就是普通的 pod 默认是不会被调度到 master 节点的,这也是 Taint(污点) 的作用。
在实际应用中,也可能会给 worker 节点也去添加污点,是为了达到避免 Pod 调度到特定的节点中。
本文将会介绍关于节点 Taint 的设置以及如何调度要具有 Taint 的节点
Taint
应用场景:
- 专用节点,例如配备了特殊硬件的节点。
- 基于 Taint 的驱逐
查看 Taint
kubectl describe node [node_name] | grep -i taints
添加 Taint
kubectl taint node [node_name] key=value:{effect}
其中 effect
可取值:
- NoSchedule: 一定不能被调度(master节点默认存在该taint)
- PreferNoSchedule: 尽量不要调度
- NoExecute: 不仅不会调度,还会驱逐节点上已有的 pod
去除Taint
仅仅是在末尾添加了一个 -
kubectl taint node [node_name] key=value:{effect}-
Toleration
前面说到有污点的服务器是默认不会调度任何 pod 的,而 Toleration
就是用来打 Taint
的脸的。
使用 Toleration
可以允许 pod 被调度到存在污点的节点,当在特定场景下要使用存在污点的节点时,可做如下配置
apiVersion: apps/v1
kind: Deployment
metadata:
...
spec:
...
template:
spec:
tolerations:
- key: "disktype" # 污点的key
operator: "{Equal|Exists}" # 默认是Equal
value: "ssd1" # 污点的value
effect: "{NoSchedule|PreferNoSchedule|NoExcute}"
tolerationSeconds: 3600
tolerationSeconds
只有在 effect 为 NoExcute 时使用,表示当正在运行的节点,被添加了和容忍度一样,且 effect 为 NoExcute 的污点时,该pod还能继续在节点中运行的时长,3600s。不配置该参数,则不会被驱逐,可以完全容忍。
这里重点说一下 operator
,Equal
是等于的意思,节点污点的 value 必须与指定 value 相等,如:节点污点为 disytype=ssd:NoSchedule
,在上述示例中,指定的 value 为 ssd1
,则依旧不能被调度;Exists
是存在的意思,此时不可以指定 value ,只要节点污点中与容忍度指定的 key 和 effect 一致即可被调度。
说明
存在两种特殊情况:
如果一个容忍度的 key
为空且 operator 为 Exists
, 表示这个容忍度与任意的 key 、value 和 effect 都匹配,即这个容忍度能容忍任意 taint。
如果 effect
为空,则可以与所有键名 key1
的效果相匹配。