NodeAffinity节点亲和性,是Pod上定义的一种属性,使Pod能够按我们的要求调度到某个Node上。而Taints则恰恰相反,它可以让Node拒绝运行Pod,甚至驱逐Pod。
Taints(污点)是Node的一个属性,设置了Taints(污点)后,Kubernetes是不会将Pod调度到这个Node上的。
Kubernetes给Pod设置了个属性Tolerations(容忍),只要Pod能够容忍Node上的污点,那么Kubernetes就会忽略Node上的污点,就能够把Pod调度过去。
因此 Taints(污点)通常与Tolerations(容忍)配合使用。
- 设置污点
语法:kubectl taint NODE NAME KEY=VAL:TAINT_EFFECT其中[effect] 可取值:[ NoSchedule | PreferNoSchedule | NoExecute ]NoSchedule :一定不能被调度。PreferNoSchedule:尽量不要调度。NoExecute:不仅不会调度,还会驱逐Node上已有的Pod。
实例:[root@bogon shell]# kubectl taint node kafka03 test=kafka03:NoSchedulenode/kafka03 tainted
- 去除污点
去除指定key及其effect:kubectl taint nodes node_name key:[effect]- #(这里的key不用指定value)去除指定key所有的effect:kubectl taint nodes node_name key-
实例:[root@bogon shell]# kubectl taint node kafka03 test=kafka03:NoSchedule-node/kafka03 untainted[root@bogon shell]# kubectl taint node kafka03 test-node/kafka03 untainted
- Pod 容忍污点示例:
首先给node设置个污点以观察调度效果:
[root@bogon shell]# kubectl taint node kafka03 test=kafka03:NoSchedulenode/kafka03 tainted
当pod没有设置容忍时被调度到server01这个节点上了:
[root@bogon ~]# kubectl get pod -o wide|grep pod-taintspod-taints 1/1 Running 0 5m1s 172.17.0.3 server01 <none> <none>
- 给Pod设置容忍:
[root@bogon ~]# vim pod-taints-tolerations.yamlapiVersion: v1kind: Podmetadata:name: pod-taints-tolerationslabels:app: redisspec:tolerations: #设置容忍性- key: \"test\"operator: \"Equal\" #如果操作符为Exists,那么value属性可省略,如果不指定operator,则默认为Equal(=)value: \"kafka03\" #意思是这个Pod要容忍的有污点的Node的key是test Equal kafka03,效果是NoSchedule,effect: \"NoSchedule\"containers:- name: pod-tains-tolerationsimage: redis
容忍后就调度到另外一个Node上了。这需要在两个Node的Pod数量不平衡时才能看到效果。
[root@bogon ~]# kubectl get pod -o wide|grep pod-taints-tolerationspod-taints-tolerations 1/1 Running 0 65s 172.17.0.4 kafka03 <none> <none>
对于tolerations属性的写法:
其中的key、value、effect 与Node的Taint设置需保持一致, 还有以下几点说明:
- 如果operator的值是Exists,则value属性可省略。
- 如果operator的值是Equal,则表示其key与value之间的关系是equal(等于)。
- 如果不指定operator属性,则默认值为Equal。
另外,还有两个特殊值:
- 空的key 如果再配合Exists 就能匹配所有的key与value ,也就是能容忍所有node的所有Taints。
- 空的effect 匹配所有的effect。
通过对Taints和Tolerations的了解,可以知道,通过它们可以让某些特定应用,独占一个Node:(Taints+Tolerations+NodeAffinity)
给特定的Node设置一个Taint,只让某些特定的应用来容忍这些污点,容忍后就有可能会被调度到此特定Node,但是也不一定会调度给此特定Node。
设置容忍并不阻止调度器调度给其它Node,那么如何让特定应用的Node只能被调度到此特定的Node呢,这就要结合NodeAffinity节点亲和性,给Node打个标签,然后在Pod属性里设置NodeAffinity到Node。如此就能达到要求了。