节点磁盘是怎么被镜像吃掉的
kubelet 会按高、低水位阈值自动回收镜像与已停止的容器:磁盘使用率超过高水位开始清理,降到低水位以下停止。清理对象是「未被使用」的镜像与已退出的容器,正在被 Pod 引用的镜像不会被回收。排查节点磁盘告警时,先用容器运行时的命令行工具查看镜像与容器占用,再决定是等自动回收还是手工清理未使用镜像。
基本信息
| 适用对象 | 每个节点上的容器运行时与 kubelet 回收机制 |
|---|---|
| 关键参数 | imageGCHighThresholdPercent 与 imageGCLowThresholdPercent |
| 常用工具 | crictl,containerd 与 docker 环境用法基本一致 |
| 回收范围 | 未被使用的镜像与已停止的容器 |
| 注意事项 | 手工清理治标,长期要靠镜像策略与磁盘容量规划 |
典型使用场景
- 节点磁盘告警:定位是镜像、容器还是日志占用为主
- 发布频繁的集群:评估镜像标签策略,减少历史版本堆积
- 批量重建后:清理退出容器占用的空间
- 容量规划:结合镜像体积与发布节奏规划节点磁盘
- 故障排查:排除磁盘因素导致的镜像拉取失败
排查与清理(节点上执行)
排查与清理(节点上执行)
df -h && df -i # 空间与 inode 都要看
crictl images | head -20 # 镜像列表与体积
crictl ps -a | grep -i exited | head # 已退出容器的残留
crictl rmi --prune # 删除未被使用的镜像(发布窗口内谨慎)
journalctl -u kubelet --no-pager | grep -i -E 'imagegc|evict' | tail常用命令与观察点
| 命令 | 作用 | 注意 |
|---|---|---|
| crictl images | 列出镜像与占用 | 关注体积较大且长期未使用的镜像 |
| crictl rmi --prune | 删除未被使用的镜像 | 避开发布窗口与批量拉取时段 |
| crictl ps -a | 查看已退出容器 | 残留容器同样占用磁盘 |
| df -h 与 df -i | 查看空间与 inode | 两者都可能先被耗尽 |
自动回收发生在使用率超过高水位之后:阈值设置过高会让节点长期接近打满,留给 kubelet 的缓冲很薄,容易出现突发写入就被驱逐的情况。
回收只清理未被使用的对象:正在被 Pod 引用或正在拉取的镜像都不会被删,这也是「清理了但空间没释放」的常见原因。