今天发现在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/