首页/云/Kubernetes 速查/镜像与容器垃圾回收
集群运维与排障54 条

镜像与容器垃圾回收

kubelet 按高/低水位回收镜像(imageGCHighThresholdPercent / Low),也用 crictl 手工预览与清理未使用镜像与停止容器。

Kubernetes 速查云更新于 2026-10-13

节点磁盘是怎么被镜像吃掉的

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 引用或正在拉取的镜像都不会被删,这也是「清理了但空间没释放」的常见原因。

易错点

  • 在生产节点随意删除带标签的镜像:发布窗口内还会被重新拉取,带来带宽与仓库压力
  • 清理前不确认是否有正在拉取的流水线:删除与拉取并发,出现偶发拉取失败
  • 只看磁盘容量不看 inode:镜像层的小文件把 inode 耗尽,容量看起来仍有空间
  • 缺乏镜像标签策略:历史版本不断堆积,单节点占用持续增长,最终靠人工救火

数据来源与参考

  • Kubernetes 官方文档 · 镜像回收 + crictl 用法
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