containerd2.x接入Harbor仓库方法
详细介绍了containerd 2.x版本中镜像仓库的配置方法。主要内容包括:1)配置结构说明,采用"一仓库一目录"原则;2)分步配置实战,从版本确认、创建目录到编写hosts.toml文件;3)配置验证方法,推荐使用nerdctl工具;4)常见问题解决方案表,如配置不生效、HTTP仓库连接失败等问题。重点强调了目录名与仓库地址必须严格匹配,以及K8s环境下镜像地址需包含完整仓
一、核心配置结构说明
containerd 2.x 对镜像仓库配置进行了结构化优化,所有相关配置均集中在 /etc/containerd/certs.d/ 目录下,遵循 “一仓库一目录” 的配置原则:
- 每个镜像仓库(registry)对应一个独立目录,目录名需与仓库域名(或 IP 地址)完全一致
- 每个目录下必须包含一个
hosts.toml文件,用于定义仓库连接参数 hosts.toml核心配置项:仓库服务地址(server)、操作权限(capabilities)、认证信息(auth)、证书验证开关(skip_verify)
二、分步配置实战
1. 版本确认
首先通过以下命令验证 containerd 版本是否为 2.x 系列:
[root@k8s-master ~]# containerd --version
containerd containerd.io v2.2.0 1c4457e00facac03ce1d75f7b6777a7a851e5c41
2. 创建配置目录
根据 Harbor 仓库地址创建对应的配置目录,目录名需与仓库域名(或 IP)严格匹配(示例中 Harbor 仓库地址为 harbor.liyb.com):
mkdir -p /etc/containerd/certs.d/harbor.liyb.com
注意:若仓库未使用域名(直接通过 IP 访问),可直接以 IP 地址作为目录名(如
/etc/containerd/certs.d/192.168.1.100)
3. 编写 hosts.toml 配置文件
创建并编辑 hosts.toml 文件,配置仓库连接参数:
vi /etc/containerd/certs.d/harbor.liyb.com/hosts.toml
添加如下配置内容:
server = "https://harbor.liyb.com"
[host."https://harbor.liyb.com"]
capabilities = ["pull", "resolve", "push"] # 支持的操作:拉取、解析、推送
skip_verify = true # 自签名证书时启用(跳过证书验证)
[host."https://harbor.liyb.com".auth]
username = "admin" # Harbor 登录用户名
password = "Harbor12345" # Harbor 登录密码
配置说明:
- 若使用企业级可信证书,无需设置
skip_verify = true,只需将 CA 证书文件放置到对应配置目录(如/etc/containerd/certs.d/harbor.liyb.com/)即可- 权限配置可根据实际需求调整,例如仅需拉取镜像时可改为
capabilities = ["pull", "resolve"]
4. 确认主配置文件路径
检查 containerd 主配置文件 /etc/containerd/config.toml 中是否正确指定了仓库配置路径,确保以下配置项存在且无误:
toml
# /etc/containerd/config.toml
[plugins."io.containerd.grpc.v1.cri".registry]
config_path = "/etc/containerd/certs.d" # 仓库配置目录路径(默认已启用)
注意:containerd 2.x 默认启用该配置,但生产环境部署时务必手动校验,避免路径配置错误导致配置失效
三、配置验证方法
1. 使用 nerdctl 验证(推荐)
通过 nerdctl 工具拉取 Harbor 仓库镜像,验证配置是否生效:
nerdctl pull harbor.liyb.com/prod/nginx:1.27
成功输出示例:
plaintext
harbor.liyb.com/prod/nginx:1.27: manifest-sha256:114dff0fc8ee3d0200c3a12c60e3e2b79d0920dd953175ecb78a0b157425b25e: done
config-sha256:1e5f3c5b981a9f91ca91cf13ce87c2eedfc7a083f4f279552084dd08fc477512: done
elapsed: 0.1 s
total: 0.0 B (0.0 B/s)
2. Kubernetes 节点验证
在 Kubernetes 节点上通过 crictl 工具拉取镜像(适用于 K8s 集群环境):
crictl pull harbor.liyb.com/prod/nginx:1.27
关键注意点:镜像名称必须显式包含 Harbor 仓库地址(完整格式:仓库地址 / 项目名 / 镜像名:标签),否则会导致 K8s Pod 拉取镜像失败
四、高频踩坑与解决方案
| 常见问题 | 排查方向 | 解决方案 |
|---|---|---|
| hosts.toml 配置不生效 | 配置目录名与仓库域名 / 端口不一致 | 确保目录名与镜像中使用的 registry 地址完全匹配(含端口,如 harbor.liyb.com:8080 需对应创建 harbor.liyb.com:8080 目录) |
| HTTP 仓库镜像拉取失败 | 配置文件中未指定 http 协议 | 将 server 地址改为 http:// 开头(如 server = "http://harbor.liyb.com:80") |
| K8s Pod 无法拉取镜像 | 镜像名称未包含仓库地址 | Pod 配置中 image 字段需填写完整路径(如 harbor.liyb.com/prod/nginx:1.27),不可省略仓库地址 |
| 配置后仍无法连接仓库 | 误沿用 Docker 的 daemon.json 配置 | containerd 2.x 不读取 Docker 的 daemon.json 配置,需按本文方法在 certs.d 目录下配置 |
更多推荐



所有评论(0)