记录日常工作关于系统运维,虚拟化云计算,数据库,网络安全等各方面问题。

今天发现在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
<span style="color:#ff6666;">Conditions:</span>
  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		<span style="color:#ff6666;">NodeHasNoDiskPressure	Node 192.168.5.86 status is now: NodeHasNoDiskPressure</span>
  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/



转载请标明出处【kubernetes-故障案例-资源耗尽,SufficientMemory】。

《www.micoder.cc》 虚拟化云计算,系统运维,安全技术服务.

网站已经关闭评论