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、设置污点:
2、去除污点:
3、Pod 容忍污点示例:
首先给node设置个污点以观察调度效果:
当pod没有设置容忍时被调度到10.3.1.17:
给Pod设置容忍:
对于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。
一个node上可以有多个污点:
比如 test=16:NoScheduler test2=16:NoSchedule
而在Pod容忍时只容忍了其中一个:
这样的结果是此Pod无法被调度到key为test的node( 10.3.1.16)上去,因为此Node上设置了两个污点,
而这个Pod只匹配到了一个污点,也就是只容忍了一个污点,所以可以再加一个容忍:
如果在设置node的Taints(污点)之前,就已经运行了一些Pod,那么这些Pod是否还能继续在此Node上运行? 这就要看设置Taints污点时的effect(效果)了。
如果effect的值是NoSchedule或PreferNoSchedule,那么已运行的Pod仍然可以运行,只是新Pod(如果没有容忍)不会再往上调度。
而如果effect的值是NoExecute,那么此Node上正在运行的Pod,只要没有容忍的,立刻被驱逐。
虽然是立刻被驱逐,但是K8S为了彰显人性化,又给具有NoExecute效果的污点, 在容忍属性中有一个可选的
tolerationSeconds字段,用来设置这些Pod还可以在这个Node之上运行多久,给它们一点宽限的时间,到时间才驱逐。
如果是以Pod来启动的,那么Pod被驱逐后, 将不会再被运行,就等于把它删除了。
如果是deployment/rc,那么删除的pod会再其它节点运行。
如果是DaemonSet在此Node上启动的Pod,那么也不会再被运行,直到Node上的NoExecute污被去除或者Pod容忍。
#设置Pod的宽限时间 spec: tolerations: #设置容忍性 - key: "test" operator: "Equal" #如果操作符为Exists,那么value属性可省略 value: "16" effect: "NoExecute" tolerationSeconds: 180 #如果运行此Pod的Node,被设置了具有NoExecute效果的Taint(污点),这个Pod将在存活180s后才被驱逐。 #如果没有设置tolerationSeconds字段,将永久运行。
通过对Taints和Tolerations的了解,可以知道,通过它们可以让某些特定应用,独占一个Node:
给特定的Node设置一个Taint,只让某些特定的应用来容忍这些污点,容忍后就有可能会被调度到此特定Node,
但是也不一定会调度给此特定Node,设置容忍并不阻止调度器调度给其它Node,那么如何让特定应用的Node
只能被调度到此特定的Node呢,这就要结合NodeAffinity节点亲和性,给Node打个标签,然后在Pod属性里
设置NodeAffinity到Node。如此就能达到要求了。
实例配置:
kubectl get deployment h5-weifeng -o yaml -n xitu-pretest tolerations: - effect: NoSchedule key: xitu operator: Equal value: pretest
kubectl describe nodes cn-hangzhou.172.16.1.236 Taints: xitu=pretest:NoSchedule
kubectl get pod -n xitu-pretest -o wide NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE mall-app-async-api-6c9d78c4b-msczt 1/1 Running 0 19h 10.20.2.68 cn-hangzhou.172.16.1.236 <none> mall-audit-provider-5b7b5f4d5-559nf 1/1 Running 1 47h 10.20.2.120 cn-hangzhou.172.16.1.236 <none> mall-basic-oss-web-567f7c6c76-h48kf 1/1 Running 0 45h 10.20.2.23 cn-hangzhou.172.16.1.236 <none>