文章目錄
- 污點與污點容忍
- 1、 污點(taint)
- 2、操作命令
- 3、污點容忍
- 4、污點擴展
污點與污點容忍
1、 污點(taint)
- 污點是節點的屬性,用于排斥一類特定的 Pod。
- 通過污點,可以避免 Pod 被調度到不合適的節點上
污點組成
key=value:effect
- key:污點的鍵。
- value:污點的值(可為空)。
- effect:污點的作用效果。
污點效果(effect):
效果 | 描述 |
---|---|
NoSchedule | 不會將 Pod 調度到具有該污點的節點上。 |
PreferNoSchedule | 盡量避免將 Pod 調度到具有該污點的節點上。 |
NoExecute | 不會將 Pod 調度到具有該污點的節點上,并驅逐節點上已有的 Pod。 |
2、操作命令
- 設置污點
kubectl taint node <節點名稱> <污點key>=<value>:<effect>
#示例
kubectl taint node node01 key1=value1:NoSchedule
- 查看污點
kubectl describe node <node-name>
kubectl describe nodes <節點名稱> | grep -A 5 Taints
- 刪除污點
kubectl taint node <節點名稱> <污點key>:<effect>-#示例
kubectl taint node node01 key1:NoSchedule-
3、污點容忍
- 容忍是 Pod 的屬性,允許 Pod 被調度到具有匹配污點的節點上。
容忍配置:
在 Pod 的 YAML 文件中的 spec.tolerations
字段進行配置:
spec:tolerations:- operator: Equal|Existskey: <污點key>value: <污點value>effect: NoSchedule|PreferNoSchedule|NoExecutetolerationSeconds: 3600
字段說明:
字段 | 描述 |
---|---|
key | 污點的鍵,需與節點污點一致。 |
operator | 匹配操作符,Equal (值相等)或 Exists (存在即可,忽略值)。 |
value | 污點的值(operator 為 Equal 時需指定)。 |
effect | 污點的效果,需與節點污點一致。 |
tolerationSeconds | Pod 被驅逐前可在節點上繼續運行的時間(僅對 NoExecute 有效)。 |
示例:
apiVersion: v1
kind: Pod
metadata:name: myapp01labels:app: myapp01
spec:containers:- name: with-node-affinityimage: soscscs/myapp:v1tolerations:- key: "check"operator: "Equal"value: "mycheck"effect: "NoExecute"tolerationSeconds: 3600
應用場景
- 專用節點:
- 為某些節點設置污點,確保只有特定 Pod 可以調度到這些節點。
- 示例:GPU 節點僅運行需要 GPU 的任務。
- 節點維護:
- 設置
NoExecute
污點,驅逐節點上的 Pod 以便維護。
- 設置
- 高可用部署:
- 使用
NoSchedule
或PreferNoSchedule
,確保 Pod 分散在不同節點上。
- 使用
示例:
設置污點:
kubectl taint node node01 check=mycheck:NoExecute
查看污點
kubectl describe node node01
創建容忍pod
kubectl apply -f pod-with-toleration.yaml
驗證pod步驟
kubectl get pods -o wide
4、污點擴展
污點(Taints)注意事項
-
容忍所有污點 key
- 當不指定
key
值時,使用Exists
操作符可以容忍節點上的所有污點 key。
tolerations: - operator: "Exists"
- 當不指定
-
容忍所有污點作用
- 當不指定
effect
值時,只要污點的key
匹配,無論其作用(如NoSchedule
,PreferNoSchedule
,NoExecute
)是什么,都會被容忍。
tolerations: - key: "key"operator: "Exists"
- 當不指定
-
多 Master 節點設置
- 在有多個 Master 節點的情況下,為了避免資源浪費,可以將 Master 節點設置為
PreferNoSchedule
,這樣默認情況下不會調度 Pod 到 Master 節點,但在必要時可以調度。
kubectl taint node Master-Name node-role.kubernetes.io/master=:PreferNoSchedule
- 在有多個 Master 節點的情況下,為了避免資源浪費,可以將 Master 節點設置為
污點應用實例
-
設置 NoExecute 污點
- 當某個 Node 需要更新升級系統組件時,可以先在該 Node 上設置
NoExecute
污點,以驅逐該 Node 上的所有 Pod。
kubectl taint node node01 check=mycheck:NoExecute
- 當某個 Node 需要更新升級系統組件時,可以先在該 Node 上設置
-
臨時設置 PreferNoSchedule 污點
- 如果其他 Node 資源不足,可以臨時將 Master 節點設置為
PreferNoSchedule
,允許在必要時調度 Pod 到 Master 節點。
kubectl taint node master node-role.kubernetes.io/master=:PreferNoSchedule --overwrite
- 如果其他 Node 資源不足,可以臨時將 Master 節點設置為
-
移除污點
- 更新操作完成后,移除之前設置的污點。
kubectl taint node node01 check=mycheck:NoExecute-
節點維護操作
-
查看節點
- 使用
kubectl get nodes
查看集群中的所有節點。
- 使用
-
標記節點為不可調度
- 使用
kubectl cordon <NODE_NAME>
將節點標記為不可調度狀態,防止新創建的 Pod 調度到此節點。
kubectl cordon <NODE_NAME>
- 使用
-
驅逐節點上的 Pod
- 使用
kubectl drain <NODE_NAME>
命令驅逐節點上的所有 Pod,并設置節點為不可調度狀態。
kubectl drain <NODE_NAME> --ignore-daemonsets --delete-emptydir-data --force
- 參數解釋:
--ignore-daemonsets
:忽略 DaemonSet 管理的 Pod。--delete-emptydir-data
:強制刪除掛載了本地卷的 Pod。--force
:強制驅逐非控制器管理的 Pod。
- 使用
-
標記節點為可調度
- 使用
kubectl uncordon <NODE_NAME>
將節點標記為可調度狀態,允許新 Pod 調度到此節點。
kubectl uncordon <NODE_NAME>
- 使用