K8S故障處理指南:臨時(shí)設(shè)置節(jié)點(diǎn)為不可調(diào)度

在Kubernetes中,節(jié)點(diǎn)驅(qū)逐是一種管理和維護(hù)集群的重要操作,允許節(jié)點(diǎn)在維護(hù)、升級(jí)或者發(fā)生故障時(shí)從集群中移除,等到節(jié)點(diǎn)修復(fù)后,再重新承擔(dān)pod調(diào)度功能。
1.K8s節(jié)點(diǎn)驅(qū)逐
節(jié)點(diǎn)驅(qū)逐是指將節(jié)點(diǎn)上運(yùn)行的Pod遷移到其他可用節(jié)點(diǎn)上,并暫時(shí)從集群中移除目標(biāo)節(jié)點(diǎn)。這個(gè)操作通常在節(jié)點(diǎn)維護(hù)、系統(tǒng)升級(jí)、硬件故障或者其他需要暫時(shí)離線節(jié)點(diǎn)的場(chǎng)景下使用。
2.使用場(chǎng)景
節(jié)點(diǎn)維護(hù)
在進(jìn)行節(jié)點(diǎn)維護(hù)時(shí),需要將節(jié)點(diǎn)暫時(shí)移除,確保Pod能夠在其他節(jié)點(diǎn)上繼續(xù)運(yùn)行。有一點(diǎn)要注意,在節(jié)點(diǎn)驅(qū)逐前,要保持集群中服務(wù)多副本,否則驅(qū)逐過(guò)程中可能會(huì)導(dǎo)致業(yè)務(wù)不可用
節(jié)點(diǎn)升級(jí)
當(dāng)需要對(duì)節(jié)點(diǎn)進(jìn)行Kubernetes版本升級(jí)或者操作系統(tǒng)升級(jí)時(shí),可以使用節(jié)點(diǎn)驅(qū)逐來(lái)確保服務(wù)的可用性。
硬件故障或維修
當(dāng)節(jié)點(diǎn)發(fā)生硬件故障或需要維修時(shí),可以通過(guò)節(jié)點(diǎn)驅(qū)逐操作將節(jié)點(diǎn)下的Pod遷移到其他健康的節(jié)點(diǎn)上。
3.命令說(shuō)明
- cordon : 停止調(diào)度【不可調(diào)度,臨時(shí)從K8S集群隔離】
該命令會(huì)將node標(biāo)記為SchedulingDisabled不可調(diào)度狀態(tài),影響最小,之后K8S再創(chuàng)建的pod資源,不會(huì)被調(diào)度到該節(jié)點(diǎn)。原有的 pod 不受影響,仍正常對(duì)外提供服務(wù)。
- drain :驅(qū)逐節(jié)點(diǎn)【設(shè)置不可調(diào)度,然后排干節(jié)點(diǎn)pod】
該命令操作,會(huì)先驅(qū)逐Node上的pod資源到其他節(jié)點(diǎn)重新創(chuàng)建,將節(jié)點(diǎn)調(diào)為SchedulingDisabled不可調(diào)度狀態(tài)
總結(jié):兩個(gè)命令的區(qū)別在于,cordon命令執(zhí)行后,新的pod創(chuàng)建不會(huì)調(diào)度過(guò)來(lái),老的pod不受影響,drain執(zhí)行會(huì)額外清除節(jié)點(diǎn)上的pod
4.操作步驟
K8S集群,其中一個(gè)node節(jié)點(diǎn)發(fā)生故障,狀態(tài)為notready
[root@k8s ~]# kubectl get node
NAME STATUS ROLES AGE VERSION
10.10.12.10 Ready master,node 172d v1.20.6
10.10.12.26 Ready master,node 172d v1.20.6
10.10.12.27 Ready master,node 172d v1.20.6
10.10.12.15 Ready node 170d v1.20.6
10.10.12.11 NotReady node 60d v1.20.6故障節(jié)點(diǎn)標(biāo)記為不可調(diào)度
kubectl cordon <node-name> #此處name為節(jié)點(diǎn)ip
[root@k8s ~]# kubectl get node
NAME STATUS ROLES AGE VERSION
10.10.12.10 Ready master,node 172d v1.20.6
10.10.12.26 Ready master,node 172d v1.20.6
10.10.12.27 Ready master,node 172d v1.20.6
10.10.12.15 Ready node 170d v1.20.6
10.10.12.11 NotReady,SchedulingDisabled node 60d v1.20.6kubectl drain <node-name>drain <node-name> --ignore-daemonsets
kubectl drain 命令會(huì)觸發(fā)節(jié)點(diǎn)驅(qū)逐操作,將節(jié)點(diǎn)上的Pod遷移到其他節(jié)點(diǎn)上。
參數(shù)說(shuō)明:
--delete-emptydir-data:強(qiáng)制驅(qū)逐節(jié)點(diǎn)上綁定了本地存儲(chǔ)的Pod,例如coredns。
--ignore-daemonsets:忽略節(jié)點(diǎn)上的守護(hù)進(jìn)程集Pod,通常為DaemonSet類型的Pod,例如flannel
查看節(jié)點(diǎn)驅(qū)逐狀態(tài)
5.解除驅(qū)逐
當(dāng)處理完節(jié)點(diǎn)問題,重新恢復(fù)為ready狀態(tài)后,需要將節(jié)點(diǎn)恢復(fù)可調(diào)度狀態(tài)
取消節(jié)點(diǎn)驅(qū)逐
[root@k8s ~]# kubectl uncordon 10.10.12.11
node/10.10.12.11 uncordoned
[root@k8s ~]#
[root@k8s ~]# kubectl get node
NAME STATUS ROLES AGE VERSION
10.10.12.10 Ready master,node 172d v1.20.6
10.10.12.26 Ready master,node 172d v1.20.6
10.10.12.27 Ready master,node 172d v1.20.6
10.10.12.15 Ready node 170d v1.20.6
10.10.12.11 Ready node 60d v1.20.66. 注意事項(xiàng)
- DaemonSet
在進(jìn)行節(jié)點(diǎn)驅(qū)逐時(shí),需要注意DaemonSet中的Pod,確保它們不會(huì)被驅(qū)逐,以維持集群的關(guān)鍵服務(wù)。
確保Pod能夠重新調(diào)度
在節(jié)點(diǎn)驅(qū)逐前,確保集群中有足夠的可用資源,以便Pod能夠順利地重新調(diào)度到其他節(jié)點(diǎn)上。
確認(rèn)服務(wù)的高可用性
在進(jìn)行節(jié)點(diǎn)驅(qū)逐時(shí),要確保相關(guān)服務(wù)具備高可用性,以防止驅(qū)逐操作引起的業(yè)務(wù)中斷,所有服務(wù)的多副本還是很有必要的。
通過(guò)良好的節(jié)點(diǎn)管理和調(diào)度策略,Kubernetes能夠有效地應(yīng)對(duì)節(jié)點(diǎn)維護(hù)、升級(jí)和故障情況。節(jié)點(diǎn)驅(qū)逐操作是集群維護(hù)的重要組成部分,合理使用并遵循最佳實(shí)踐,能夠確保業(yè)務(wù)的連續(xù)性和可靠性。

































