一、概述
在 Kubernetes(k8s)中,污點(Taints) 是定義在節點上的一種機制,用于拒絕某些 Pod 調度到該節點,除非這些 Pod 具有對應的容忍度(Tolerations)。污點可以用來控制 Pod 的調度行為,確保特定的 Pod 不會被分配到不合適的節點上。
容忍(Tolerations) 是與污點(Taints)相對應的一種機制。容忍允許 Pod 被調度到帶有特定污點的節點上,或者在節點被添加了特定污點后,允許已經運行在該節點上的 Pod 繼續運行。簡而言之,容忍是對污點的一種“豁免”機制。
污點的組成
-
Key:污點的鍵,用于標識污點的類型。
-
Value:污點的值,通常與 Key 一起用于標識污點的具體屬性。
-
Effect:污點的作用效果,有以下三種類型:
-
NoSchedule:沒有配置此污點容忍度的新 Pod 不能調度到此節點,但節點上已存在的 Pod 不受影響。
-
PreferNoSchedule:沒有配置此污點容忍度的新 Pod 盡量不要調度到此節點,但如果找不到合適的節點,仍然會調度到此節點。
-
NoExecute:沒有配置此污點容忍度的新 Pod 不能調度到此節點,同時節點上已存在的 Pod 也會被驅逐。
-
污點的使用場景
-
獨占節點:通過給節點添加污點,可以確保只有特定的 Pod 能夠調度到該節點。例如,某些節點可能具有特殊的硬件資源(如 GPU),可以通過污點和容忍度來限制只有特定的 Pod 能夠使用這些節點。
-
驅逐 Pod:當節點出現故障或資源不足時,Kubernetes 會自動為節點添加污點(如
node.kubernetes.io/memory-pressure
),并使用NoExecute
作為排斥等級,此時沒有設置此類污點容忍度的 Pod 會被驅逐。
污點的操作
-
添加污點:可以使用
kubectl taint
命令為節點添加污點。例如:kubectl taint nodes <node-name> <key>=<value>:<effect>
-
查看污點:可以使用
kubectl describe node
命令查看節點的污點信息:kubectl describe node <node-name> | grep 'Taints'
-
刪除污點:可以使用
kubectl taint
命令刪除節點的污點:kubectl taint nodes <node-name> <key>=<value>:<effect>-
?二、PreferNoSchedule
kubectl taint node node1 tag=huaiche:PreferNoSchedule
三、NoSchedule
kubectl taint node node1 tag=huaiche:NoSchedule
四、NoExecute
kubectl taint node node1 tag=huaiche:NoExecute
五、編寫容忍對應污點的Pod.yaml
apiVersion: v1
kind: Pod
metadata:name: my-pod
spec:tolerations:- key: "check-nginx"operator: "Equal"value: "web"effect: "NoSchedule"containers:- name: my-containerimage: my-image