【问题标题】: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 中找到。
配置节点以向私有存储库进行身份验证
以下是配置节点以使用私有节点的推荐步骤
注册表。在此示例中,在您的台式机/笔记本电脑上运行这些:
- 为您要使用的每组凭据运行 docker login [server]。这更新了
$HOME/.docker/config.json。
- 在编辑器中查看
$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 复制到每个节点的 root 主目录。
- 例如:
for n in $nodes; do scp ~/.docker/config.json root@$n:/root/.docker/config.json; done
用例:
有许多用于配置私有注册表的解决方案。
以下是一些常见用例和建议的解决方案。
- 仅运行非专有(例如开源)图像的集群。无需隐藏图像。
- 使用 Docker 集线器上的公共映像。
- 无需配置。
- 在 GCE/Google Kubernetes Engine 上,会自动使用本地镜像来提高速度和可用性。
- 集群运行一些专有图像,这些图像应该对公司外部的人隐藏,但对所有集群用户可见。
- 使用托管的私有 Docker 注册表。
- 它可以托管在 Docker Hub 或其他地方。
- 如上所述在每个节点上手动配置
.docker/config.json。
- 或者,在防火墙后面运行一个内部私有注册表,并具有开放读取访问权限。
- 或者,在 GCE/Google Kubernetes Engine 上,使用项目的 Google Container Registry。
- 与手动节点配置相比,它在集群自动缩放方面效果更好。
- 或者,在不方便更改节点配置的集群上,使用 imagePullSecrets。
- 具有专有图像的集群,其中一些需要更严格的访问控制。
- 确保 AlwaysPullImages 准入控制器处于活动状态。否则,所有 Pod 都可能有权访问所有图像。
- 将敏感数据移动到“秘密”资源中,而不是将其打包在图像中。
- 一个多租户集群,每个租户都需要自己的私有注册表。
- 确保
AlwaysPullImages 准入控制器处于活动状态。否则,所有租户的所有 Pod 都可能访问所有
图片。
- 运行需要授权的私有注册表。
- 为每个租户生成注册表凭据,放入密钥,并将密钥填充到每个租户命名空间。
- 租户将该秘密添加到每个命名空间的
imagePullSecrets。
如果您决定使用私有注册表,请考虑阅读Pull an Image from a Private Registry 文档。
【解决方案2】:
有 3 种类型的注册表:
- 公共(Docker Hub、Docker Cloud、Quay 等)
- 私人:这将是在您的本地网络上运行的注册表。一个示例是使用注册表映像运行 docker 容器。
- 受限:这是一个需要一些凭据进行验证的注册表。以 Google Container Registry (GCR) 为例。
正如您所说,在公共注册中心(例如 Docker Hub)中,您可以拥有私有映像。
私有和受限注册表显然更安全,因为其中一个甚至不暴露在互联网上(理想情况下),而另一个需要凭据。
我猜你可以使用其中任何一个来达到可接受的安全级别。所以,这是选择的问题。如果您觉得您的应用程序很重要,并且您不想冒任何风险,您应该将它放在 GCR 或私有注册表中。
如果您觉得它很重要,但不重要,您可以将它放在任何公共存储库中,将其设为私有。这将提供一层安全保护。