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