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/
- 节点压力:当节点压力过大,如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状态需要分析具体原因,根据实际情况采取相应措施,如调整资源限制、扩容节点或优化应用程序。
本站网址:www.Linux66.cn
本站提供的一切软件、教程和内容信息仅限用于学习和研究目的。
不得将上述内容用于商业或者非法用途,否则,一切后果请用户自负。
我们非常重视版权问题,如有侵权请邮件与我们联系处理。敬请谅解!邮件:pengch1611@gmail.com
网站部分内容来源于网络,版权争议与本站无关。请在下载后的24小时内从您的设备中彻底删除上述内容。
如无特别声明本文即为原创文章仅代表个人观点,版权归《DevOps运维技术栈》所有,欢迎转载,转载请保留原文链接。