在Kubernetes(K8S)中,Pod的Evicted状态表示Pod已经被驱逐,并不再运行在节点上。Pod驱逐主要是由于资源约束,如内存不足或磁盘空间不足。以下是详细原理、原因和解决方案。
原理: Kubernetes集群会监控节点资源使用情况,当资源不足时,kubelet会触发Pod驱逐过程。驱逐过程会根据优先级和资源使用情况选择要驱逐的Pod。一旦Pod被驱逐,其状态将变为Evicted,相关事件也会被记录。
原因:
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/
3. 节点压力:当节点压力过大,如CPU使用率过高或磁盘IO过高时,kubelet也可能触发Pod驱逐以减轻节点压力。
解决方案:
###查询确认没问题后再做删除#### 需要把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状态需要分析具体原因,根据实际情况采取相应措施,如调整资源限制、扩容节点或优化应用程序。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。