当前位置:首页 > 文章列表 > 科技周边 > 业界新闻 > 云原生 containerd 清理镜像 怎样处理

云原生 containerd 清理镜像 怎样处理

来源:17golang原创 2026-10-22 07:23:24 0浏览 收藏

containerd 清理镜像,关键不是找到一个“删得最狠”的命令,而是先确认这些镜像由谁使用、位于哪个 namespace,以及它们是否仍被容器、快照或 lease 引用。独立 containerd 可以用 ctr 查看和删除,日常镜像管理更适合 nerdctl;Kubernetes 节点则优先沿着 CRI 的管理边界处理。

官方地址:https://github.com/containerd/containerd/

稳妥的顺序是“确认运行时边界 → 列出镜像 → 精确删除或按条件 prune → 等待并观察 GC”。不要直接删除 /var/lib/containerd,也不要把删除镜像引用误认为已经同步删除所有层。

先判断:你清理的是哪一套 containerd

我第一次遇到节点磁盘告警时,最容易误判的是把“能执行 ctr”当成“正在操作业务使用的镜像”。containerd 支持 namespace;Kubernetes、独立容器工具和测试任务可能并不共享同一个镜像视图。containerd 官方还明确说明,ctr 主要用于调试,面向日常使用的 CLI 是 nerdctl。

# 先看 containerd 的插件和 namespace,确认命令连接到哪套运行时
sudo ctr plugins ls
sudo ctr namespaces ls

# 独立 containerd 场景:只查看当前 namespace 的镜像引用
sudo ctr images ls

# 常见的 Kubernetes CRI 场景:优先从 CRI 视角查看镜像
sudo crictl images

如果节点由 Kubernetes 管理,不要把 ctr images rm 当成 kubelet 镜像回收策略的替代品。先确认 kubelet、CRI 配置和实际的 containerd namespace;如果只是独立主机上的 nerdctl 工作流,则用 nerdctl 的镜像命令更容易表达“未使用”和过滤条件。

containerd 独立命令、nerdctl 与 Kubernetes CRI 的边界关系说明图
图1:说明图,查看 containerd、CLI、CRI 和镜像视图之间的静态边界;这不是运行时截图。

为什么删掉镜像后磁盘空间没有立刻下降

containerd 的镜像不是一个单独的大文件。拉取后,索引或 manifest、config、压缩层、解压后的 snapshot 都可能参与资源关系;content store 按内容摘要保存对象,snapshotter 再负责容器文件系统快照。一个镜像引用被移除,只能说明这条引用不再保留,不代表所有相关资源此刻都没有其它引用。

官方垃圾回收文档把资源关系分成镜像、容器、快照、content 和 lease。lease 是客户端在操作完成后继续声明“未来还会使用这些资源”的方式。如果资源仍被容器或 lease 引用,GC 不应当把它们当成可回收对象。

# 查看镜像、content 与快照的概况;这些是排查信息,不要手动改目录
sudo ctr images ls
sudo ctr content ls
sudo ctr snapshots ls

# 独立 containerd 场景可用精确引用删除镜像元数据
sudo ctr images rm docker.io/library/nginx:1.27

因此,删除后的正确预期是:镜像引用先消失,随后由 containerd 的 GC 根据引用关系回收不再使用的 content 和 snapshot。回收时机与后台调度、删除数量和数据库变更有关,释放空间也可能受到正在运行容器、共享层和文件系统行为影响。

containerd 镜像引用、content、snapshotter、容器和 lease 的垃圾回收关系说明图
图2:结构说明图,查看镜像引用、content、快照、容器和 lease 如何共同影响 GC;这不是运行结果。

按场景选择删除方式

如果只想删一个确定的标签,优先用精确引用删除,改动面最小。需要批量清理时,先用 nerdctl 列出并确认工作流,再使用它的 image prune;该命令支持只处理 dangling image,也支持 -a、until 和 label 过滤。

# nerdctl 工作流:先列出镜像,再只清理 dangling image
sudo nerdctl images
sudo nerdctl image prune

# 需要扩大范围时显式写出 -a,并用时间条件限制候选
sudo nerdctl image prune -a --filter "until=168h"

# 生产环境先保留预览和审批记录;确认无误后再加 -f 取消交互确认
sudo nerdctl image prune -a --filter "label=cleanup.candidate=true" -f

如果是 Kubernetes 节点,优先从 CRI 视角处理未被工作负载使用的镜像,并让 kubelet 的镜像回收策略承担日常治理。crictl 更适合诊断 CRI;对具体镜像执行删除前,要确认它不再被运行中的 Pod 或下一次滚动发布需要。

# Kubernetes 节点:从 CRI 视角列出镜像,避免只看错 namespace
sudo crictl images

# 仅在已经确认该镜像不再被工作负载需要时执行精确删除
sudo crictl rmi registry.example.com/team/service:old

我现在会保留的四个检查点

清理动作真正危险的地方,不在命令长度,而在“删完才发现下一次启动要重新拉取”。我通常会把下面四项写进维护记录:

  • 命名空间:记录 ctr namespaces ls 的目标,不凭默认值猜测。
  • 使用者:确认没有运行中容器、Pod、滚动发布或离线任务依赖目标镜像。
  • 保留窗口:为回滚镜像、基础镜像和最近一次稳定版本保留空间,避免把 prune 变成一次性清空。
  • 回收结果:删除后观察 containerd 的资源变化和文件系统余量;不要用手工删除目录来“加速”结果。

