NodeAffinity节点亲和性,是在Pod上定义的一种属性,使得Pod能够被调度到某些Node上运行(优先选择或强制要求)。Taint则正好相反,它让Node拒绝Pod的运行。简单地说,被标记为Taint的节点就是存在问题的节点,比如磁盘要满、资源不足、存在安全隐患要进行升级维护,希望新的Pod不会被调度过来,但被标记为Taint的节点并非故障节点,仍是有效的工作节点,所以仍需将某些Pod调度到这些节点上时,可以通过使用Toleration属性来实现。
在默认情况下,在Node上设置一个或多个Taint之后,除非Pod明确声明能够容忍这些污点,否则无法在这些Node上运行。
一、容忍和污点Taint和Toleration
官 方 文 档 :
https://kubernetes.io/docs/concepts/scheduling-eviction/taint-and-toleration/
设计理念:
Taint(锁)污点在一类服务器上打上污点, 作用在节点上,让不能容忍这个污点的Pod不能部署在打了污点的服务器上。
Toleration(钥匙)容忍是让Pod容忍节点上配置的污点, 作用在pod上,可以让一些需要特殊配置的Pod能够调用到具有污点和特殊配置的节点上。
生产环境并非随便调度
部署容忍和污点Taint和Toleration
二、Taint配置解析
创建一个污点(一个节点可以有多个污点)如果node节点上有多个Taint,每个Taint都需要容忍才能部署上去。
示例:
kubectl taint nodes NODE_NAME TAINT_KEY=TAINT_VALUE:EFFECT
# 举例:
# kubectl taint nodes k8s-node01 ssd=true:NoSchedule
[root@k8s-master01 taint]#kubectl taint nodes k8s-node01 ssd=true:NoSchedule
node/k8s-node01 tainted
该Taint的键为ssd,值为true,Taint的效果是NoSchedule。这意味着除非Pod明确声明可以容忍
这个Taint,否则不会被调度到node1上。
重要解释:
-
NoSchedule:禁止调度到该节点,已经在该节点上的Pod不受影响。
-
NoExecute:禁止调度到该节点,如果不符合这个污点,会立马被驱逐(或在一段时间后)。
-
PreferNoSchedule:尽量避免将Pod调度到指定的节点上,如果没有更合适的节点,可以部署到该节点。
-
tolerationSeconds:它指的是Pod能够容忍某个节点污点的时间长度。
三、Toleration配置解析
作用在pod上
方式一:完全匹配,key和value、effect都和taint一样
tolerations:
- key: "taintKey"
operator: "Equal"
value: "taintValue"
effect: "NoSchedule"
方式二:不完全匹配,只需要key和effect就可以,不需要匹配value。比如GPU,可能有很多种类。
tolerations:
- key: "taintKey"
operator: "Exists"
effect: "NoSchedule"
方式三:大范围匹配,只需匹配key,(不推荐key为内置Taint)
- key: "taintKey"
operator: "Exists"
方式四:匹配所有(不推荐)