K8S Node異常問(wèn)題排查過(guò)程
一、簡(jiǎn)介
可使用 kubectl 命令行對(duì) K8S Node 異常做初步定位,方法幾乎適用于所有 K8S 集群。
二、排查方法
使用 grafana kubelet 查看 NotReady 發(fā)生時(shí)間:

# kubectl get nodes NAME STATUS ROLES AGE VERSION 172.16.80.4 Ready <none> 18h v1.20.8 172.16.80.6 NotReady <none> 18h v1.20.8
kubectl describe node 172.16.80.6 查看異常 event
Conditions: Type Status LastHeartbeatTime LastTransitionTime Reason Message ---- ------ ----------------- ------------------ ------ ------- NetworkUnavailable False Mon, 13 Jun 2022 19:41:10 +0800 Mon, 13 Jun 2022 19:41:10 +0800 RouteCreated CCE RouteController created a route MemoryPressure Unknown Tue, 14 Jun 2022 14:08:00 +0800 Tue, 14 Jun 2022 14:09:36 +0800 NodeStatusUnknown Kubelet stopped posting node status. DiskPressure Unknown Tue, 14 Jun 2022 14:08:00 +0800 Tue, 14 Jun 2022 14:09:36 +0800 NodeStatusUnknown Kubelet stopped posting node status. PIDPressure Unknown Tue, 14 Jun 2022 14:08:00 +0800 Tue, 14 Jun 2022 14:09:36 +0800 NodeStatusUnknown Kubelet stopped posting node status. Ready Unknown Tue, 14 Jun 2022 14:08:00 +0800 Tue, 14 Jun 2022 14:09:36 +0800 NodeStatusUnknown Kubelet stopped posting node status.
kubectl get node 172.16.80.6 -o yaml 查看 NodeConditions:
conditions:
- lastHeartbeatTime: "2022-06-13T11:41:10Z"
lastTransitionTime: "2022-06-13T11:41:10Z"
message: CCE RouteController created a route
reason: RouteCreated
status: "False"
type: NetworkUnavailable
- lastHeartbeatTime: "2022-06-14T06:08:00Z"
lastTransitionTime: "2022-06-14T06:09:36Z"
message: Kubelet stopped posting node status.
reason: NodeStatusUnknown
status: Unknown
type: MemoryPressure
- lastHeartbeatTime: "2022-06-14T06:08:00Z"
lastTransitionTime: "2022-06-14T06:09:36Z"
message: Kubelet stopped posting node status.
reason: NodeStatusUnknown
status: Unknown
type: DiskPressure
- lastHeartbeatTime: "2022-06-14T06:08:00Z"
lastTransitionTime: "2022-06-14T06:09:36Z"
message: Kubelet stopped posting node status.
reason: NodeStatusUnknown
status: Unknown
type: PIDPressure
- lastHeartbeatTime: "2022-06-14T06:08:00Z"
lastTransitionTime: "2022-06-14T06:09:36Z"
message: Kubelet stopped posting node status.
reason: NodeStatusUnknown
status: Unknown
type: Ready登錄節(jié)點(diǎn)查看 kubelet 的日志:
journalctl -u kubelet --since="2022-06-14 14:00:00" | less
三、常見問(wèn)題
Kubelet stopped posting node status
kubelet 停止匯報(bào)心跳,通常是 node 節(jié)點(diǎn)宕機(jī),可讓用戶嘗試登錄節(jié)點(diǎn),無(wú)法登錄的話,一般通過(guò)重啟恢復(fù)。原因一般和節(jié)點(diǎn)負(fù)載有關(guān),可通過(guò)監(jiān)控查看節(jié)點(diǎn)異常前負(fù)載情況。
PLEG is not healthy
Pod Lifecycle Event Generator,kubelet 會(huì)定期同步 pod 狀態(tài),當(dāng)同步 pod 狀態(tài)超時(shí)(3分鐘),會(huì)將 node 置為 not ready 狀態(tài)。
- 通過(guò)命令定位是否有容器 inspect 卡住的情況: docker ps -a -q | xargs docker inspect
如果該命令卡住,則進(jìn)一步定位是由具體的哪個(gè)容器導(dǎo)致,通過(guò) docker inspect {CONTAINER ID} 確認(rèn)。定位到具體容器后,經(jīng)客戶允許后可將該容器刪除 docker rm -f {CONTAINER ID}
Node Evicted
當(dāng)節(jié)點(diǎn)因?yàn)橘Y源不足(CPU、內(nèi)存、磁盤)被驅(qū)逐時(shí),需根據(jù)不同原因處理:
- CPU,內(nèi)存資源不足:
- 虛機(jī)升配
- 合理設(shè)置資源的 resource request, 使 pod 合理調(diào)度到不同的節(jié)點(diǎn)上。
- 磁盤空間不足:
- 擴(kuò)容容器數(shù)據(jù)目錄所在磁盤
總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
k8s擴(kuò)展調(diào)度能力的三種實(shí)現(xiàn)方式
Kubernetes調(diào)度器擴(kuò)展主要通過(guò)調(diào)度框架和調(diào)度器擴(kuò)展器實(shí)現(xiàn),調(diào)度框架提供多種插件接口,如QueueSort、Filter、Score等,允許擴(kuò)展調(diào)度邏輯,調(diào)度器擴(kuò)展器通過(guò)HTTP服務(wù)擴(kuò)展調(diào)度功能,支持Filter、Prioritize等擴(kuò)展點(diǎn)2025-10-10
如何在 K8S 中使用 Values 文件定制不同環(huán)境下的應(yīng)用配置
Kubernetes是一個(gè)開源的容器編排平臺(tái),它可以自動(dòng)化容器的部署、擴(kuò)展和管理,在 K8s 中,應(yīng)用程序通常以容器的形式運(yùn)行,這些容器被組織在不同的資源對(duì)象中,這篇文章主要介紹了如何在 K8S 中使用 Values 文件定制不同環(huán)境下的應(yīng)用配置,需要的朋友可以參考下2025-03-03
K8s學(xué)習(xí)之Pod的定義及詳細(xì)資源調(diào)用案例
Kubernetes將所有內(nèi)容抽象為資源,通過(guò)操作資源管理集群,核心單元是Pod,通過(guò)控制器管理Pod,資源管理分為命令式對(duì)象管理、命令式對(duì)象配置和聲明式對(duì)象配置,各有適用場(chǎng)景,需要的朋友可以參考下2024-09-09

