遇到创建Pod失败并报错"no space left on device"时,请按照以下步骤排查和解决问题:
1. 定位问题来源
查看Pod事件:
kubectl describe pod <pod-name> -n <namespace>
在输出中查找 Events
部分,确认错误是否与节点磁盘、存储卷(PVC)或容器镜像层相关。
2. 检查节点磁盘和Inode
登录问题节点:
ssh <node-ip>
查看磁盘使用情况:
df -h # 检查磁盘空间
df -i # 检查Inode使用
重点关注以下目录:
-
/var/lib/docker
(Docker存储目录) -
/var/lib/kubelet
(Kubernetes数据目录) -
/var/log
(日志目录)
3. 清理节点磁盘空间
场景1:Docker/容器占满空间
清理未使用的Docker资源:
docker system prune -af # 清理镜像、容器、卷等(谨慎操作)
手动删除大文件或日志:
du -sh /var/lib/docker/* | sort -rh # 查找大文件
rm -rf /var/lib/docker/overlay2/<hash> # 删除无效容器层(需确认)
场景2:Kubernetes数据占满空间
清理终止状态的Pod:
kubectl delete pod --field-selector=status.phase=Failed --all-namespaces
清理镜像缓存:
kubelet --image-gc-high-threshold=90 --image-gc-low-threshold=85
场景3:日志文件占满空间
清理旧日志:
journalctl --vacuum-time=7d # 清理系统日志
rm -rf /var/log/pods/* # 清理Kubernetes Pod日志(谨慎操作)
4. 检查持久化存储(PVC/PV)
确认PVC容量是否足够:
kubectl get pvc -n <namespace>
扩展PVC容量(若支持动态扩容):
# 编辑PVC的spec.resources.requests.storage字段
kubectl edit pvc <pvc-name> -n <namespace>
5. 检查Inode耗尽
若df -i
显示Inode用尽:
# 查找小文件密集的目录(如日志、缓存)
find / -xdev -type f | cut -d "/" -f 2 | sort | uniq -c | sort -n
清理无用文件或迁移数据。
6. 调整临时存储限制
在Pod配置中设置临时存储限制:
resources:
limits:
ephemeral-storage: "2Gi"
requests:
ephemeral-storage: "1Gi"
7. 预防措施
-
监控磁盘和Inode:部署监控工具(如Prometheus+Node Exporter),设置磁盘使用告警。
-
定期维护:设置CronJob自动清理旧日志和镜像。
-
合理分配存储:确保PVC容量和节点存储预留足够空间。
通过以上步骤,通常可解决"no space left on device"问题。如仍无法解决,请检查节点硬件或考虑扩容磁盘。