You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在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是它的原生工具,能精准控制清理范围:

  1. 先验证目标镜像列表
    先筛选出未被任何容器引用,同时符合「特定仓库」或「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-)"
    
  2. 执行清理
    确认列表无误后,执行删除:
    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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.23 19:12:15