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] 可取值 NoSchedulePreferNoScheduleNoExecute

  • 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)的主要内容,如果未能解决你的问题,请参考以下文章

k8s 实践经验pod 详解

K8S调度之Taints and Tolerations

K8S调度之Taints and Tolerations

K8S调度之Taints and Tolerations

k8s 污点和容忍

k8s 污点和容忍