1. 程式人生 > >kubernetes-故障案例-資源耗盡

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/