kubernetes集群中清理未使用镜像需先确认containerd运行时并配置crictl,再通过crictl images与crictl ps -a比对识别真正闲置镜像,推荐用crictl rmi --prune安全删除,长期应调优kubelet的imagegchighthresholdpercent等参数启用自动gc。

直接清理未使用的容器镜像,核心是区分“被引用”和“真正闲置”的镜像,并避免误删正在运行或即将启动的镜像。Kubernetes 本身不提供一键删除命令,但可通过 Kubelet 原生机制 + crictl 工具组合实现安全、可控的清理。
确认当前容器运行时并配置 crictl
自 v1.24 起,Kubernetes 已移除 Dockershim,绝大多数集群使用 containerd。需先确认节点实际运行时:
- 执行 crictl version 或检查 ps aux | grep containerd 确认 containerd 正在运行
- 若 crictl 未配置,创建 /etc/crictl.yaml,内容为:
runtime-endpoint: unix:///var/run/containerd/containerd.sock
image-endpoint: unix:///var/run/containerd/containerd.sock
timeout: 10
debug: false
查看与筛选未使用镜像
crictl images 显示所有本地镜像,但其中部分可能正被 Pod 引用。不能仅靠“未运行”判断是否可删——关键看是否被任何容器引用:
- 运行 crictl images 查看全部镜像及 ID(推荐用 ID 操作,避免 tag 冲突)
- 运行 crictl ps -a 获取所有容器(含已停止),再比对镜像引用关系
- 真正“未使用”的镜像 = 既不在 crictl ps -a 输出中出现,也不在当前所有 Pod 的 .spec.containers[].image 字段中
执行安全清理操作
有两类常用方式,按风险等级区分:
-
推荐:crictl rmi --prune
自动删除所有未被任何容器引用的镜像(包括 dangling 和无标签镜像),且跳过最近 2 分钟内拉取的镜像(受 imageMinimumGCAge 保护) -
精准控制:逐个删除指定镜像
先查 ID:crictl images | grep 'none' | awk '{print $3}'(找 dangling 镜像)
再删:crictl rmi(例如 crictl rmi sha256:abc123...)
调优 Kubelet 自动 GC 防止反复堆积
手动清理只是临时手段。长期治理需调整 Kubelet 的镜像垃圾回收策略:
- 编辑节点上的 /var/lib/kubelet/config.yaml,添加或修改:
- imageGCHighThresholdPercent: 75 # 触发清理的磁盘上限(默认 85)
- imageGCLowThresholdPercent: 65 # 清理目标水位(默认 80)
- imageMinimumGCAge: "10m" # 镜像至少闲置 10 分钟才可被回收
- 保存后执行 systemctl restart kubelet 生效











