前言

如果已经将kubernetes用于实践,常常需要k8s的一些高级特性才能满足实际需求。
这不,我们需要搭建性能测试平台,但是不想重新搭建一套k8s环境,但又不想原来运行在k8s的应用调度到新的节点上,影响测试结果。
经过一番研究,发现k8s的污点和容忍的特性满足了我们需求。下面将介绍一下污点和容忍度。

污点(Taints)

k8s可以给node添加污点,对于添加了污点的node会和pod产生排斥,甚至会驱逐pod,使得pod无法调度到该node。
那么如何对node添加污点呢?使用以下命令即可对node添加污点:

kubectl taint nodes node1 key=value:{effect}

其中effect目前k8s有三个可以支持的指令:

  1. NoSchedule 如果pod不能容忍node上的污点,pod则不能被调度到包含这些污点的节点上,已有pod不受影响
  2. PreferNoSchedule 如果pod不能容忍node上的污点,k8s将会优先将pod调度到其他节点,但仍有机会将pod调度到该node上
  3. NoExecute 如果pod不能容忍node上的污点,pod无法调度到这个node 上,已有的无法容忍污点的pod也会被驱逐。

查看污点:

kubectl describe nodes node1 | grep -A 5 Tain

删除污点:

kubectl taint node node1 key:NoSchedule-

容忍(Tolerations)

为保证指定pod调度到想要的node上,可以在pod上设置容忍,

tolerations:
- key: "key1"
  operator: "Equal"
  value: "value1"
  effect: "NoSchedule"
  tolerationSeconds: 3600
- key: "key1"
  operator: "Equal"
  value: "value1"
  effect: "NoExecute"
- key: "key2"
  operator: "Exists"
  effect: "NoSchedule"

这样就可以将我们pod调度到指定的node节点上。

  • 其中key, vaule, effect要与Node上设置的taint保持一致
  • operator的值为Exists将会忽略value值
  • tolerationSeconds用于描述当Pod需要被驱逐时可以在Pod上继续保留运行的时间。

这里说明一下两个特例,参考青蛙小白
示例1: 当不指定key值时,表示容忍所有的污点key:

tolerations:
- operator: "Exists"

示例2:当不指定effect值时,表示容忍所有的污点作用:

tolerations:
- key: "key"
  operator: "Exists"

实际应用

明白了上面的原理,实现起来就很简单了,分为以下几个步骤:

  1. 对新加的node打上标签: oc label nodes node1 node2 ... machine=capability
  2. 对新加的node打上污点:oc taint nodes node1 node2 ... key=value:NoSchedule
  3. 修改性能测试应的编排文件,在spec增加pod容忍配置,如:
spec:
  nodeSelector:
    machine: capability
  tolerations:
  - effect: NoSchedule
    key: key
    operator: Exists

这样就大工告成了,收工下班。。。

参考文档:
Kubernetes Pod调度进阶:Taints(污点)和Tolerations(容忍)
Taints and Tolerations


 目录


买个卤蛋,吃根冰棒