我有一个自定义文件,/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 pull
ctr
"insecure-registry": "127.0.0.1"
ctr
hosts.toml
ctr 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-registry
docker 中的旧选项以及为什么我的hosts.toml
用途http
而不是https
,这样它就不会引起任何人的担忧。
另外,这是我正在使用的 containerd 版本 1.6.19。
答案1
显然,ctr
无法配置为我想要的方式。根据containerd
关于repo 的讨论,您需要创建一个自定义包装器脚本或 shell 别名来自动注入--hosts-dir
,或者您应该使用containerd
支持以与 CLI 行为相同的方式进行配置的备用客户端docker
:一个这样的例子是nerdctl
。