最值得避免的做法是直接执行 rm -rf /var/lib/containerd。这会绕开 content、snapshot、metadata 和 lease 的关系管理,可能让现有容器、重启恢复和后续拉取一起进入不可预测状态。需要释放异常占用时,应先看日志、namespace、快照和 lease,再决定是删除某个引用、清理租约,还是修复调用方的资源生命周期。

常见问题

删了 tag,为什么层文件还在?

因为同一层可能被其它镜像、容器、snapshot 或 lease 引用。tag 删除改变的是镜像引用,GC 会按资源关系判断是否可回收,不保证同步删除。

containerd 和 nerdctl 的 prune 能混用吗?

不要把两个 CLI 的 namespace、snapshotter 和管理边界想当然地混在一起。先确认镜像由哪套工具创建,再使用同一套工具查看、筛选和删除。

Kubernetes 节点可以定时执行 ctr images prune 吗?

应先评估 kubelet 的镜像回收、CRI 配置和发布回滚需求。定时任务直接删除生产节点镜像,可能增加下一次调度的拉取压力;通常应先调整运行时治理策略,而不是把手工清理脚本当成唯一方案。

总结一下:containerd 清理镜像的核心是管理引用关系,而不是删除一个目录。先分清使用者和 namespace,再用精确删除或有过滤条件的 prune,最后让 GC 在保留运行中资源的前提下完成回收。

版本声明
本文转载于:17golang原创 如有侵犯,请联系study_golang@163.com删除
OpenTelemetry Java Agent 3.0 预览版怎样试用OpenTelemetry Java Agent 3.0 预览版怎样试用
上一篇
OpenTelemetry Java Agent 3.0 预览版怎样试用
云原生 Kubernetes 1.34 调度变化 怎样处理
下一篇
云原生 Kubernetes 1.34 调度变化 怎样处理
查看更多
最新文章
查看更多
课程推荐
  • 前端进阶之JavaScript设计模式
    前端进阶之JavaScript设计模式
    设计模式是开发人员在软件开发过程中面临一般问题时的解决方案,代表了最佳的实践。本课程的主打内容包括JS常见设计模式以及具体应用场景,打造一站式知识长龙服务,适合有JS基础的同学学习。
    543次学习
  • GO语言核心编程课程
    GO语言核心编程课程
    本课程采用真实案例,全面具体可落地,从理论到实践,一步一步将GO核心编程技术、编程思想、底层实现融会贯通,使学习者贴近时代脉搏,做IT互联网时代的弄潮儿。
    516次学习
  • 简单聊聊mysql8与网络通信
    简单聊聊mysql8与网络通信
    如有问题加微信:Le-studyg;在课程中,我们将首先介绍MySQL8的新特性,包括性能优化、安全增强、新数据类型等,帮助学生快速熟悉MySQL8的最新功能。接着,我们将深入解析MySQL的网络通信机制,包括协议、连接管理、数据传输等,让
    500次学习
  • JavaScript正则表达式基础与实战
    JavaScript正则表达式基础与实战
    在任何一门编程语言中,正则表达式,都是一项重要的知识,它提供了高效的字符串匹配与捕获机制,可以极大的简化程序设计。
    487次学习
  • 从零制作响应式网站—Grid布局
    从零制作响应式网站—Grid布局
    本系列教程将展示从零制作一个假想的网络科技公司官网,分为导航,轮播,关于我们,成功案例,服务流程,团队介绍,数据部分,公司动态,底部信息等内容区块。网站整体采用CSSGrid布局,支持响应式,有流畅过渡和展现动画。
    485次学习
查看更多
AI推荐
  • PubMedQA数据集详解:生物医学问答基准、功能与应用指南
    PubMedQA
    深入了解PubMedQA生物医学问答数据集,涵盖其核心功能、使用方法及在临床决策、药物研发等场景的应用,助力提升NLP模型性能。
    592次使用
  • H2O EvalGPT:开源LLM大模型评估与排行榜工具
    H2O EvalGPT
    H2O EvalGPT是H2O.ai推出的开源LLM评估平台,提供详细的大模型性能排行榜、行业特定基准测试及A/B测试功能,助您快速选择最适合项目的高性能大语言模型。
    628次使用
  • LMArena是什么?伯克利AI模型评估平台使用指南与功能解析
    LMArena
    LMArena是加州大学伯克利分校推出的AI模型匿名评测平台。通过盲测投票机制,用户可对比不同大模型回答并生成实时排行榜,助力开发者优化模型及用户选择最佳AI工具。
    661次使用
  • 斯坦福HELM:大语言模型Holistic Evaluation整体评估框架详解
    HELM
    深入了解斯坦福推出的HELM(Holistic Evaluation of Language Models)大模型评测体系。本文解析其核心功能、安装配置步骤及应用场景,涵盖准确性、公平性、鲁棒性等多维度指标,助力开发者全面优化语言模型性能。
    631次使用
  • MMBench详解:多模态大模型基准测试、功能特点与使用指南
    MMBench
    MMBench是由上海人工智能实验室等机构联合推出的多模态基准测试平台,提供细粒度能力评估、大规模数据集及VLMEvalKit工具。本文详细介绍其核心功能、安装使用方法及应用场景,助力开发者全面评估多模态模型性能。
    445次使用
微信登录更方便
  • 密码登录
  • 注册账号
登录即同意 用户协议 和 隐私政策
返回登录
  • 重置密码