pod调度之Taints和Tolerations(污点和容忍)

NodeAffinity节点亲和性,是Pod上定义的一种属性,使Pod能够按我们的要求调度到某个Node上。而Taints则恰恰相反,它可以让Node拒绝运行Pod,甚至驱逐Pod。
Taints(污点)是Node的一个属性,设置了Taints(污点)后,Kubernetes是不会将Pod调度到这个Node上的。
Kubernetes给Pod设置了个属性Tolerations(容忍),只要Pod能够容忍Node上的污点,那么Kubernetes就会忽略Node上的污点,就能够把Pod调度过去。
因此 Taints(污点)通常与Tolerations(容忍)配合使用。

  1. 设置污点
语法:
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:NoSchedule
node/kafka03 tainted
  1. 去除污点
去除指定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
  1. Pod 容忍污点示例:
    首先给node设置个污点以观察调度效果:
[root@bogon shell]# kubectl taint node kafka03 test=kafka03:NoSchedule
node/kafka03 tainted

当pod没有设置容忍时被调度到server01这个节点上了:

[root@bogon ~]# kubectl get pod -o wide|grep pod-taints
pod-taints           1/1     Running     0          5m1s   172.17.0.3   server01   <none>           <none>

  1. 给Pod设置容忍:
[root@bogon ~]# vim pod-taints-tolerations.yaml 

apiVersion: v1
kind: Pod
metadata:
  name: pod-taints-tolerations
  labels:
    app: redis
spec:
  tolerations: #设置容忍性
  - key: "test"
    operator: "Equal" #如果操作符为Exists,那么value属性可省略,如果不指定operator,则默认为Equal(=)
    value: "kafka03" #意思是这个Pod要容忍的有污点的Node的key是test Equal kafka03,效果是NoSchedule,
    effect: "NoSchedule"
  containers:
  - name: pod-tains-tolerations
    image: redis

容忍后就调度到另外一个Node上了。这需要在两个Node的Pod数量不平衡时才能看到效果。

[root@bogon ~]# kubectl get pod -o wide|grep pod-taints-tolerations
pod-taints-tolerations   1/1     Running     0          65s   172.17.0.4   kafka03   <none>           <none>

对于tolerations属性的写法:
其中的key、value、effect 与Node的Taint设置需保持一致, 还有以下几点说明:

  1. 如果operator的值是Exists,则value属性可省略。
  2. 如果operator的值是Equal,则表示其key与value之间的关系是equal(等于)。
  3. 如果不指定operator属性,则默认值为Equal。

另外,还有两个特殊值:

  1. 空的key 如果再配合Exists 就能匹配所有的key与value ,也就是能容忍所有node的所有Taints。
  2. 空的effect 匹配所有的effect。

通过对Taints和Tolerations的了解,可以知道,通过它们可以让某些特定应用,独占一个Node:(Taints+Tolerations+NodeAffinity)
给特定的Node设置一个Taint,只让某些特定的应用来容忍这些污点,容忍后就有可能会被调度到此特定Node,但是也不一定会调度给此特定Node。
设置容忍并不阻止调度器调度给其它Node,那么如何让特定应用的Node只能被调度到此特定的Node呢,这就要结合NodeAffinity节点亲和性,给Node打个标签,然后在Pod属性里设置NodeAffinity到Node。如此就能达到要求了。

你可能感兴趣的:(k8s)