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