通过污点和容忍度,可以灵活地让 Pod 避开某些节点或者将 Pod 从某些节点驱逐。
一,污点 (taint)
1,概念
相对“节点”而言,标记污点的Node节点,Pod不会部署此节点上。
当我们在一个节点上打上污点以后,k8s 会认为尽量不要将 Pod 调度到该节点上,除非该 Pod 上面表示可以容忍该污点,且一个节点可以打多个污点,此时,则需要Pod 容忍所有污点才会被调度该节点。
污点定义在k8s集群的节点上的一个字段
taints是键值数据,用在Node节点上,定义污点。
2,命令
为节点打上污点:
kubectl taint node [node名] key=value:[影响值]
查看节点的污点:
kubectl describe node [node名]
# 显示内容:键值对
Taints: node-role.kubernetes.io/control-plane:NoSchedule
删除节点的污点:
kubectl taint node [node名] key=value:[影响值]-
注意:命令后面的“-”
减号,表示删除该污点。
3,taint属性:
影响值effect
- NoSchedule
- 如果pod能容忍这个node节点上的污点,就可以调度到这个node节点。
- 如果pod不能容忍这个node节点上污点,那么Pod就无法调度到该节点上。
- 如果node上的污点更改/新增加,对其上的pod不产生影响,仅仅对再加入的pod产生影响。
- NoExecute
- 如果 Pod 不能忍受这个node节点上的污点(无论是更改,还是新增的污点),Pod 均会马上被驱逐。
- 如果 Pod 能够忍受这类污点,但没有定义 tolerationseconds属性(时间值) ,则 Pod 还会一直在这个节点上运行。
- 如果 Pod 能够忍受这类污点,但定义了 tolerationseconds 属性(时间值) , 则 Pod 只能在该Node节点上,继续运行这个指定的时间长度( tolerationseconds)。
- PreferNoSchedule
- “最好不,但也可以。” 属于是NoSchedule的柔性版本。
二,容忍 (Toleration)
1,概念
相对 “Pod” 而言,能够容忍某个污点的Pod,就可以部署到所有节点上(包括标记该污点的节点)。
容忍,它是标注在pod 上的,当 pod 被调度时,如果没有配置容忍,则该 pod 不会被调度到有污点的节点上,只有该 pod 上标注了满足某个节点的所有污点,则会被调度到这些节点上。
tolerations是键值数据,用在pod上,定义容忍度,能容忍哪些污点
2,使用
pod 的 spec 下面配置容忍
spec:
tolerations:
-key: "污点的 key"
value:"污点的 value"
offect: "NoSchedule", #污点产生的影响
operator: "Equal"
# 表是 value 与污点的 value 要相等,也可以设置为Exists 表示存在 key 即可,此时可以不用配置value
3,tolerations属性:
影响值effect
-
Equal
- 比较操作类型为 Equal,则意味着必须与污点值做匹配,key/value都必须相同,才表示能够容忍该污点
-
Exists
- 容忍与污点的比较只比较 key,不比较 value,不关心 value 是什么东西,只要 key 存在,就表示可以容忍。