K8S集群中Pod的Evicted状态原因

在Kubernetes(K8S)中,Pod的Evicted状态表示Pod已经被驱逐,并不再运行在节点上。Pod驱逐主要是由于资源约束,如内存不足或磁盘空间不足。以下是详细原理、原因和解决方案。

原理: Kubernetes集群会监控节点资源使用情况,当资源不足时,kubelet会触发Pod驱逐过程。驱逐过程会根据优先级和资源使用情况选择要驱逐的Pod。一旦Pod被驱逐,其状态将变为Evicted,相关事件也会被记录。

原因:

内存不足:当节点上的可用内存不足以满足Pod的内存需求时,kubelet会尝试回收内存,如果回收不足,会触发Pod驱逐。
磁盘空间不足:当节点上的磁盘空间不足以满足Pod的存储需求时,kubelet会尝试回收磁盘空间,如果回收不足,会触发Pod驱逐。
kubelete支持以下两种文件系统。

(1)nodefs:保存kubelet的卷和守护进程日志等。

(2)imagefs:在容器运行时保存镜像及可写入层。

kubelet使用cAdvisor自动监控这些文件系统。kubelet不关注其他文件系统,不支持所有其他类型的配置,例如保存在独立文件系统中的卷和日志。

磁盘压力相关的资源回收机制正在逐渐被驱逐策略接管,未来会停止对现有垃圾收集方式的支持。

DiskPressure 磁盘压力 是kubelet去判断的,是要看kubelet 的目录,kubelet目录是通过kubelet 自定义参数root-dir指定,如果没有指定默认是在系统盘的

其中docker 容器目录 和kubelet 目录是有区别的,docker容器目录是要看docker info | grep Root 是不是指向了数据盘,容器里面满不会导致DiskPressure 磁盘压力 用户通过ps -ef | grep kubelet 可以看下有没有设置kubelet自定义参数--root-dir 去指定数据盘,没有指定则默认是在系统盘

如果用户想容器目录满去驱逐POD,需要额外设置imagefs.available 节点压力驱逐详细介绍可以参考K8S官方文档:https://kubernetes.io/zh/docs/concepts/scheduling-eviction/node-pressure-eviction/

  1. 节点压力:当节点压力过大,如CPU使用率过高或磁盘IO过高时,kubelet也可能触发Pod驱逐以减轻节点压力。

解决方案:

1、分析Pod资源使用情况:检查被驱逐的Pod的资源使用情况,如内存、CPU和磁盘使用率。可以使用kubectl describe pod 命令查看Pod的状态和事件。
2、调整资源限制:根据实际需求调整Pod的资源限制,如增加内存限制或CPU限制。可以在Pod的YAML文件中修改资源限制,然后使用kubectl apply -f 命令更新Pod。
3、扩容节点:如果集群中的所有节点都面临资源不足的情况,可以考虑扩容节点以提供更多资源。可以使用云服务提供商的管理控制台或API扩容节点。
4、优化应用:优化应用程序以减少资源使用,如减少内存泄漏、优化CPU使用等。
5、使用优先级和抢占:为Pod设置优先级,以便在资源紧张时根据优先级驱逐Pod。可以在Pod的YAML文件中设置priorityClassName字段。
6、批量清理

###查询确认没问题后再做删除#### 需要把NameSpace替换成用户的命名空间名称
#kubectl get pods -n NameSpace |grep  Evicted
###然后是批量删除##########
#kubectl get pods -n NameSpace | grep Evicted | awk '{print $1}' | xargs kubectl delete pod -n NameSpace

总之,解决Pod的Evicted状态需要分析具体原因,根据实际情况采取相应措施,如调整资源限制、扩容节点或优化应用程序。

阅读剩余
THE END