k8s污點與容忍
- k8s污點管理常用命令
- effect標記值
- 查看污點
- 添加污點
- 刪除污點
- node污點與容忍
- 污點容忍yaml示例
- 容忍放大
- 基于污點的驅逐
- 驅逐時排除指定服務
- 設置master調度
- 設置master盡量不調度
- 允許master節點調度pod
- 恢復Master Only狀態
- 將node標記為不可調度狀態(節點警戒)
- 設置node不可用并驅逐節點上的所有pod(騰空節點)
- 設置node為可用
k8s污點管理常用命令
effect標記值
effect標記值
查看污點
對于k8s1.24+
,master節點將不再添加node-role.kubernetes.io/master
標簽, 只會添加node-role.kubernetes.io/control-plane
標簽。更多信息請參考 KEP-2067:重命名 kubeadm “master” 標簽和污點。
https://kubernetes.io/zh-cn/blog/2022/04/07/upcoming-changes-in-kubernetes-1-24/
# 查看所有node的污點信息?:ml-citation{ref="1,5" data="citationList"}
kubectl describe nodes | grep -i Taints# 查看污點
kubectl describe nodes node名 |grep Taints
# Taints: node.kubernetes.io/unreachable:NoSchedule
添加污點
# 添加污點
kubectl taint nodes node名 key=value:effect值# 添加 NoSchedule 污點
kubectl taint nodes node1 app=monitoring:NoSchedule# 添加 NoExecute 污點(驅逐現有 Pod)
kubectl taint nodes node2 disk=ssd:NoExecute# 添加新污點
kubectl taint nodes node1 app=logging:NoExecute# 添加 盡量不調度 PreferNoSchedule
kubectl taint nodes k8s-master02 node-role.kubernetes.io/master:PreferNoSchedule## effect是標記值
kubectl taint nodes node1 key1=value1:NoSchedule
kubectl taint nodes node1 key1=value1:NoExecute
kubectl taint nodes node1 key2=value2:PreferNoSchedule# 給master1機器加NoSchedule污點--k8s1.23
kubectl taint nodes m1 node-role.kubernetes.io/control-plane:NoSchedule
刪除污點
# 去除污點
kubectl taint nodes node名 key:effec值-
## 或
kubectl taint nodes node名 key=value-
## 建議
kubectl taint nodes node名 key-# 刪除指定 key 和 effect 的污點
kubectl taint nodes node1 app=monitoring:NoSchedule-# 刪除所有 effect 類型的污點(需明確指定 key 和 effect)
kubectl taint nodes node2 disk=ssd:NoExecute-# 去除污點NoSchedule,最后一個"-"代表刪除
kubectl taint nodes k8s-master02 node-role.kubernetes.io/master:NoSchedule-# 刪除舊污點
kubectl taint nodes node1 app=monitoring:NoSchedule-
node污點與容忍
參考: 官方污點文檔
三只兔子的故事來了解k8s污點與容忍
為什么Node要使用污點:
- 安全考慮
- Node職責角色分工不同
- 硬件不同
污點也類似于在node上打一個標簽.例如專用節點
,比如GPU,SSD等,一般pod不會運行在這種專用節點,如果pod想運行在這種專用節點上,需要配置污點容忍
.
Taint
: 污點,避免pod調度到特定Node上,相當于排斥
Pod
Tolerations
: 污點容忍,允許pod調度到帶有特定Taints
的Node上
污點容忍yaml示例
apiVersion: v1
kind: Pod
metadata:name: nginxlabels:env: test
spec:containers:- name: nginximage: nginximagePullPolicy: IfNotPresent# 污點容忍tolerations:# 容忍key=example-key 等effect值存在NoSchedule- key: "example-key"operator: "Exists"# value: "example-value" # 可不配置effect: "NoSchedule"
容忍放大
k8s的一些基礎靜態pod,比如apiserver
,配置的就是容忍放大,下方是示例
容忍放大,只要key
或effect
存在即容忍.
apiVersion: v1
kind: Pod
metadata:name: apiserverlabels:env: test
spec:containers:- name: apiserverimage: apiserverimagePullPolicy: IfNotPresent# 污點容忍tolerations:# 容忍所有effect值為NoSchedule的污點- effect: NoScheduleoperator: Exists# 容忍污點key值CriticaAddonsOnly存在- key: CriticaAddonsOnlyoperator: Exists# 容忍所有effect值為NoExecute的污點- effect: NoExecuteoperator: Exists
基于污點的驅逐
參考: 官方文檔
kubelet 驅逐策略詳解
污點的 effect 值 NoExecute
會影響(驅逐)已經在節點上運行的 Pod,如果Pod沒有配置容忍
effect 值為 NoExecute 的污點,會被立即驅逐
.
Pod配置了容忍NoExecute
,但在容忍度定義中沒有指定 tolerationSeconds(寬限期)
,則 Pod 還會一直在這個節點上運行。
Pod配置了容忍NoExecute
,,而且指定了 tolerationSeconds(寬限期)
, 則 Pod 還能在這個節點上繼續運行這個指定的時間長度。
當節點故障
時,節點控制器會自動給節點添加一個(內置)污點
.如果異常狀態恢復正常,kubelet 或節點控制器能夠移除相關的污點。
驅逐時排除指定服務
# 說明:此命令將驅逐節點上運行的pod服務
## --ignore-daemonsets 驅逐的時候排除daemonset類型服務
[root@wps]# kubectl drain 10.226.xxx.xxx --ignore-daemonsets
設置master調度
設置master盡量不調度
盡量不調度
的污點PreferNoSchedule
;
禁止調度并驅逐
的污點NoExecute
# master添加 盡量不調度 PreferNoSchedule
kubectl taint nodes k8s-master02 node-role.kubernetes.io/master:PreferNoSchedule
允許master節點調度pod
# 去除污點NoSchedule,最后一個"-"代表刪除污點# 允許所有master節點調度pod
kubectl taint nodes --all node-role.kubernetes.io/master-# 允許master2節點調度pod;
kubectl taint nodes k8s-master02 node-role.kubernetes.io/master:NoSchedule-
恢復Master Only狀態
參考: https://cloud.tencent.com/developer/article/1788356
# 指定master1為Only狀態(加污點,不允許pod調度)
kubectl taint node maser1 node-role.kubernetes.io/master="":NoSchedule
將node標記為不可調度狀態(節點警戒)
# 將node標記為不可調度狀態(節點警戒)
kubectl cordon node名
設置node不可用并驅逐節點上的所有pod(騰空節點)
當節點磁盤空間不足時,Pod被驅逐的順序為: BestEffort
先于 Burstable
# 切換到名為ek8s的集群
kubectl config use-context ek8s# 查看node狀態
kubectl get nodes# 設置節點不可用并驅逐節點上的所有pod(騰空節點)
## 節點排水(驅逐節點上的所有pod)
## 忽略節點上不能殺死的特定系統Pod,例如:CNI插件,daemonSet
## --delete-local-data 清空本地數據
## --ignore-daemonsets 忽略daemonsets錯誤
## --force 強制執行
kubectl drain ek8s-node-1 --ignore-daemonsets --force # 考試執行
## 如果報錯,加--delete-local-data 清空本地數據
kubectl drain ek8s-node-1 --delete-local-data --ignore-daemonsets --force # 練習執行# 查看node狀態
kubectl get nodes# 查看污點
kubectl describe nodes node名 |grep Taints
# Taints: node.kubernetes.io/unreachable:NoSchedule
設置node為可用
# 標記my-node 節點為可以調度
kubectl uncordon node名# 取消污點
## 如果已存在具有指定鍵和效果的污點,則替換其值為指定值。
kubectl taint nodes node名 dedicated=special-user:NoSchedule# 去除污點NoSchedule,最后一個"-"代表刪除
kubectl taint nodes node名 node-role.kubernetes.io/master:NoSchedule-# 查看污點是否去除
kubectl describe nodes node名 |grep Taints