K8s 污点(Taints)与容忍(Tolerations)
Posted catoop
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了K8s 污点(Taints)与容忍(Tolerations)相关的知识,希望对你有一定的参考价值。
概念
先来看一个容忍标记和污点标记的调度关系图:
-
与 亲和性(点击查看) 不同的是:Taints(污点)恰恰相反,它可以 Pod 不被调度到污点 Node,甚至将已经在污点中运行的 Pod 驱逐掉。
-
Taints(污点)是Node的一个属性,设置了 Taints 后,因为有了污点,所以 Kubernetes 是不会将Pod调度到这个Node上的,但是有时候我们还想让系统稍微 “人情化/灵活一些”,于是Kubernetes又给Pod设置了 Tolerations(容忍)这样的属性,只要 Pod 能够容忍Node上的污点,那么Kubernetes就会忽略Node上的污点,就还是能够(不是必须)把Pod调度过去。
-
因为污点默认排斥所有Pod的特性,我们有时候可以反向利用一下这个规则。比如给某一个特定Node标记污点后,然后给特定的Pod设置对应的容忍规则,来实现让这个Node只给这个Pod使用的目的(就好比一个集群里有100个Node,如果使用亲和性来实现,你得为99台机器设定规则,而使用 “污点+容忍度+亲和性组合配置相应的策略” 就可以只处理1台机器的规则就可以了)。
-
Taints 通常与 Tolerations 配合使用。
实例
污点
1、设置污点
语法:kubectl taint nodes [node_name] key=value:[effect]
其中[effect] 可取值 NoSchedule
、PreferNoSchedule
、NoExecute
-
NoSchedule:Pod 不会被调度到标记为 Taints 节点,只会影响新的 Pod 调度,当前已经在Node上的 Pod 保持不受影响。
-
PreferNoSchedule:这是一个NoSchedule 的软策略版本,系统会尽量(非强制)避免在节点上放置一个不能容忍污点的 Pod。
-
NoExecute:该选项意味着一旦 Taint 生效,如该节点内正在运行的 Pod 没有对应 Tolerations 设置,会直接被逐出。
示例:kubectl taint node myk8s-node1 test=node1:NoSchedule
一个 node 上可以设置多个污点标记。
2、查看已经设置的污点
语法:kubectl describe node [node_name]
在输出的信息中查看 Taints 信息
示例:kubectl describe node myk8s-node1
3、删除污点
语法:kubectl taint nodes [node_name] key[:effect]-
去除污点标记,使用对应规则后增加一个 “减号符号
”,根据 key及effect 信息去除,不需要指定 value,有两种去除方式:
示例:
1、去除指定 key 下的指定 effect 类型的污点:kubectl taint nodes myk8s-node1 test:NoSchedule-
2、去除指定 key 下的所有污点:kubectl taint nodes myk8s-node1 test-
Pod 容忍度
1、规则说明
对于 tolerations 属性的写法,主要包括 key、operator、value、effect、
五个字段,其中 key、value、effect
这3个字段要与 Node 中设置的 Taint 保持一致。
其中 operator
对应 Exists 和 Equal
可选,要点如下:
-
如果 operator 的值是Exists(存在),则 value 属性不应该提供。
-
如果 operator 的值是Equal(等于),则表示其 key 和 value 应分别等于 Node 中 Taint 的 key 和
value 才表示规则对应。 -
如果不指定operator属性,则默认值为Equal。
另外,还有两个特殊情况:
-
空的 key 如果再配合 Exists 就能匹配所有的key与value ,也是是能容忍所有 node 的所有 Taints。
-
空的 effect 匹配所有的 effect。
最后,字段 tolerationSeconds
为可选字段(应对 NoExecute 规则的污点),用来设置当规则符合驱逐条件的情况下,Pod 还可以在这个 Node 之上运行多久,给它们一点宽限的时间,到时间才驱逐(默认是立即驱逐)。
2、Pod 配置示例
spec:
tolerations:
- key: "test"
operator: "Equal" #如果操作符为Exists,那么 value 属性不应该提供
value: "node1"
effect: "NoExecute"
tolerationSeconds: 180 # 符合强制驱逐条件下,宽限时间为180秒
- key: "test1" # 必须不能调度到污点配置 “存在test1这个key” 的节点上
operator: "Exists"
effect: "NoSchedule"
- key: "test2" # 必须不能调度到污点配置 “test2=node99” 的节点上
operator: "Equal"
value: "node99"
effect: "NoSchedule"
- key: "test3" # 尽量不要调度到污点配置 “test3=node88” 的节点上
operator: "Equal"
value: "node88"
effect: "PreferNoSchedule"
(END)
以上是关于K8s 污点(Taints)与容忍(Tolerations)的主要内容,如果未能解决你的问题,请参考以下文章