Taint 和 Toleration
節點親和性,是pod的一種屬性(偏好或硬性要求),它使pod被吸引到一類特定的節點。Taint 則相反,它使節點能夠排斥一類特定的 pod
Taint 和 toleration 相互配合,可以用來避免 pod 被分配到不合適的節點上。每個節點上都可以應用一個或多個taint ,這表示對於那些不能容忍這些 taint 的 pod,是不會被該節點接受的。如果將 toleration 應用於 pod上,則表示這些 pod 可以(但不要求)被調度到具有匹配 taint 的節點上
污點(Taint)
1、污點 ( Taint ) 的組成
使用kubectl taint命令可以給某個 Node 節點設置污點,Node 被設置上污點之後就和 Pod 之間存在了一種相斥的關係,可以讓 Node 拒絕 Pod 的調度執行,甚至將 Node 已經存在的 Pod 驅逐出去
key=value:effect
每個污點有一個 key 和 value 作爲污點的標籤,其中 value 可以爲空,effect 描述污點的作用。當前 tainteffect 支持如下三個選項:
-
NoSchedule:表示 k8s 將不會將 Pod 調度到具有該污點的 Node 上
-
PreferNoSchedule:表示 k8s 將盡量避免將 Pod 調度到具有該污點的 Node 上
-
NoExecute:表示 k8s 將不會將 Pod 調度到具有該污點的 Node 上,同時會將 Node 上已經存在的 Pod 驅逐出去
2、污點的設置、查看和去除
# 設置污點
kubectl taint nodes node1 KEY=VALUE:NoSchedule
# 節點說明中,查找 Taints 字段
kubectl describe pod pod-name
# 去除污點
kubectl taint nodes node1 KEY=VALUE:NoSchedule
容忍(Tolerations)
設置了污點的 Node 將根據 taint 的 effect:NoSchedule、PreferNoSchedule、NoExecute 和 Pod 之間產生互斥的關係,Pod 將在一定程度上不會被調度到 Node 上。但我們可以在 Pod 上設置容忍 ( Toleration ) ,意思是設置了容忍的 Pod 將可以容忍污點的存在,可以被調度到存在污點的 Node 上
pod.spec.tolerations
apiVersion: v1
kind: Pod
metadata:
name: test-pd
spec:
containers:
- image: wangyanglinux/myapp:v1
name: test-container
tolerations:
- key: "KEY"
operator: "Equal"
value: "VALUE"
effect: "NoSchedule"
tolerationSeconds: 3600
-
其中 key, vaule, effect 要與 Node 上設置的 taint 保持一致
-
operator 的值爲 Exists 將會忽略 value 值
-
tolerationSeconds 用於描述當 Pod 需要被驅逐時可以在 Pod 上繼續保留運行的時間
1、當不指定 key 值時,表示容忍所有的污點 key:
tolerations:
- operator: "Exists"
2、當不指定 effect 值時,表示容忍所有的污點作用
tolerations:
- key: "key"
operator: "Exists"
3、有多個 Master 存在時,防止資源浪費,可以如下設置
kubectl taint nodes Node-Name node-role.kubernetes.io/master=:PreferNoSchedule