污點(Taint)針對節點來說,和節點親和性正好相對,節點親和性使Pod被吸引到一類特定的節點,而污點則使節點能夠排斥一類特定的Pod。
容忍度(Toleration)應用于Pod上,它用來允許調度器調度帶有對應污點的節點。 容忍度允許調度但并不保證調度:作為其功能的一部分, 調度器也會評估其他參數。
污點和容忍度(Toleration)相互配合,可以避免Pod被分配到不合適的節點上。 每個節點上都可以應用一個或多個污點,這表示對于那些不能容忍這些污點的Pod, 是不會被該節點接受的。
設置污點命令格式:
kubectl taint node [node] key=value:[effect]說明:
其中[effect] 可取值:[ NoSchedule | PreferNoSchedule | NoExecute ]:
NoSchedule :一定不能被調度,已經在運行中的Pod不受影響。
PreferNoSchedule:盡量不要調度,實在沒有節點可調度再調度到此節點。
NoExecute:不僅不會調度,還會驅逐Node上已有的Pod。清除污點命令格式:
kubectl taint node [node] key:[effect]-示例:
kubectl taint node k8s-worker1 name=liing:NoSchedule
root@k8s-master:/home/vagrant# kubectl describe nodes k8s-worker1 |grep Taint -A 5
Taints: name=liing:NoSchedule
Unschedulable: false
Lease:HolderIdentity: k8s-worker1AcquireTime: <unset>RenewTime: Thu, 12 Dec 2024 00:40:43 +0800
設置容忍度的幾種規則:
?
1)完全匹配
tolerations:
- key: "taintKey" #和污點的key名字保持一致operator: "Equal" #匹配類型,Equal表示匹配污點的所有值value: "taintValue" #和污點key的值保持一致effect: "NoSchedule" #污點類型
說明:
Pod 的 Toleration 聲明中的key和effect需要與Taint的設置保持一致。
Operator如果設置為Equal,則key和value,要和Taint的設置保持一致。2)不完全匹配
tolerations:
- key: "taintKey" #和污點的key名字保持一致operator: "Exists" #匹配類型,只要符合污點設置的key即可effect: "NoSchedule" #污點的類型
Operator如果設置為Exists,則不需要指定value,只看key名字3)大范圍匹配
tolerations:
- key: "taintKey" #和污點的key名字保持一致operator: "Exists"
說明:
如果不設置effect,則只需要看key名字即可,不管Taint里的effect設置為什么都會匹配到4)匹配所有
tolerations:
- operator: "Exists"
說明:
如果省略key和effect,則匹配所有Taint, 在k8s中的daemonsets資源默認情況下是容忍所有污點的。驅逐延緩時間設置
tolerations:
- key: "key1"operator: "Equal"value: "value1"effect: "NoExecute"tolerationSeconds: 3600說明:
如果這個Pod 正在運行,那么Pod還將繼續在節點上運行3600秒,然后被驅逐。 如果在此之前上述污點被刪除了,則Pod不會被驅逐。
完整Pod YAML示例:
vi pod.yamlapiVersion: v1
kind: Pod
metadata:name: nglabels:env: dev
spec:containers:- name: ngimage: nginx:1.21.0tolerations:- key: nameoperator: Existseffect: NoSchedule
root@k8s-master:/home/vagrant# kubectl taint node k8s-worker2 disk=vmve:NoSchedule
node/k8s-worker2 tainted
root@k8s-master:/home/vagrant# kubectl taint node k8s-worker1 name=liing:NoSchedule
node/k8s-worker1 tainted
root@k8s-master:/home/vagrant# kubectl create -f pod.yaml
pod/ng created
root@k8s-master:/home/vagrant# kubectl get -f pod.yaml -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
ng 1/1 Running 0 11s 172.16.194.66 k8s-worker1 <none> <none>