【问题标题】:Google Cloud Kubernetes accessing private Docker Hub hosted imagesGoogle Cloud Kubernetes 访问私有 Docker Hub 托管映像
【发布时间】:2018-11-22 10:01:54
【问题描述】:

是否可以将私有映像从 Docker Hub 拉取到 Google Cloud Kubernetes 集群? 是否建议这样做,还是我需要将我的私有图像也推送到 Google Cloud?

我阅读了文档,但没有发现任何可以清楚地解释我的东西。好像可以,不知道有没有推荐。

【问题讨论】:

标签: docker kubernetes google-cloud-platform containers dockerhub


【解决方案1】:

使用您想要的任何注册表都没有限制。如果您只在 pod 规范中使用镜像名称(例如,镜像:nginx),则该镜像将从公共 docker hub 注册表中提取,其标签假定为 :latest

正如 Kubernetes 中提到的documentation

容器的图像属性支持与 docker 命令可以,包括私有注册表和标签。私人的 注册表可能需要密钥才能从中读取图像。

使用 Google 容器注册表

在 Google 上运行时,Kubernetes 原生支持 Google Container Registry (GCR) 计算引擎 (GCE)。如果您在 GCE 或 Google 上运行集群 Kubernetes Engine,只需使用完整的镜像名称(例如 gcr.io/my_project/image:tag)。集群中的所有 pod 都将读取 访问此注册表中的图像。

使用 AWS EC2 容器注册表

当节点是 AWS EC2 实例时,Kubernetes 原生支持 AWS EC2 Container Registry。 只需使用完整的图像名称(例如 ACCOUNT.dkr.ecr.REGION.amazonaws.com/imagename:tag)在 Pod 中 定义。集群中所有可以创建 pod 的用户都可以 运行使用 ECR 注册表中任何图像的 pod。

使用 Azure 容器注册表 (ACR)

使用Azure Container Registry 时,您可以使用管理员用户或 服务负责人。在任何一种情况下,身份验证都是通过标准完成的 码头工人身份验证。这些说明假定使用 azure-cli 命令 线工具。

首先需要创建注册表并生成凭证,完成 这方面的文档可以在Azure container registry documentation 中找到。

配置节点以向私有存储库进行身份验证

以下是配置节点以使用私有节点的推荐步骤 注册表。在此示例中,在您的台式机/笔记本电脑上运行这些:

  1. 为您要使用的每组凭据运行 docker login [server]。这更新了$HOME/.docker/config.json
  2. 在编辑器中查看 $HOME/.docker/config.json 以确保它只包含您要使用的凭据。
  3. 获取节点列表,例如:
    • 如果你想要名字: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}')
  4. 将本地的 .docker/config.json 复制到每个节点的 root 主目录。
    • 例如:for n in $nodes; do scp ~/.docker/config.json root@$n:/root/.docker/config.json; done

用例:

有许多用于配置私有注册表的解决方案。 以下是一些常见用例和建议的解决方案。

  1. 仅运行非专有(例如开源)图像的集群。无需隐藏图像。
    • 使用 Docker 集线器上的公共映像。
      • 无需配置。
      • 在 GCE/Google Kubernetes Engine 上,会自动使用本地镜像来提高速度和可用性。
  2. 集群运行一些专有图像,这些图像应该对公司外部的人隐藏,但对所有集群用户可见。
    • 使用托管的私有 Docker 注册表。
      • 它可以托管在 Docker Hub 或其他地方。
      • 如上所述在每个节点上手动配置.docker/config.json
    • 或者,在防火墙后面运行一个内部私有注册表,并具有开放读取访问权限。
      • 不需要 Kubernetes 配置。
    • 或者,在 GCE/Google Kubernetes Engine 上,使用项目的 Google Container Registry。
      • 与手动节点配置相比,它在集群自动缩放方面效果更好。
    • 或者,在不方便更改节点配置的集群上,使用 imagePullSecrets
  3. 具有专有图像的集群,其中一些需要更严格的访问控制。
    • 确保 AlwaysPullImages 准入控制器处于活动状态。否则,所有 Pod 都可能有权访问所有图像。
    • 将敏感数据移动到“秘密”资源中,而不是将其打包在图像中。
  4. 一个多租户集群,每个租户都需要自己的私有注册表。
    • 确保AlwaysPullImages 准入控制器处于活动状态。否则,所有租户的所有 Pod 都可能访问所有 图片。
    • 运行需要授权的私有注册表。
    • 为每个租户生成注册表凭据,放入密钥,并将密钥填充到每个租户命名空间。
    • 租户将该秘密添加到每个命名空间的imagePullSecrets

如果您决定使用私有注册表,请考虑阅读Pull an Image from a Private Registry 文档。

【讨论】:

【解决方案2】:

有 3 种类型的注册表:

  1. 公共(Docker Hub、Docker Cloud、Quay 等)
  2. 私人:这将是在您的本地网络上运行的注册表。一个示例是使用注册表映像运行 docker 容器。
  3. 受限:这是一个需要一些凭据进行验证的注册表。以 Google Container Registry (GCR) 为例。

正如您所说,在公共注册中心(例如 Docker Hub)中,您可以拥有私有映像。

私有和受限注册表显然更安全,因为其中一个甚至不暴露在互联网上(理想情况下),而另一个需要凭据。

我猜你可以使用其中任何一个来达到可接受的安全级别。所以,这是选择的问题。如果您觉得您的应用程序很重要,并且您不想冒任何风险,您应该将它放在 GCR 或私有注册表中。

如果您觉得它很重要,但不重要,您可以将它放在任何公共存储库中,将其设为私有。这将提供一层安全保护。

【讨论】:

  • 非常感谢@suren。我从你的解释中学到了很多。
猜你喜欢
  • 2021-06-29
  • 2021-05-24
  • 2016-07-13
  • 1970-01-01
  • 2023-02-20
  • 2015-08-14
  • 2021-01-05
  • 1970-01-01
  • 2019-01-05
相关资源
最近更新 更多