在AWS EKS 1.24中清理Containerd特定未使用镜像的正确方法
问题描述
我有大量未使用的镜像,执行以下命令可列出所有含dev-前缀的镜像(部分被运行中容器使用):
ctr -n k8s.io i ls | grep "dev-" | wc -l 139
请问是否有合适的方法仅清理以下特定未使用镜像:
- 来自特定镜像仓库的
- 或标签带有
dev-前缀的
我此前在Docker中使用以下命令可正常清理:
docker ps --filter "status=exited" -q | xargs -r docker rm && docker image prune --all
尝试使用类似命令:
crictl rmi --prune
但导致AWS EKS节点崩溃,原因是该命令删除了pause容器所需的必要镜像。
解决方案
方法1:使用ctr工具精准清理(推荐,适配containerd)
EKS默认用containerd作为容器 runtime,ctr是它的原生工具,能精准控制清理范围:
- 先验证目标镜像列表
先筛选出未被任何容器引用,同时符合「特定仓库」或「dev-前缀标签」条件的镜像:# 替换registry.example.com为你的目标仓库地址 ctr -n k8s.io i ls --quiet | xargs -I {} ctr -n k8s.io i inspect {} | jq -r 'select(.Status.UsedBy == []) | .RepoTags[]' | grep -E "(registry.example.com|dev-)" - 执行清理
确认列表无误后,执行删除:ctr -n k8s.io i ls --quiet | xargs -I {} ctr -n k8s.io i inspect {} | jq -r 'select(.Status.UsedBy == []) | .RepoTags[]' | grep -E "(registry.example.com|dev-)" | xargs -r ctr -n k8s.io i rm
方法2:改进crictl命令,规避必要镜像删除
crictl rmi --prune会无差别删除所有未使用镜像,通过添加过滤条件限定清理范围:
# 清理特定仓库下的未使用镜像 crictl images --quiet --filter "repository=registry.example.com" --filter "dangling=false" | xargs -r crictl rmi # 清理标签带dev-前缀的未使用镜像 crictl images --quiet --filter "tag=dev-*" --filter "dangling=false" | xargs -r crictl rmi
注:tag=dev-*支持模糊匹配所有dev-开头的标签;dangling=false避免误删无标签的系统必要镜像。
注意事项
- 操作前务必先执行查询命令确认待删镜像列表,避免误删关键组件镜像
- 可将清理逻辑写成脚本,通过CronJob在EKS节点上定期执行
- 禁止直接使用
crictl rmi --prune或ctr i prune,这类命令会误删pause、CNI插件等系统依赖镜像
内容的提问来源于stack exchange,提问作者DmitrySemenov
相关产品推荐
相关产品推荐

