Kubernetes Pod 被驱逐(Evicted)问题排查与解决方案
故障现象
在 Kubernetes 集群中,部分 Pod 状态变为**Evicted,且频繁重启或被疯狂重新创建后依然被驱逐,导致应用无法正常运行
示例
k8s-demo frontend-deployment-xxxxx 0/1 Evicted 0 30s使用kubectl describe pod 查看 Pod 事件发现:
Warning Evicted pod/frontend-deployment-xxxxx The node had condition: [DiskPressure].说明节点发生了磁盘压力(DiskPressure)导致驱逐 Pod。
故障原因
Kubernetes 节点的磁盘空间不足,触发了节点状态中的 DiskPressure 条件。此时,kubelet 会根据节点资源压力优先驱逐 Pod,以保证节点系统正常运行。
造成磁盘压力的常见原因包括:
- Docker 镜像和容器占用过多磁盘空间
- 节点系统日志过大
- 磁盘容量本身较小或分区不合理
- 长时间未清理无用文件和缓存
排查过程
1. 查看被驱逐的 Pod 详情
kubectl describe pod <pod-name> -n <namespace>重点关注Events,确认驱逐原因是否为 DiskPressure。
2. 查看节点状态及条件
kubectl describe node <node-name>查看节点的Conditions,确认 DiskPressure 是否为 True。
3. 登录节点检查磁盘空间
ssh <node-name>
df -h重点查看关键目录所用磁盘空间:
/var/lib/docker或/var/lib/containerd/var/lib/kubelet/var/log
确认是否有磁盘空间严重不足。
4. 查看具体磁盘使用情况
du -sh /var/lib/docker/*
du -sh /var/lib/kubelet/*
du -sh /var/log/*找出占用空间大的文件夹和日志。
解决方法
1. 清理 Docker 资源
删除无用镜像、容器和卷,释放磁盘空间:
docker image prune -a -f
docker container prune -f
docker volume prune -f如果使用 containerd,使用对应命令清理。
2. 清理系统日志
查看日志大小:
du -sh /var/log/*清理旧日志,保留最近几天的:
journalctl --vacuum-time=2d3. 增加磁盘容量(如有条件)
扩展节点磁盘容量,避免磁盘使用率过高。
4. 监控和自动清理
建议配置节点磁盘使用监控和自动清理策略,避免磁盘压力反复出现。
恢复验证
清理完成后,确认节点状态:
kubectl describe node <node-name>确保DiskPressure 状态消失。Pod 应自动调度正常启动。
总结
Pod被驱逐且显示DiskPressure,说明节点磁盘资源紧张。通过清理无用 Docker 资源和日志、扩容磁盘及监控,可以有效解决和避免该问题,保障 Kubernetes 集群稳定运行。
常用命令速查
| 作用 | 命令 |
|---|---|
| 查看 Pod 详情 | kubectl describe pod <pod-name> -n ns |
| 查看节点状态 | kubectl describe node <node-name> |
| 查看磁盘使用 | df -h |
| 查看目录大小 | du -sh /path/* |
| 清理 Docker 镜像和容器 | docker image/container/volume prune |
| 清理系统日志 | journalctl --vacuum-time=2d |