Containerd 注册表主机配置 Registry Host

秋意零 2024-11-25 50 11/25

Containerd 注册表主机配置

大家好,我是秋意零。今天分享如何配置 Containerd 注册表主机配置。

不知道大家在使用 Containerd 作为容器运行时时,是否有遇到下列情况?

  1. 为啥我配置了config_path路径不生效,反而Containerd还报错呢?
  2. 拉取镜像时为啥我nerdctl命令可以跳过证书验证,使用ctr命令就不行了呢?

带着这两个疑问,我们接着往下看!

注册表主机配置

containerd 配置文件中registry.mirrorsregistry.configs 部分已被弃用。现在,由config_path="/etc/containerd/certs.d"配置路径取代。

注意:如果配置config_path,就不要配置registry.mirrorsregistry.configs 。如下图:

Containerd 注册表主机配置 Registry Host

下面这两个Containerd报错原因:提供config_path时无法设置mirrorsconfigs

level=warning msg="failed to load plugin io.containerd.grpc.v1.cri" error="invalid plugin config: mirrors cannot be set when config_path is provided"
Containerd 注册表主机配置 Registry Host
Nov 19 14:00:36 k8s-master-1 containerd[65105]: time="2024-11-19T14:00:36.952445827+08:00" level=warning msg="failed to load plugin io.containerd.grpc.v1.cri" error="invalid plugin config: configs.tls cannot be set when config_path is provided"
Containerd 注册表主机配置 Registry Host

注册表主机命名空间

注册表主机(Registry Host): 是容器拉取和推送的的地址,可以是本地和远程。

名称空间(NameSpace)这里指:registry.first.qiuyl.com,也就是我们镜像仓库主机的域名或IP。这里必须以该方式进行命名,否则无效。

hosts.toml:是我们配置Registry Host规则的地方

[root@k8s-master-3]# mkdir -p /etc/containerd/certs.d/
[root@k8s-master-3]# mkdir registry.first.qiuyl.com
[root@k8s-master-3]# cat  /etc/containerd/certs.d/registry.first.qiuyl.com/hosts.toml
# server = "https://registry-1.docker.io"
[host."https://registry.first.qiuyl.com"]
  capabilities = ["pull""resolve""push"]
  skip_verify = true
  # ca = "/etc/certs/mirror.pem"

1)参数解析

1. server = "https://registry-1.docker.io"

  • 指定一个默认的镜像注册表。

2. [host."https://registry.first.qiuyl.com"]

  • 配置一个私有镜像仓库。

3. capabilities = ["pull", "resolve", "push"]

  • 含义:

    • 定义了客户端对这个自定义镜像仓库的操作能力:
      1. **pull**:允许从这个仓库拉取镜像。
      2. **resolve**:允许解析镜像的名称和标签。
      3. **push**:允许向这个仓库推送镜像。
    • 这表示你对 https://registry.first.qiuyl.com 仓库拥有完整的操作权限。

4. skip_verify = true

  • 绕过 TLS 验证,如果不绕过,配置 ca 字段。例如:ca = "/etc/certs/mirror.pem"

2)server与host字段,使用上的区别与体现

场景/特性 registry-1.docker.io(默认官方库) https://registry.first.qiuyl.com(私有库)
镜像地址格式 nginx:latest registry.first.qiuyl.com/myimage:latest
默认行为 未指定地址时,默认去官方仓库 需要明确指定完整地址
支持能力 仅支持拉取公开镜像 支持拉取和推送镜像
使用场景 拉取公共镜像(如 nginx, redis 等) 企业内部镜像存储、部署或镜像发布
安全性 使用 Docker 官方签名镜像,安全性高 如果未配置 HTTPS 或认证,可能存在安全隐患
配置要求 无需额外配置 需配置 hosts.toml 和私有仓库访问规则

ctr与nerdctl差异

经过上诉的配置,重启Containerd生效后。我们分别使用nerdctlctr命令进行pull镜像,由于我们这里的Harbor仓库配置的自建TLS证书,所以配置绕过TLS验证或者配置ca字段。

更具上面的配置,可以看到我们配置了绕过TLS验证skip_verify = true但好像对ctr命令无效?

Containerd 注册表主机配置 Registry Host
1. 配置差异的原因

nerdctl

  • nerdctl 是一个更加用户友好的 CLI 工具,底层基于 containerd,且默认会读取 /etc/containerd/certs.d/ 下的 hosts.toml 文件配置。
  • hosts.toml 文件启用了 skip_verify = true,因此 nerdctl 可以跳过证书验证。

ctr

  • ctrcontainerd 的官方 CLI 工具,但它设计为开发者调试工具,不会完全加载 containerd 的配置(如 hosts.tomlconfig.toml)。
  • ctr 更偏向直接调用底层 API,因此不会自动处理 skip_verify 之类的配置。

如何使ctr命令也能读取我们hosts.toml配置呢?

  • 指定 --hosts-dir /etc/containerd/certs.d参数即可
ctr -n k8s.io image pull --hosts-dir /etc/containerd/certs.d registry.first.qiuyl.com/goodrain/rbd-api:v5.17.3-release

最后,推荐大家使用 nerdctl 命令,这也是 Containerd 官网的推荐。ctr 与 crictl 仅用于调试。

Containerd 注册表主机配置 Registry Host

参考

Containerd 官网:https://containerd.io/docs/

Containerd GitHub doc:https://github.com/containerd/containerd/blob/main/docs/hosts.md

Containerd GitHub 开始:https://github.com/containerd/containerd/blob/main/docs/getting-started.md

End

个人博客博客介绍

欢迎各位-加群交流(推荐微信群聊)运维交流/商务合作,集合

这篇文章有用吗?

点击星号为它评分!

平均评分 0 / 5. 投票数: 0

到目前为止还没有投票!成为第一位评论此文章。

很抱歉,这篇文章对您没有用!

让我们改善这篇文章!

告诉我们我们如何改善这篇文章?

- THE END -

秋意零

11月28日22:31

最后修改:2024年11月28日
0

非特殊说明,本博所有文章均为博主原创。

共有 0 条评论