在不使用 imagePullSecrets 的情况下从 kubernetes 中的私有存储库中提取图像

Pulling images from private repository in kubernetes without using imagePullSecrets

我是 kubernetes 部署的新手,所以我想知道是否可以在不使用部署 yaml 文件中的 imagePullSecrets 的情况下从私有存储库中提取图像,或者是否必须创建 docker 注册表秘密并在 imagePullSecrets 中传递该秘密。 我还查看了将 imagePullSecrets 添加到服务帐户,但这不是我想知道的要求,如果我在变量中设置 creds,kubernetes 是否可以使用它们来提取这些图像。 还想知道它是如何实现的并且参考文档会起作用 提前致谢。

只要您在 Kubernetes 节点上使用 Docker(请注意 Docker 支持本身 recently been deprecated in Kubernetes),您就可以验证 Docker 引擎在您的节点上针对您的私有注册表。

本质上,这归结为 运行 docker login 在您的机器上,然后将生成的凭据 JSON 文件直接复制到您的节点上。当然,这只有在您可以直接控制节点配置时才有效。

有关详细信息,请参阅 the documentation

If you run Docker on your nodes, you can configure the Docker container runtime to authenticate to a private container registry.

This approach is suitable if you can control node configuration.

Docker stores keys for private registries in the $HOME/.dockercfg or $HOME/.docker/config.json file. If you put the same file in the search paths list below, kubelet uses it as the credential provider when pulling images.

  • {--root-dir:-/var/lib/kubelet}/config.json
  • {cwd of kubelet}/config.json
  • ${HOME}/.docker/config.json
  • /.docker/config.json
  • {--root-dir:-/var/lib/kubelet}/.dockercfg
  • {cwd of kubelet}/.dockercfg
  • ${HOME}/.dockercfg
  • /.dockercfg

Note: You may have to set HOME=/root explicitly in the environment of the kubelet process.

Here are the recommended steps to configuring your nodes to use a private registry. In this example, run these on your desktop/laptop:

  • Run docker login [server] for each set of credentials you want to use. This updates $HOME/.docker/config.json on your PC.
  • View $HOME/.docker/config.json in an editor to ensure it contains just the credentials you want to use.
  • Get a list of your nodes; for example:
    • if you want the names: nodes=$( kubectl get nodes -o jsonpath='{range.items[*].metadata}{.name} {end}' )
    • if you want to get the IP addresses: nodes=$( kubectl get nodes -o jsonpath='{range .items[*].status.addresses[?(@.type=="ExternalIP")]}{.address} {end}' )
  • Copy your local .docker/config.json to one of the search paths list above. for example, to test this out: for n in $nodes; do scp ~/.docker/config.json root@"$n":/var/lib/kubelet/config.json; done

Note: For production clusters, use a configuration management tool so that you can apply this setting to all the nodes where you need it.

如果 Kubernetes 集群是私有的,您可以在同一个集群中部署自己的私有(和免费)JFrog Container Registry using its Helm Chart

一旦 运行,您应该允许匿名访问注册表以避免需要登录才能提取图像。

如果您阻止外部访问,您仍然可以访问创建的内部 k8s 服务并将其用作您的“私有注册表”。

通读文档并查看各种选项。

另一个好处是 JCR(JFrog 容器注册表)也是一个 Helm 存储库和一个通用文件存储库,因此它不仅可以用于 Docker 个图像。