别再只用 docker 命令了!K8s 1.28 时代,用 ctr 和 nerdctl 管理镜像的完整操作手册
从Docker到Containerd:Kubernetes 1.28时代的镜像管理实战指南
当Kubernetes社区宣布从1.24版本开始逐步弃用Docker时,许多习惯了 docker 命令的开发者感到措手不及。如今随着Kubernetes 1.28的普及,掌握 ctr 和 nerdctl 这两个Containerd原生工具已成为云原生工程师的必备技能。本文将带你全面了解如何在Kubernetes新版本中高效管理容器镜像,从基础操作到私有仓库集成,提供一份真正实用的命令对照手册。
1. Containerd工具链全景解析
在Docker时代,我们习惯了使用 docker 这一套统一的CLI工具来完成所有容器操作。而转向Containerd后,工具链变得更加模块化:
- ctr :Containerd官方提供的低级命令行工具,功能强大但用户体验较为原始
- nerdctl :由Containerd社区开发的更友好工具,兼容大部分Docker命令语法
- crictl :Kubernetes CRI接口工具,主要用于调试而非日常镜像管理
三者中, ctr 和 nerdctl 是最常用的镜像管理工具。 ctr 直接与Containerd守护进程通信,而 nerdctl 在功能上更接近开发者熟悉的 docker 命令。
注意:Kubernetes 1.28默认使用
k8s.io作为Containerd的命名空间,所有Kubernetes相关的镜像操作都应指定该命名空间
2. 基础镜像操作完全对照手册
2.1 镜像拉取与查看
Docker方式 :
docker pull nginx:alpine
docker images
ctr方式 :
ctr image pull docker.io/library/nginx:alpine
ctr image ls
nerdctl方式 :
nerdctl pull nginx:alpine
nerdctl images
关键差异点:
ctr需要完整镜像路径(包括docker.io/library/前缀)nerdctl命令与docker几乎一致,学习成本最低ctr默认操作的是default命名空间,而Kubernetes使用的是k8s.io
2.2 镜像标签管理
为镜像打标签是部署流程中的常见操作,三种工具的实现方式各有特点:
Docker :
docker tag nginx:alpine my-registry.example.com/nginx:1.0
ctr :
ctr image tag docker.io/library/nginx:alpine my-registry.example.com/nginx:1.0
nerdctl :
nerdctl tag nginx:alpine my-registry.example.com/nginx:1.0
特别需要注意的是,使用 ctr 为Kubernetes使用的镜像打标签时,必须指定命名空间:
ctr -n k8s.io image tag nginx:alpine my-registry.example.com/nginx:1.0
3. 私有仓库集成实战
在企业环境中,Harbor是最常用的私有镜像仓库之一。与Docker不同,Containerd需要额外配置才能与私有仓库安全交互。
3.1 HTTP仓库的特殊处理
对于使用HTTP协议的Harbor仓库(测试环境常见),需要添加特殊参数:
ctr方式 :
ctr images pull --plain-http=true --skip-verify my-harbor.example.com/library/nginx:latest
nerdctl方式 :
nerdctl --insecure-registry pull my-harbor.example.com/library/nginx:latest
提示:生产环境强烈建议配置HTTPS证书,避免使用
--plain-http和--insecure-registry这类不安全参数
3.2 认证配置最佳实践
与私有仓库交互通常需要认证,三种工具的处理方式:
| 功能 | Docker | ctr | nerdctl |
|---|---|---|---|
| 登录认证 | docker login | 通过--user参数 | nerdctl login |
| 认证信息存储 | ~/.docker/config.json | 无持久化存储,每次需指定 | ~/.docker/config.json |
| 典型用法 | docker login my-registry | ctr --user user:pass pull my-registry/img | nerdctl login my-registry |
对于 ctr ,推荐将认证信息放入环境变量避免命令行历史记录敏感信息:
export REGISTRY_CREDS="username:password"
ctr images pull --user $REGISTRY_CREDS my-registry.example.com/image:tag
4. 高级镜像管理技巧
4.1 镜像导入导出
在离线环境或跨集群迁移时,镜像的导入导出是常见需求。
导出镜像 :
# ctr方式
ctr image export nginx.tar docker.io/library/nginx:alpine
# nerdctl方式
nerdctl save -o nginx.tar nginx:alpine
导入镜像 :
# 导入到默认命名空间
ctr image import nginx.tar
# 导入到k8s.io命名空间(Kubernetes可见)
ctr -n k8s.io image import nginx.tar
4.2 镜像垃圾清理
随着时间推移,系统中会积累大量无用镜像,需要定期清理:
查看镜像磁盘使用 :
du -sh /var/lib/containerd/
清理未使用镜像 :
ctr images ls | awk '{print $1}' | xargs -I {} ctr images rm {}
nerdctl特有功能 :
# 查看镜像分层详情
nerdctl image inspect nginx:alpine
# 构建时自动清理中间层
nerdctl build --rm .
5. Kubernetes集成要点
当在Kubernetes 1.28中使用Containerd时,有几个关键点需要特别注意:
-
镜像拉取策略 :在PodSpec中正确设置
imagePullPolicy,对于本地已存在的镜像使用IfNotPresent -
私有仓库认证 :通过
imagePullSecrets配置访问私有仓库的凭证,不再依赖docker login -
节点镜像预热 :在集群扩容前,建议先在节点上预拉取所需镜像:
ctr -n k8s.io image pull my-registry.example.com/app:1.0 -
故障排查命令 :
# 查看kubelet拉取的镜像 crictl -n k8s.io images # 查看镜像拉取日志 journalctl -u kubelet | grep "pulling image"
在实际迁移过程中,建议先在测试环境验证所有镜像操作流程。许多团队遇到的典型问题包括:忘记指定 k8s.io 命名空间、HTTP仓库配置不当,以及认证信息传递不正确等。
更多推荐


所有评论(0)