使用k3s+外部containerd时同ID镜像重复问题求助
使用K3s+外部Containerd时镜像重复(无标签镜像冗余)问题排查与解决
问题描述
在使用K3s搭配外部Containerd时,所有镜像均出现重复现象,涵盖三类场景:
- K3s自动拉取的镜像(如kube-system命名空间下的相关镜像)
- 通过CLI本地构建的镜像(使用Docker/Nerdctl兼容模式)
- 通过CLI从Docker Hub及私有镜像仓库手动拉取的镜像
重复生成的镜像均为无标签状态。目前该问题未影响业务运行,但会导致镜像列表混乱:手动删除镜像时必须添加--force参数否则报错,同时存在磁盘空间浪费的隐患。
此前未出现该问题,尝试搜索相关内容未找到对应案例,升级/回退组件版本也无改善,需排查是否为配置错误及解决方法。
组件版本
- crun: 1.8.4
- containerd: 1.6.21
- nerdctl: 1.3.1
- k3s: v1.24.12+k3s1(非无根模式,未启用apparmor/selinux)
- buildkit: 0.11.6
系统环境:Ubuntu 22.04.2 LTSLinux ubuntu 5.15.0-73-generic #80-Ubuntu SMP Mon May 15 15:18:26 UTC 2023 x86_64 x86_64 x86_64 GNU/Linux
已尝试方案
- 调整各组件版本
- 在containerd/docker/k3s仓库及论坛搜索相关内容
- 在新虚拟机中重新搭建环境
排查与解决步骤
1. 校验Containerd与K3s的镜像存储配置一致性
K3s默认使用内部Containerd,指定外部Containerd时,需确保两者镜像存储配置完全对齐,否则会导致镜像元数据重复:
- 查看K3s的Containerd配置:
cat /var/lib/rancher/k3s/agent/etc/containerd/config.toml - 查看外部Containerd的配置:
cat /etc/containerd/config.toml
重点核对以下字段:root:镜像存储根目录,需确保两者指向同一路径(若K3s复用外部Containerd,应配置K3s使用外部Containerd的root路径)plugin."io.containerd.grpc.v1.cri".registry:镜像仓库配置,避免重复拉取源导致元数据冗余
2. 确认Nerdctl与K3s的Containerd Socket连接一致
若K3s未正确复用外部Containerd的Socket,会导致Nerdctl和K3s各自维护镜像元数据:
- 查看Nerdctl使用的Socket路径:
nerdctl info | grep "Containerd Socket" - 检查K3s启动参数:确认是否添加
--containerd-endpoint指定外部Containerd的Socket(如/run/containerd/containerd.sock)
3. 清理冗余镜像元数据
若配置无误,可手动清理无标签的冗余镜像:
- 使用Containerd命令清理:
ctr images prune -a(注意:该命令会删除所有未被容器使用的镜像,执行前需确认业务容器稳定运行) - 使用Nerdctl命令清理:
nerdctl image prune -a
4. 验证镜像拉取/构建流程
- 拉取测试镜像:
nerdctl pull nginx:alpine,执行nerdctl images查看列表,确认无重复无标签镜像 - 本地构建测试镜像:创建简单Dockerfile后执行
nerdctl build -t test:v1 .,查看镜像列表确认无冗余
5. 检查Buildkit的Containerd连接配置
使用Buildkit构建镜像时,需确保其连接的是与K3s相同的Containerd实例:
- 查看Buildkit容器挂载配置:
nerdctl inspect buildkitd,确认挂载了正确的Containerd Socket和存储目录
预期结果
构建或拉取镜像时,不再生成同ID、同大小的重复镜像(无标签状态镜像不再出现)。
内容的提问来源于stack exchange,提问作者anvouk
相关产品推荐
相关产品推荐

