现象以及排查过程:
k8s集群某个节点上的pod状态为Evicted,无cni0 flannel.1虚拟网口
使用命令kubectl delete pod xxx 重启该pod,无日志输出,状态不变
使用命令kubectl get node,该节点是ready状态
使用命令kubectl describe pod xxx ,没有明显的报错信息
使用命令kubectl describe node xx ,最后出现有DiskPressure的关键字
ssh登录该节点,查看磁盘空间,使用率98%
到此,定位到问题是磁盘空间不足造成pod被驱逐
相关资料:
K8S 节点经常 DiskPressure 警告?分析问题将它解决掉! - 墨天轮
k8s Pod状态详解_张折耳的博客-CSDN博客_k8spod状态详解
K8S是否存在因DiskPressure驱逐pod,运维老鸟来剖析!
查阅以上资料后,把关键部分总结下:
Kubelet 根据指标达到什么条件才会执行 Pod 驱逐
经过 Kubernetes 文档的介绍,Kubelet 会对下面指标进行判断,当到达设置的条件后,会执行强制驱逐 Pod:
-
memory.available<100Mi: 当内存下降到 100Mi 时 kubelet 开始驱逐 Pod 及其容器来释放磁盘空间。
-
nodefs.available<10%: 当 kubelet 相关存储可用的存储不足 10% 时开始驱逐 Pod 及其容器来释放磁盘空间。
-
imagefs.available<15%: 当容器运行时文件系统可用存储空间不足 15% 时开始驱逐 Pod,并且删除没有被使用的镜像来释放空间。
-
nodefs.inodesFree<5%: (仅 Linux 系统): 当容器运行时 inodes 可用存储空间不足 5% 时开始驱逐 Pod 及其容器来释放磁盘空间。
Kubernetes 触发 DiskPressure 时造成的影响
当触发 DiskPressure
告警时,会产生如下的影响:
-
驱逐 Pod
-
删除未使用的容器
-
阻止新创建的 Pod 调度到该节点中
检查验证:
检查该节点上的镜像:docker images 一个镜像都没有了
检查该节点上的kubelet服务:systemctl status kubelet 发现有回收失败的信息
检查该节点上pod的事件:kubectl get events 发现有pod日志有diskpressure的信息
解决处理:
清理磁盘空间到根分区使用率85%以下
重启kubelet服务
重启有问题的pod
至此,全部恢复正常,pod都是Running状态