kubernetes-故障案例-資源耗盡
今天發現在kubernetes上建立POD時,有個節點一直不能分配到POD,並該節點上有些pod的狀態為pendding.
查詢該節點的狀態:
mac-temp:echo test$ kubectl describe node 192.168.5.86
Name: 192.168.5.86
Role:
.....
CreationTimestamp: Thu, 05 Oct 2017 17:09:52 +0800
Conditions:
Type Status LastHeartbeatTime LastTransitionTime Reason Message
---- ------ ----------------- ------------------ ------ -------
DiskPressure False Sun, 11 Mar 2018 18:13:57 +0800 Sun, 11 Mar 2018 17:13:59 +0800 KubeletHasNoDiskPressure kubelet has no disk pressure
MemoryPressure False Sun, 11 Mar 2018 18:13:57 +0800 Sun, 11 Mar 2018 17:13:59 +0800 KubeletHasSufficientMemory kubelet has sufficient memory available
OutOfDisk False Sun, 11 Mar 2018 18:13:57 +0800 Sun, 11 Mar 2018 17:13:59 +0800 KubeletHasSufficientDisk kubelet has sufficient disk space available
Ready True Sun, 11 Mar 2018 18:13:57 +0800 Sun, 11 Mar 2018 17:13:59 +0800 KubeletReady kubelet is posting ready status
Addresses:
InternalIP: 192.168.5.86
Hostname: 192.168.5.86
...
Events:
FirstSeen LastSeen Count From SubObjectPath Type Reason Message
--------- -------- ----- ---- ------------- -------- ------ -------
7h 59m 2 kubelet, 192.168.5.86 Normal NodeHasSufficientDisk Node 192.168.5.86 status is now: NodeHasSufficientDisk
7h 59m 2 kubelet, 192.168.5.86 Normal NodeHasSufficientMemory Node 192.168.5.86 status is now: NodeHasSufficientMemory
7h 59m 2 kubelet, 192.168.5.86 Normal NodeHasNoDiskPressure Node 192.168.5.86 status is now: NodeHasNoDiskPressure
7h 59m 2 kubelet, 192.168.5.86 Normal NodeReady Node 192.168.5.86 status is now: NodeReady
...
從狀態可以看到有以下異常的資訊:
status is now: NodeHasSufficientDisk
status is now: NodeHasSufficientMemory
status is now: NodeHasNoDiskPressure
status is now: NodeReady
因此,進入節點192.168.5.86 檢查,發現/var/lib/docker所在的分割槽,已經使用了97%.
刪除/var/lib/docker 所在分割槽的一些臨時檔案後或把該目錄掛載到一較大的分割槽後,重啟kebelet後問題解決。
NodeCondition:存放節點健康狀況。
1. 屬性Type:節點健康狀況型別,包括Ready、OutOfDisk、MemoryPressure、DiskPressure和NetworkUnavailable,分別表示:
1) Ready:表示節點是健康的,可以隨時在上面建立POD
2) OutOfDisk:表示這個節點沒有空閒的磁碟空間了,已經不能在上面建立POD了
3) MemoryPressure:表示這個節點上可用記憶體已經很少了
4) DiskPressure:表示這個節點上可用磁碟空間已經很少了
5) NetworkUnavailable:表示這個節點上網路沒有被正確配置
2. 屬性Status:表示某種型別健康狀況的當前狀態,目前只有True、False和Unknown,在kubernetes將來版本中還會繼續新增新的狀態。
1) True:表示當前型別的健康狀況確實存在
2) False:表示當前型別的健康狀況不存在
3) Unknown:表示kubernetes無法確定當前型別的健康狀況是否存在
3. 屬性LastHeartbeatTime:表示上一次更新狀態的時間
4. 屬性LastTransitionTime:表示上一次狀態變化的時間
5. 屬性Reason:表示上一次狀態變化的簡單原因
6. 屬性Message:表示上一次狀態變化的詳細原因
NodeCondition中:健康狀況型別DiskPressure,用來表示這個節點上可用磁碟空間已經很少了。
新增了這個健康狀況型別DiskPressure後,在兩個方面會提升Kubernetes的使用:
1. 可以在排程POD的時候進行參考,如果節點上確實發生了DiskPressure這件事,那麼就會由scheduler模組將POD排程到其他節點上。
2. 可以在控制節點的時候進行參考,如果節點上確實發生了DiskPressure這件事,那麼就會由kubelet模組回收這個節點上的所有POD,將這些POD驅逐到其他節點上。
kubernetes正在快速的豐富和完善自身功能,從只有MemoryPressure,到增加了DiskPressure,kubernete給使用者提供了更多方式來處理應用容器化會遇到的問題。我們通過上面結構體的介紹可以發現,還可以繼續豐富其他型別的Pressure,比如CPUPress、NetworkPress,這些都需要kubernets社群繼續去完善,相信隨著kubernetes新版本的釋出,功能會變得越來越強大。
參考:
https://tonybai.com/2017/10/16/out-of-node-resource-handling-in-kubernetes-cluster/
https://kubernetes.io/docs/tasks/administer-cluster/out-of-resource/