我是 kubernetes 部署的新手,所以我想知道是否可以在不使用imagePullSecrets
部署 yaml 文件的情况下从私有 repo 中提取图像,或者是否必须创建一个 docker 注册表秘密并在 imagePullSecrets 中传递该秘密。我还考虑将 imagePullSecrets 添加到服务帐户,但这不是我想知道的要求,如果我在变量中设置凭据,kubernetes 可以使用它们来提取这些图像。还想知道如何实现它并且参考文档会起作用提前谢谢。
2 回答
只要您在 Kubernetes 节点上使用 Docker(请注意,Docker 支持本身最近在 Kubernetes 中已被弃用),您就可以根据您的私有注册表对节点本身上的 Docker 引擎进行身份验证。
本质上,这归结为docker login
在您的机器上运行,然后将生成的凭证 JSON 文件直接复制到您的节点上。当然,这仅在您可以直接控制节点配置时才有效。
有关更多信息,请参阅文档:
如果您在节点上运行 Docker,则可以将 Docker 容器运行时配置为对私有容器注册表进行身份验证。
如果您可以控制节点配置,则此方法适用。
Docker 将私有注册表的密钥存储在
$HOME/.dockercfg
or$HOME/.docker/config.json
文件中。如果您将相同的文件放在下面的搜索路径列表中,kubelet 会在拉取镜像时将其用作凭证提供程序。
{--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
注意:您可能必须
HOME=/root
在 kubelet 进程的环境中显式设置。以下是配置节点以使用私有注册表的推荐步骤。在此示例中,在您的台式机/笔记本电脑上运行这些:
docker login [server]
为您要使用的每组凭据运行。这会$HOME/.docker/config.json
在您的 PC 上更新。- 在编辑器中查看
$HOME/.docker/config.json
以确保它仅包含您要使用的凭据。- 获取您的节点列表;例如:
- 如果你想要名字:
nodes=$( kubectl get nodes -o jsonpath='{range.items[*].metadata}{.name} {end}' )
- 如果要获取 IP 地址:
nodes=$( kubectl get nodes -o jsonpath='{range .items[*].status.addresses[?(@.type=="ExternalIP")]}{.address} {end}' )
- 将您的本地复制
.docker/config.json
到上面的搜索路径列表之一。例如,要对此进行测试:for n in $nodes; do scp ~/.docker/config.json root@"$n":/var/lib/kubelet/config.json; done
注意:对于生产集群,请使用配置管理工具,以便您可以将此设置应用于您需要它的所有节点。
如果 Kubernetes 集群是私有的,您可以在同一集群中使用其Helm Chart部署您自己的私有(且免费) JFrog Container Registry 。
一旦它运行,您应该允许匿名访问注册表以避免需要登录才能提取图像。
如果您阻止外部访问,您仍然可以访问创建的内部 k8s 服务并将其用作您的“私有注册表”。
通读文档并查看各种选项。
另一个好处是 JCR(JFrog Container Registry)也是 Helm 存储库和通用文件存储库,因此它不仅可以用于 Docker 镜像。