故障现象与根因
磁盘容量充足(df -h 显示使用率仅50%),但容器写入报错 no space left on device。根本原因是 inode 耗尽。
- 检查命令:
df -i。若IUse%达到100%,则确定是 inode 问题。 - 触发机制:Docker Overlay2 驱动为每个镜像层和容器层创建大量小文件。CI/CD 频繁构建、容器反复创建销毁,即使数据量很小,也会快速消耗 inode 配额。
- 数据量:一个典型 /dev/vda1 分区 inode 上限为 6553600,耗尽后无法创建任何新文件或目录。
快速定位与诊断
使用以下命令定位 inode 高占用目录,并确认 Docker 目录的负载情况。
- 全局扫描:
for i in /*; do echo "$(find $i | wc -l) $i"; done | sort -nr | head。输出结果中,/var/lib/docker目录通常排在前列。 - Docker 专项:
find /var/lib/docker/overlay2 -type f | wc -l。统计 Overlay2 目录下的文件总数,数值越大,inode 压力越高。 - 资源总览:
docker system df。查看镜像、容器、卷的磁盘占用和数量,快速识别无用资源。
清理与回收操作
执行清理命令释放 inode。注意操作顺序,先清理最占资源的项。
- 全量清理:
docker system prune -a。删除所有未使用的镜像、容器、网络和构建缓存。谨慎使用,会移除所有未被容器引用的镜像层。 - 悬空卷清理:
docker volume prune。删除未被任何容器挂载的匿名卷。 - 构建缓存清理:
docker builder prune -a。删除 BuildKit 构建缓存。BuildKit 在大量构建场景下,缓存增长速度远超传统模式,占用大量 inode。 - 查看缓存占用:
docker buildx du。显示 BuildKit 缓存的具体大小和文件数量。
自动化与架构优化
针对长期运行的 CI/Kubernetes 节点,设置自动回收策略,避免人工干预。
| 策略 | 命令/参数 | 效果 |
|---|---|---|
| 定期清理镜像 | docker image prune -a -f --filter "until=168h" |
保留最近7天内的镜像,删除更早的。 |
| Kubelet 镜像回收 | --image-gc-high-threshold=80 --image-gc-low-threshold=60 |
磁盘使用率达到80%时触发回收,降至60%停止。 |
| 镜像仓库集中管理 | 推送至 Harbor 或私有 Registry | 构建节点只保留最近几天的缓存,不堆积本地镜像。 |
主要功能
- inode 使用率检测:通过
df -i读取文件系统 inode 总数与已用数,输出百分比,判断是否接近100%上限。 - Overlay2 文件计数:使用
find /var/lib/docker/overlay2 -type f \| wc -l统计存储驱动层文件总量,直接反映 inode 压力来源。 - Docker 资源总览:
docker system df聚合展示镜像、容器、卷的磁盘与 inode 占用,支持按类型筛选清理。 - 全量垃圾回收:
docker system prune -a递归删除所有未使用的镜像层、容器、网络和构建缓存,释放大量 inode。 - 构建缓存清理:
docker builder prune -a专门清除 BuildKit 构建过程中的中间缓存层,这些缓存文件数量多、体积小,是 inode 消耗大户。 - Kubelet 自动回收:设置
--image-gc-high-threshold和--image-gc-low-threshold参数,当磁盘 inode 使用率达到阈值后,kubelet 自动触发镜像垃圾回收。
使用说明
- 先执行
df -i确认 inode 使用率。若超过90%,优先执行docker system prune -a。 - 清理构建缓存时,使用
docker buildx du查看缓存占用,再用docker buildx prune -a删除。 - 对于 CI 节点,设置
docker image prune -a -f --filter "until=168h"的定时任务。 - Kubernetes 节点需在 kubelet 配置文件中添加
--image-gc-high-threshold=80参数。
同类竞品对比
| 对比维度 | Overlay2 Inode 耗尽排查方案 | 传统磁盘容量告警方案 | 文件系统级 inode 监控工具 |
|---|---|---|---|
| 检测目标 | 聚焦 Overlay2 驱动产生的 inode 消耗 | 检测磁盘块设备容量(GB级) | 检测文件系统 inode 总数与已用数 |
| 触发条件 | 容器写入报错、df -i 达100% |
df -h 使用率超阈值 |
Prometheus 指标 node_filesystem_files_free 低于阈值 |
| 清理范围 | Docker 镜像、容器、构建缓存、卷 | 日志文件、临时文件 | 不提供清理功能,仅告警 |
| 自动化能力 | 支持 docker system prune、kubelet 参数 |
需手动或脚本清理 | 仅提供数据采集,无自动化回收 |
| 适用场景 | Docker/Kubernetes 节点频繁构建、销毁容器 | 通用服务器磁盘空间不足 | 所有 Linux 文件系统 inode 监控 |
| 核心差异 | 针对容器场景的 inode 回收,能直接清理镜像层 | 不区分 inode 与容量,误报率高 | 只监控不处理,需配合其他工具 |








这一切,似未曾拥有