九、K8s污點和容忍
文章目錄
- 九、K8s污點和容忍
- 1、污點(Taint)和容忍(Toleration)
- 1.1 什么是污點(Taint)?
- 1.2 什么是容忍(Toleration)?
- 1.3 污點的影響效果(Effect)
- 1.4 污點配置解析
- 1.5 常見內置污點
- 2、污點的增刪改查
- 2.1 添加污點
- 2.2 修改污點
- 2.3 查詢污點
- 2.4 刪除污點
- 3、污點和容忍使用場景實戰
- 3.1 K8s 主節點禁止調度
- 3.2 K8s 新節點禁止調度
- 3.3 K8s 節點維護流程
- 3.4 K8s 節點特殊資源保留
- 3.5 使用容忍調度到具有污點的節點
- 3.6 K8s 專用節點隔離
- 3.7 節點宕機快速恢復服務
- 4、常見問題
- 4.1 什么是污點和容忍?它們的作用是什么?
- 4.2 在K8s集群中如何劃分不同的租戶?
- 4.3 污點和容忍有哪些使用的場景?
1、污點(Taint)和容忍(Toleration)
污點和容忍是K8s提供的一種強大的調度控制機制,可以實現資源的精細化管理和調度優化。
污點用于標記節點,容忍用于控制Pod的調度行為。常用于節點維護、資源隔離、故障恢復、故障隔離等場景。
1.1 什么是污點(Taint)?
污點作用于節點,主要用于標記節點的屬性或者狀態,實現在默認情況下可以讓Pod無法調度到這些標記了污點到節點上。
使用場景:
- 節點維護
- 資源隔離
- 故障恢復
- 故障隔離
1.2 什么是容忍(Toleration)?
容忍作用于Pod,主要用來讓Pod可以接受某個污點的限制,也就是讓某些Pod容忍節點上配置的污點,可以讓一些需要特殊配置的Pod能夠調用到具有污點和特殊資源的節點上。
污點和容忍相互配合,可以用來避免Pod被分配到不合適到節點上。
1.3 污點的影響效果(Effect)
- NoSchedule:禁止調度Pod到該節點上,但是已經運行在該節點到服務不受影響。適用于資源隔離和節點維護的場景。
- NoExecute:禁止調度Pod到該節點上,同時已經運行在該節點上的Pod也會被驅逐(終止并重新調度)。適用于節點故障、緊急維護和故障快速恢復的場景。
- PreferNoSchedule:類似于NoSchedule。但不是一個硬性限制,調度器會盡量避免將新的Pod調度到這個節點上,但如果其他節點都不滿足條件,Pod仍然會被調度到這個節點上。適用于軟性資源隔離的場景。
1.4 污點配置解析
可以使用kubectl
給指定的節點添加污點,添加污點需要使用kubectl的taint指令。
命令格式:kubectl taint node NODE_NAME TAINT_KEY=TAINT_VALUE:EFFECT
1、比如給GPU機器添加一個特殊資源的污點(一個節點可以有多個污點):
kubectl taint node gpu-node01 gpu=true:NoSchedule
2、查看一個節點的污點:
kubectl get node k8s-node01 -o go-template --template {{.spec.taints}}
kubectl describe node k8s-node01 | grep Taints -A 10
3、刪除污點(和label類似):
基于Key刪除:kubectl taint nodes k8s-node01 ssd-
基于Key+Effect刪除:kubectl taint nodes k8s-node01 ssd:PreferNoSchedule-
機遇完整格式刪除:kubectl taint nodes k8s-node01 ssd=true:PreferNoSchedule-
4、修改污點(Key和Effect相同):
kubectl taint nodes k8s-node01 ssd=true:PreferNoSchedule --overwrite
1.5 常見內置污點
- node.kubernetes.io/not-ready:節點未準備好,相當于節點狀態Ready的值為False
- node.kubernetes.io/unreachable:Node Controller訪問不到節點,相當于節點狀態Ready的值為UnKnown
- node.kubernetes.io/out-of-disk:節點磁盤耗盡
- node.kubernetes.io/memory-pressure:節點存在內存壓力
- node.kubernetes.io/disk-pressure:節點存在磁盤壓力
- node.kubernetes.io/pid-pressure:節點存在PID壓力
- node.kubernetes.io/network-unavailable:節點網絡不可達
- node.kubernetes.io/unschedulable:節點不可調度
2、污點的增刪改查
# 查看目前pod安裝情況
[root@k8s-master01 ~]# kubectl get pod -owide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
nginx-67bfb68c7d-9b6jb 1/1 Running 0 57s 172.16.32.130 k8s-master01 <none> <none>
nginx-67bfb68c7d-9t2k9 1/1 Running 0 57s 172.16.85.202 k8s-node01 <none> <none>
nginx-67bfb68c7d-k4d8k 1/1 Running 0 57s 172.16.32.129 k8s-master01 <none> <none>
nginx-67bfb68c7d-m7lh8 1/1 Running 0 57s 172.16.85.203 k8s-node01 <none> <none>
nginx-67bfb68c7d-q7jhj 1/1 Running 0 57s 172.16.58.229 k8s-node02 <none> <none>
2.1 添加污點
# 添加一個污點:
[root@k8s-master01 ~]# kubectl taint node k8s-node01 taint01=taintvalue01:NoSchedule# 添加NoSchedule,實際上pod部署情況未受到任何影響
[root@k8s-master01 ~]# kubectl get pod -owide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
nginx-67bfb68c7d-9b6jb 1/1 Running 0 2m6s 172.16.32.130 k8s-master01 <none> <none>
nginx-67bfb68c7d-9t2k9 1/1 Running 0 2m6s 172.16.85.202 k8s-node01 <none> <none>
nginx-67bfb68c7d-k4d8k 1/1 Running 0 2m6s 172.16.32.129 k8s-master01 <none> <none>
nginx-67bfb68c7d-m7lh8 1/1 Running 0 2m6s 172.16.85.203 k8s-node01 <none> <none>
nginx-67bfb68c7d-q7jhj 1/1 Running 0 2m6s 172.16.58.229 k8s-node02 <none> <none>
# 添加一個同名不同影響度的污點:
[root@k8s-master01 ~]# kubectl taint node k8s-node01 taint01=taintvalue01:NoExecute# 添加NoExecute,k8s-node01上面的pod受到了驅逐
[root@k8s-master01 ~]# kubectl get pod -owide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
nginx-67bfb68c7d-9b6jb 1/1 Running 0 3m15s 172.16.32.130 k8s-master01 <none> <none>
nginx-67bfb68c7d-k4d8k 1/1 Running 0 3m15s 172.16.32.129 k8s-master01 <none> <none>
nginx-67bfb68c7d-pqt9f 1/1 Running 0 17s 172.16.58.230 k8s-node02 <none> <none>
nginx-67bfb68c7d-q7jhj 1/1 Running 0 3m15s 172.16.58.229 k8s-node02 <none> <none>
nginx-67bfb68c7d-xbnnh 1/1 Running 0 17s 172.16.32.131 k8s-master01 <none> <none>
# 添加一個不包含 value 的污點:
[root@k8s-master01 ~]# kubectl taint node k8s-node01 taint02:NoSchedule# 同時添加多個污點:
[root@k8s-master01 ~]# kubectl taint node k8s-node01 taint03=taint03:NoSchedule taint04=taint04:PreferNoSchedule# 同時添加多個節點:
[root@k8s-master01 ~]# kubectl taint node k8s-node01 taint03=taintvalue03:NoSchedule --overwrite# 同時添加所有節點(也可以基于 Label):
[root@k8s-master01 ~]# kubectl taint node taint06=taint06:NoSchedule --all
2.2 修改污點
修改 value:
[root@k8s-master01 ~]# kubectl taint node k8s-node01 taint03=taintvalue03:NoSchedule --overwrite修改 effect:
[root@k8s-master01 ~]# kubectl taint node k8s-node01 taint03=taintvalue03:PreferNoSchedule --overwrite
2.3 查詢污點
# 查詢 k8s-node01 的污點(推薦):
# 首先查看某個節點的污點列表:
[root@k8s-master01 ~]# kubectl describe node k8s-node01 | grep Taints -A 10
Taints: taint01=taintvalue01:NoExecutetaint01=taintvalue01:NoScheduletaint02:NoScheduletaint03=taintvalue03:NoScheduletaint05=taint05:NoScheduletaint06=taint06:NoScheduletaint03=taintvalue03:PreferNoScheduletaint04=taint04:PreferNoSchedule
Unschedulable: false
Lease:HolderIdentity: k8s-node01
# 查詢所有節點的污點:
# kubectl get nodes -o json | jq '.items[].spec.taints'# 也可以用如下命令:
[root@k8s-master01 ~]# kubectl describe node | grep Taints
Taints: taint06=taint06:NoSchedule
Taints: taint01=taintvalue01:NoExecute
Taints: taint05=taint05:NoSchedule
2.4 刪除污點
# 基于 Key 刪除
[root@k8s-master01 ~]# kubectl taint node k8s-node01 taint01-# 會刪除所有同名的污點
[root@k8s-master01 ~]# kubectl describe node k8s-node01 | grep Taints -A 10
Taints: taint02:NoScheduletaint03=taintvalue03:NoScheduletaint05=taint05:NoScheduletaint06=taint06:NoScheduletaint03=taintvalue03:PreferNoScheduletaint04=taint04:PreferNoSchedule
Unschedulable: false
Lease:HolderIdentity: k8s-node01AcquireTime: <unset>RenewTime: Mon, 23 Jun 2025 23:16:27 +0800
# 基于 Key 和 Effect 刪除:
[root@k8s-master01 ~]# kubectl taint node k8s-node01 taint05:NoSchedule-[root@k8s-master01 ~]# kubectl describe node k8s-node01 | grep Taints -A 10
Taints: taint02:NoScheduletaint03=taintvalue03:NoScheduletaint06=taint06:NoScheduletaint03=taintvalue03:PreferNoScheduletaint04=taint04:PreferNoSchedule
Unschedulable: false
Lease:HolderIdentity: k8s-node01AcquireTime: <unset>RenewTime: Mon, 23 Jun 2025 23:22:14 +0800
Conditions:
# 基于完整格式刪除:
[root@k8s-master01 ~]# kubectl taint node k8s-node01 taint06=taint06:NoSchedule-[root@k8s-master01 ~]# kubectl describe node k8s-node01 | grep Taints -A 10
Taints: taint02:NoScheduletaint03=taintvalue03:NoScheduletaint03=taintvalue03:PreferNoScheduletaint04=taint04:PreferNoSchedule
Unschedulable: false
Lease:HolderIdentity: k8s-node01AcquireTime: <unset>RenewTime: Mon, 23 Jun 2025 23:22:45 +0800
Conditions:Type Status LastHeartbeatTime LastTransitionTime Reason Message
3、污點和容忍使用場景實戰
# 查看目前pod安裝情況
[root@k8s-master01 ~]# kubectl get po -owide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
nginx-67bfb68c7d-4gr4l 1/1 Running 0 21s 192.168.58.218 k8s-node02 <none> <none>
nginx-67bfb68c7d-52m46 1/1 Running 0 21s 192.168.85.197 k8s-node01 <none> <none>
nginx-67bfb68c7d-94bzk 1/1 Running 0 21s 192.168.85.198 k8s-node01 <none> <none>
nginx-67bfb68c7d-fvhvl 1/1 Running 0 21s 192.168.58.217 k8s-node02 <none> <none>
nginx-67bfb68c7d-kz95c 1/1 Running 0 21s 192.168.85.196 k8s-node01 <none> <none>
3.1 K8s 主節點禁止調度
# 在生產環境中,Kubernetes 的主節點除了部署系統組件外,不推薦再部署任何服務,此時可以通過添加污點來禁止調度:
[root@k8s-master01 ~]# kubectl taint node k8s-node01 node-role.kubernetes.io/control-plane:NoSchedule# 也可以添加 NoExecute 類型的污點,此時不容忍該污點的 Pod 會被驅逐重建:
[root@k8s-master01 ~]# kubectl taint node k8s-node01 node-role.kubernetes.io/control-plane:NoExecute# 使用如下命令可以查看正在被驅逐重建的 Pod:
# [root@k8s-master01 ~]# kubectl get po -A -owide | grep k8s-node01 | grep -v Running
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
nginx-67bfb68c7d-52m46 0/1 Completed 0 2m39s 192.168.85.197 k8s-node01 <none> <none>
nginx-67bfb68c7d-94bzk 0/1 Completed 0 2m39s 192.168.85.198 k8s-node01 <none> <none>
nginx-67bfb68c7d-kz95c 0/1 Completed 0 2m39s 192.168.85.196 k8s-node01 <none> <none>
3.2 K8s 新節點禁止調度
# 當 Kubernetes 集群添加新節點時,通常情況下不會立即調度 Pod 到該節點,需要經過完整的可用性測試之后才可以調度 Pod,此時也可以使用污點先臨時禁止該節點的調度:
[root@k8s-master01 ~]# kubectl taint node k8s-node01 new-node=true:NoSchedule# 同樣的道理,比如在禁止調度之前已經有 Pod 部署在該節點,可以進行驅逐:
[root@k8s-master01 ~]# kubectl taint node k8s-node01 new-node=true:NoExecute# 待新節點測試完畢后,在允許該節點可以進行調度:
[root@k8s-master01 ~]# kubectl taint node k8s-node01 new-node-
3.3 K8s 節點維護流程
當 Kubernetes 的節點需要進行下線維護時,此時需要先把該節點的服務進行驅逐和重新調度。
此時需要根據實際情況判斷是直接驅逐還是選擇重新調度,比如某個 Pod 只有一個副本,或者某個服務比較重要,就不能直接進行驅逐,而是需要先把節點關閉調度,然后在進行服務的重新部署。
# 已知 counter 是個比較重要的服務
[root@k8s-master01 ~]# kubectl get po -owide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
counter-6c77464d64-pgv52 1/1 Running 0 6s 192.168.85.202 k8s-node01 <none> <none>
nginx-7f69b557bf-4z6rx 1/1 Running 0 44s 192.168.58.223 k8s-node02 <none> <none>
nginx-7f69b557bf-j99hg 1/1 Running 0 44s 192.168.85.201 k8s-node01 <none> <none>
nginx-7f69b557bf-vvc66 1/1 Running 0 47s 192.168.85.199 k8s-node01 <none> <none>
nginx-7f69b557bf-wkgwz 1/1 Running 0 47s 192.168.58.222 k8s-node02 <none> <none>
nginx-7f69b557bf-wwglg 1/1 Running 0 46s 192.168.85.200 k8s-node01 <none> <none>
# 關閉維護節點的調度:
[root@k8s-master01 ~]# kubectl taint node k8s-node01 maintain:NoSchedule# 重新觸發某個服務的部署:
[root@k8s-master01 ~]# kubectl rollout restart deploy counter# 再次查看該服務:
[root@k8s-master01 ~]# kubectl get po -owide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
counter-5657b64789-d5f27 1/1 Running 0 5s 192.168.58.224 k8s-node02 <none> <none>
....
# 接下來沒有重要服務,即可對該節點的 Pod 進行驅逐:
[root@k8s-master01 ~]# kubectl taint node k8s-node01 maintain:NoExecute[root@k8s-master01 ~]# kubectl get po -owide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
counter-5657b64789-d5f27 1/1 Running 0 4m54s 192.168.58.224 k8s-node02 <none> <none>
nginx-7f69b557bf-4z6rx 1/1 Running 0 7m59s 192.168.58.223 k8s-node02 <none> <none>
nginx-7f69b557bf-8qmdj 1/1 Running 0 3s 192.168.58.227 k8s-node02 <none> <none>
nginx-7f69b557bf-ds2gx 1/1 Running 0 3s 192.168.58.226 k8s-node02 <none> <none>
nginx-7f69b557bf-lkssx 1/1 Running 0 3s 192.168.58.225 k8s-node02 <none> <none>
nginx-7f69b557bf-wkgwz 1/1 Running 0 8m2s 192.168.58.222 k8s-node02 <none> <none># 驅逐后,即可按照預期進行對節點進行維護,維護完成以后,可以刪除污點,恢復調度:
[root@k8s-master01 ~]# kubectl taint node k8s-node01 maintain-
# 除了自定義污點,也可以使用 kubectl 快捷指令將節點設置為維護狀態:
# 將節點標記為不可調度狀態
[root@k8s-master01 ~]# kubectl cordon k8s-node02# 此時節點會被標記一個 SchedulingDisabled 狀態,但是已經運行在該節點的 Pod 不收影響:
[root@k8s-master01 ~]# kubectl get node
NAME STATUS ROLES AGE VERSION
k8s-master01 Ready control-plane 14d v1.32.5
k8s-node01 Ready <none> 14d v1.32.5
k8s-node02 Ready,SchedulingDisabled <none> 14d v1.32.5# 驅逐 k8s-node02 上面的服務:
[root@k8s-master01 ~]# kubectl drain k8s-node02 --ignore-daemonsets --delete-emptydir-data
node/k8s-node02 already cordoned
Warning: ignoring DaemonSet-managed Pods: kube-system/calico-node-f29nz, kube-system/kube-proxy-29d22
evicting pod kubernetes-dashboard/kubernetes-dashboard-778584b9dd-wnt2n
evicting pod krm/krm-backend-6ff5c5f58c-vsnb2
evicting pod default/counter-5657b64789-d5f27
evicting pod default/nginx-7f69b557bf-4z6rx
evicting pod default/nginx-7f69b557bf-8qmdj
evicting pod default/nginx-7f69b557bf-ds2gx
evicting pod default/nginx-7f69b557bf-lkssx
evicting pod default/nginx-7f69b557bf-wkgwz
evicting pod kube-system/coredns-76fccbbb6b-jkhb2
evicting pod krm/krm-frontend-588ffd677b-h96qv
evicting pod kube-system/calico-kube-controllers-6f497d8478-5qs7t
evicting pod kube-system/metrics-server-57954884df-g67bw
evicting pod kube-system/coredns-76fccbbb6b-t97mm
evicting pod kubernetes-dashboard/dashboard-metrics-scraper-69b4796d9b-n5jvb
I0624 17:35:21.743891 11434 request.go:729] Waited for 1.057860177s due to client-side throttling, not priority and fairness, request: GET:https://172.16.20.10:6443/api/v1/namespaces/default/pods/nginx-7f69b557bf-lkssx
pod/krm-frontend-588ffd677b-h96qv evicted
pod/nginx-7f69b557bf-ds2gx evicted
pod/nginx-7f69b557bf-4z6rx evicted
pod/nginx-7f69b557bf-lkssx evicted
pod/nginx-7f69b557bf-wkgwz evicted
pod/counter-5657b64789-d5f27 evicted
pod/nginx-7f69b557bf-8qmdj evicted
pod/krm-backend-6ff5c5f58c-vsnb2 evicted
pod/metrics-server-57954884df-g67bw evicted
pod/coredns-76fccbbb6b-t97mm evicted
pod/coredns-76fccbbb6b-jkhb2 evicted
pod/kubernetes-dashboard-778584b9dd-wnt2n evicted
pod/dashboard-metrics-scraper-69b4796d9b-n5jvb evicted
pod/calico-kube-controllers-6f497d8478-5qs7t evicted
node/k8s-node02 drained# 恢復節點:
[root@k8s-master01 ~]# kubectl uncordon k8s-node02
3.4 K8s 節點特殊資源保留
# 當 Kubernetes 中存儲特殊節點時,應該盡量保持不要特殊資源的 Pod 不要調度到這些節點上,此時可以通過污點進行控制。
# 比如包含了 GPU 的節點不能被任意調度:
[root@k8s-master01 ~]# kubectl taint node k8s-node01 gpu=true:NoSchedule# 具有其它特殊資源,盡量不要調度:
[root@k8s-master01 ~]# kubectl taint node k8s-node01 ssd=true:PreferNoSchedule
3.5 使用容忍調度到具有污點的節點
在生產環境中,經常根據實際情況給節點打上污點,比如特殊資源節點不能隨意調度、主節點不能隨意調度,但是需要特殊資源的服務還是需要調度到該節點,一些監控和收集的服務還是需要調度到主節點,此時需要給這些服務添加合適的容忍才能部署到這些節點
比如上述添加的 GPU 污點:kubectl taint node k8s-node01 gpu=true:NoSchedule
# 創建幾個pod測試一下調度
[root@k8s-master01 ~]# kubectl create deploy nginx --image=crpi-q1nb2n896zwtcdts.cn-beijing.personal.cr.aliyuncs.com/ywb01/nginx:stable --replicas=5# 沒有一個pod在k8s-node01上面
[root@k8s-master01 ~]# kubectl get po -owide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
nginx-67bfb68c7d-5ghm5 1/1 Running 0 25s 192.168.58.223 k8s-node02 <none> <none>
nginx-67bfb68c7d-6p5l5 1/1 Running 0 25s 192.168.58.222 k8s-node02 <none> <none>
nginx-67bfb68c7d-k5fg6 1/1 Running 0 25s 192.168.58.225 k8s-node02 <none> <none>
nginx-67bfb68c7d-rvlp8 1/1 Running 0 25s 192.168.58.224 k8s-node02 <none> <none>
nginx-67bfb68c7d-s48vx 1/1 Running 0 25s 192.168.58.226 k8s-node02 <none> <none>
# 如果某個服務需要 GPU 資源,就需要添加容忍才能部署至該節點。此時可以添加如下的容忍配置至 Pod 上:
[root@k8s-master01 ~]# vim gpu-example.yaml
[root@k8s-master01 ~]# cat gpu-example.yaml
apiVersion: apps/v1
kind: Deployment
metadata:labels:app: gpu-examplename: gpu-example
spec:replicas: 1selector:matchLabels:app: gpu-exampletemplate:metadata:labels:app: gpu-examplespec:nodeSelector: # 加一個標簽,強制落在這個標簽上gpu: "true"tolerations: # 如果某個服務需要 GPU 資源,就需要添加容忍才能部署至該節點。此時可以添加如下的容忍配置至 Pod 上- key: "gpu"operator: "Exists"effect: "NoSchedule"containers:- image: crpi-q1nb2n896zwtcdts.cn-beijing.personal.cr.aliyuncs.com/ywb01/nginx:stablename: nginx# 給k8s-node01加一個標簽
[root@k8s-master01 ~]# kubectl label node k8s-node01 gpu=true# 啟動
[root@k8s-master01 ~]# kubectl create -f gpu-example.yaml # 節點調度到了k8s-node01
[root@k8s-master01 ~]# kubectl get po -owide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
gpu-example-d87d7969-4tmx5 1/1 Running 0 2m11s 192.168.85.196 k8s-node01 <none> <none>
3.6 K8s 專用節點隔離
一個 Kubernetes 集群,很常見會有一些專用的節點,比如 ingress、gateway、storage 或者多租戶環境等。這些節點通常不建議和其他服務交叉使用,所以需要利用污點和容忍將這些節點隔離起來。
# 已知pod部署情況
[root@k8s-master01 ~]# kubectl get pod -owide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
ingress-nginx-78c5595744-6qw5s 1/1 Running 0 2m14s 172.16.85.196 k8s-node01 <none> <none>
ingress-nginx-78c5595744-78qc9 1/1 Running 0 2m14s 172.16.58.219 k8s-node02 <none> <none>
ingress-nginx-78c5595744-8mgjk 1/1 Running 0 2m14s 172.16.85.197 k8s-node01 <none> <none>
# 比如選擇一批節點作為 ingress 入口的節點
[root@k8s-master01 ~]# kubectl label node k8s-node02 ingress=true# 添加一個污點,不讓其他服務部署
[root@k8s-master01 ~]# kubectl taint node k8s-node02 ingress=true:NoSchedule# 更改 Ingress 的部署資源,添加容忍和節點選擇器:
# kubectl edit ds -n ingress-nginx
....spec:nodeSelector:ingress: "true"kubernetes.io/os: linuxtolerations:- key: ingressoperator: Existseffect: NoSchedulecontainers:
....# pod全落在了K8s-node02上面
[root@k8s-master01 ~]# kubectl get pod -owideNAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
ingress-nginx-69fbf8f7d9-2xmbs 1/1 Running 0 5s 172.16.58.228 k8s-node02 <none> <none>
ingress-nginx-69fbf8f7d9-4c229 1/1 Running 0 12s 172.16.58.226 k8s-node02 <none> <none>
ingress-nginx-69fbf8f7d9-68m2l 1/1 Running 0 8s 172.16.58.227 k8s-node02 <none>
3.7 節點宕機快速恢復服務
當 Kubernetes 集群中有節點故障時,Kubernetes 會自動恢復故障節點上的服務,但是默認情況下,節點故障時五分鐘才會重新調度服務,此時可以利用污點的 tolerationSeconds 快速恢復服務。
[root@k8s-master01 ~]# vim ingress-nginx.yaml
[root@k8s-master01 ~]# cat ingress-nginx.yaml
apiVersion: apps/v1
kind: Deployment
metadata:labels:app: ingress-nginxname: ingress-nginx
spec:replicas: 1selector:matchLabels:app: ingress-nginxtemplate:metadata:labels:app: ingress-nginxspec:tolerations:- key: node.kubernetes.io/unreachableoperator: Existseffect: NoExecutetolerationSeconds: 10- key: node.kubernetes.io/not-readyoperator: Existseffect: NoExecutetolerationSeconds: 10containers:- image: crpi-q1nb2n896zwtcdts.cn-beijing.personal.cr.aliyuncs.com/ywb01/nginx:stablename: nginx[root@k8s-master01 ~]# kubectl create -f ingress-nginx.yaml
[root@k8s-master01 ~]# kubectl get pod -owide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
ingress-nginx-587f84dccd-bkhbp 1/1 Running 0 6s 172.16.85.199 k8s-node01 <none> <none>
ingress-nginx-587f84dccd-g7zcr 1/1 Running 0 6s 172.16.58.230 k8s-node02 <none> <none>
ingress-nginx-587f84dccd-k7m2b 1/1 Running 0 6s 172.16.85.200 k8s-node01 <none> <none>
ingress-nginx-587f84dccd-wgd46 1/1 Running 0 6s 172.16.58.229 k8s-node02 <none> <none>
ingress-nginx-587f84dccd-wl28v 1/1 Running 0 42s 172.16.85.198 k8s-node01 <none> <none>
模擬K8s-node01宕機
[root@k8s-node01 ~]# shutdown -h 0[root@k8s-master01 ~]# kubectl get nodes
NAME STATUS ROLES AGE VERSION
k8s-master01 Ready control-plane 22d v1.32.5
k8s-node01 NotReady <none> 22d v1.32.5
k8s-node02 Ready <none> 22d v1.32.5# 10s后K8s-node01上的機器被驅逐走
[root@k8s-master01 ~]# kubectl get pod -owide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
ingress-nginx-587f84dccd-bhzwr 1/1 Running 0 62s 172.16.58.231 k8s-node02 <none> <none>
ingress-nginx-587f84dccd-bkhbp 1/1 Terminating 0 3m6s 172.16.85.199 k8s-node01 <none> <none>
ingress-nginx-587f84dccd-dndbn 1/1 Running 0 62s 172.16.58.233 k8s-node02 <none> <none>
ingress-nginx-587f84dccd-g7zcr 1/1 Running 0 3m6s 172.16.58.230 k8s-node02 <none> <none>
ingress-nginx-587f84dccd-k7m2b 1/1 Terminating 0 3m6s 172.16.85.200 k8s-node01 <none> <none>
ingress-nginx-587f84dccd-ns9b7 1/1 Running 0 62s 172.16.58.232 k8s-node02 <none> <none>
ingress-nginx-587f84dccd-wgd46 1/1 Running 0 3m6s 172.16.58.229 k8s-node02 <none> <none>
ingress-nginx-587f84dccd-wl28v 1/1 Terminating 0 3m42s 172.16.85.198 k8s-node01 <none> <none>
4、常見問題
4.1 什么是污點和容忍?它們的作用是什么?
污點是應用與節點的一種屬性,用于排斥某些Pod。節點上的污點會阻止任何沒有相應容忍的Pod調度到該節點上。容忍是應用與Pod的一種屬性,允許Pod被調度到具有特定污點的節點上,通過在Pod的規范中添加容忍,Pod可以忽略節點上的污點。
4.2 在K8s集群中如何劃分不同的租戶?
首先根據節點劃分標簽組,之后根據標簽配置污點,最后給不同租戶添加不同的節點選擇器和容忍。
4.3 污點和容忍有哪些使用的場景?
故障隔離、故障恢復、資源隔離、專用節點隔離、多租戶多環境隔離、節點平滑維護與下線等。
此博客來源于:https://edu.51cto.com/lecturer/11062970.html