污點(taint)能夠使節點排斥某些特定的Pod,從而避免Pod調度到該節點上。
污點
節點污點是與“效果”相關聯的鍵值對。以下是可用的效果:
- NoSchedule:不能容忍此污點的 Pod 不會被調度到節點上;現有 Pod 不會從節點中逐出。
- PreferNoSchedule:Kubernetes 會盡量避免將不能容忍此污點的 Pod 安排到節點上。
- NoExecute:如果 Pod 已在節點上運行,則會將該 Pod 從節點中逐出;如果尚未在節點上運行,則不會將其安排到節點上。
使用kubectl taint node nodename 命令可以給節點增加污點,如下所示。
$ kubectl get node
NAME STATUS ROLES AGE VERSION
192.168.10.170 Ready 73d v1.19.8-r1-CCE21.4.1.B003
192.168.10.240 Ready 4h8m v1.19.8-r1-CCE21.6.1.2.B001
$kubectl taint node 192.168.10.240 key1=value1:NoSchedule
node/192.168.10.240 tainted
通過describe命名和get命令可以查看到污點的配置。
$ kubectl describe node 192.168.10.240
Name: 192.168.10.240
...
Taints: key1=value1:NoSchedule
..
$ kubectl get node 192.168.10.240 -oyaml
apiVersion: v1
...
spec:
providerID: 06a5ea3a-0482-11ec-8e1a-0255ac101dc2
taints:
-effect: NoSchedule
key: key1
value: value1
...
去除污點可以使用如下命令,在NoSchedule后加一個“-”。
$ kubectl taint node 192.168.10.240 key1=value1:NoSchedule-
node/192.168.10.240 untainted
$ kubectl describe node 192.168.10.240
Name: 192.168.10.240
...
Taints:
...
在CCE控制臺上同樣可以管理節點的污點,且可以批量操作。
步驟 1 登錄CCE控制臺。
步驟 2 單擊集群名稱進入集群,在左側選擇“節點管理”,勾選節點,單擊左上方“標簽與污點管理”。
步驟 3 在彈出的窗口中,在“批量操作”下方單擊“新增批量操作”,單擊“添加/更新”,選擇“污點(Taints)”。
填寫需要增加污點的“鍵”和“值”,選擇污點的效果,單擊“確定”。
圖 添加污點

步驟 4 污點添加成功后,再次進入該界面,在節點數據下可查看到已經添加的污點。
節點調度設置
在CCE控制臺上可以配置調度設置,登錄CCE控制臺進入節點,選擇“節點管理”,在節點列表右側單擊“更多 > 禁止調度”。

彈出如下對話框,單擊“確認”,即可將節點設置為不可調度。

這個操作會給節點打上污點,使用kubectl可以查看污點的內容。
$ kubectl describe node 192.168.10.240
...
Taints: node.kubernetes.io/unschedulable:NoSchedule
...
在CCE控制臺相同位置再次設置,即可將去除污點,將節點設置為可調度。

容忍度(Toleration)
容忍度應用于Pod上,允許(但并不要求)Pod 調度到帶有與之匹配的污點的節點上。
污點和容忍度相互配合,可以用來避免** **Pod 被分配到不合適的節點上。 每個節點上都可以應用一個或多個污點,這表示對于那些不能容忍這些污點的 Pod,是不會被該節點接受的。
可以在Pod 中容忍度。
apiVersion: v1
kind: Pod
metadata:
name: nginx
labels:
env: test
spec:
containers:
-name: nginx
image: nginx
imagePullPolicy: IfNotPresent
tolerations:
-key: "key1"
operator: "Equal"
value: "value1"
effect: "NoSchedule"
上面示例表示這個Pod容忍標簽為key1=value1,效果為NoSchedule的污點,所以這個Pod能夠調度到對應的節點上。
同樣還可以按如下方式寫,表示當節點有key1這個污點時,可以調度到節點。
tolerations:
-key: "key1"
operator: "Exists"
effect: "NoSchedule"