如何让 `ctr image pull` 总是使用自定义的 `--hosts-dir`,而不在命令行中指定它?

如何让 `ctr image pull` 总是使用自定义的 `--hosts-dir`,而不在命令行中指定它?

我有一个自定义文件,/etc/containerd/certs.d/registry.at.my.company/hosts.toml其中有一些为在我的服务器上运行的本地注册表容器设置的配置。当我为 Kubernetes 的 CRI 配置它时,它工作正常,但是我和我的同事发现,在手动运行时(在 K8s 之外),我们必须添加--hosts-dir /etc/containerd/certs.d到所有命令中,这令人沮丧。当我们使用 docker 执行此操作时,这非常简单:我们只需在 docker 守护程序的 JSON 配置文件( )上设置正确的选项,它就可以正常工作。但我很难找到一个等效的设置来实现类似的行为。当然,CRI 插件正在使用我设置的文件,但我希望能够手动提取图像,而不必在命令中添加额外的标志。有没有办法可以配置 containerd,以便不需要每次都传递?ctr image pullctr"insecure-registry": "127.0.0.1"ctrhosts.tomlctr image pull--hosts-dir

hosts.toml文件如下所示:

server = "http://registry.at.my.company"

[host."http://registry.at.my.company"]
  skip_verify = true
  plain-http = true

/etc/containerd/config.toml文件中,我让 CRI 指向它,如下所示:

[plugins."io.containerd.grpc.v1.cri".registry]
config_path = "/etc/containerd/certs.d"

但是,正如我上面推测和所说的那样,这似乎只会影响 kubelet 如何与 containerd 交互,而不会影响它们如何ctr交互。


一些背景情况:

我们有一个本地注册表正在运行,其/etc/hosts条目如下:127.0.1.1 registry.at.my.company。连同一些防火墙规则,这使得使用我们的 Kubernetes 集群的每个人都必须将他们的镜像推送到那里,registry.at.my.company并配置他们的 pod 以使用那里的镜像,因为我们的 kubelet 无法从任何地方拉取该域;并且为了使我们的注册表不是 SPoF,我们将这些本地注册表容器作为只读镜像运行(并且注册表容器的服务器本身只接受本地连接,从而避免出现 SSL 证书缺失的问题。)我不确定这是否与我的问题有关,但它应该有助于解释为什么我在谈论insecure-registrydocker 中的旧选项以及为什么我的hosts.toml用途http而不是https,这样它就不会引起任何人的担忧。

另外,这是我正在使用的 containerd 版本 1.6.19。

答案1

显然,ctr无法配置为我想要的方式。根据containerd关于repo 的讨论,您需要创建一个自定义包装器脚本或 shell 别名来自动注入--hosts-dir,或者您应该使用containerd支持以与 CLI 行为相同的方式进行配置的备用客户端docker:一个这样的例子是nerdctl

相关内容