将 Container Registry 与 Google Cloud 搭配使用

为方便访问,Google Cloud 中的计算资源已与 Container Registry 集成。本文档介绍了在 Google Cloud 中推送和拉取映像所需的访问权限设置。

要求

必须为用于拉取或推送映像的虚拟机配置正确的权限和访问权限范围。

IAM 权限

必须为访问 Container Registry 存储分区的服务帐号配置 IAM 权限。

  • 如需拉取私有 Docker 映像,虚拟机实例使用的服务帐号必须具有对映像所在存储分区的 read 权限。
  • 如需推送私有 Docker 映像,虚拟机实例使用的服务帐号必须具有对映像所在存储分区的 read-writefull-control 权限

如需详细了解所需权限,请参阅配置访问权限控制

访问权限范围

访问权限范围定义了来自 gcloud 工具的请求中使用的默认 OAuth 范围。推送或拉取映像的虚拟机实例必须具有正确的存储空间访问权限范围,才能成功使用 Container Registry。

如需仅拉取映像,请设置针对 Storage 存储分区的 read-only 权限。 如需推送和拉取映像,请设置针对 Storage 存储分区的 read-write 权限。

在虚拟机实例上设置范围

如需创建新虚拟机实例并指定范围,请使用 --scope 选项。

  • 对于具有“只读”权限的实例,请运行以下命令:

    gcloud compute instances create INSTANCE \
        --scopes https://www.googleapis.com/auth/devstorage.read_only
        
  • 对于具有“读写”权限的实例,请运行以下命令:

    gcloud compute instances create INSTANCE \
        --scopes https://www.googleapis.com/auth/devstorage.read_write
        

如需更改实例的服务帐号和访问权限范围,您必须暂时停止该实例。如需停止实例,请阅读有关停止实例的文档。更改服务帐号或访问权限范围后,请记得重启实例。使用以下任一命令更改已停止实例的服务帐号或访问权限范围。

  • 如需设置“只读”权限,请运行以下命令:

    gcloud compute instances set-service-account INSTANCE --scopes=storage-ro
        
  • 如需设置“读写”权限,请运行以下命令:

    gcloud compute instances set-service-account INSTANCE --scopes=storage-rw
        

在 Google Kubernetes Engine 集群上设置范围

默认情况下,创建新的 Google Kubernetes Engine 集群时,系统会为其分配针对 Cloud Storage 存储分区的只读权限。如需在创建 Google Kubernetes Engine 集群时设置 read-write 存储范围,请使用 --scopes 选项。例如,以下命令创建一个范围为 bigquery 的集群,

`storage-rw`, and `compute-ro`:

        gcloud container clusters create example-cluster \
      --scopes=bigquery,storage-rw,compute-ro
    

如需详细了解创建新集群时可设置的范围,请参阅 gcloud container clusters create 命令的文档。

Compute Engine

如果用于推送或拉取映像的虚拟机实例和 Container Registry 存储分区位于同一个 Google Cloud 项目中,则系统会为 Compute Engine 默认服务帐号配置适当的权限来推送或拉取映像。如果虚拟机实例位于不同的项目中,或者实例使用不同的服务帐号,则必须针对代码库使用的存储分区配置访问权限

默认情况下,Compute Engine 虚拟机会针对存储分区配置 read-only 访问权限范围。如需推送私有 Docker 映像,您的实例必须按照访问权限范围中所述配置 read-write 存储空间访问权限范围。

Container-Optimized Compute Engine 实例

如需了解如何使用注册表中的映像启动 Container-Optimized Compute Engine 实例,请参阅通过 cloud-config 启动 Docker 容器

如需了解详情,请参阅创建和配置实例

Google Kubernetes Engine

Google Kubernetes Engine 使用在集群节点的虚拟机实例上配置的服务帐号来推送和拉取映像。

如果 Google Kubernetes Engine 集群和 Container Registry 存储分区位于同一个 Google Cloud 项目中,则系统会为 Compute Engine 默认服务帐号配置适当的权限来推送或拉取映像。如果集群位于不同的项目中,或者集群中的虚拟机使用不同的服务帐号,则必须针对代码库使用的存储分区配置访问权限

默认情况下,Compute Engine 虚拟机会针对存储分区配置 read-only 访问权限范围。如需推送私有 Docker 映像,您的实例必须按照访问权限范围中所述配置 read-write 存储空间访问权限范围。

运行映像

您可以使用以下命令在 Google Kubernetes Engine 集群上运行 Container Registry 映像:

kubectl run [NAME] --image=[HOSTNAME]/[PROJECT-ID]/[IMAGE]:[TAG]
    

其中:

  • [NAME] 是资源的名称
  • [HOSTNAME] 列在控制台中的 Location 下方。可以是以下四个选项之一:gcr.ious.gcr.ioeu.gcr.ioasia.gcr.io
  • [PROJECT-ID] 是您的 Google Cloud Console 项目 ID。 如果您的项目 ID 包含英文冒号 (:),请参阅网域级项目
  • [IMAGE] 是 Container Registry 映像的名称。
  • [TAG] 是标识 Container Registry 映像版本的标记。如果您未指定标记,则 Container Registry 将查找默认标记 latest

如需详细了解 Kubernetes 命令,请参阅 kubectl 概览。如果您的映像位于其他项目中,您需要向 Google Kubernetes Engine 集群使用的服务帐号明确授予映像存储所在存储分区的读取权限。

App Engine 柔性环境

App Engine 柔性环境中,通过提供自定义 Docker 映像或 Dockerfile 文件,您可以自定义现有运行时(例如 Java 8)或提供您自己的运行时。

柔性环境会自动使用 Cloud Build 构建容器映像,并将其存储在 Container Registry 中。

如果用于推送或拉取映像的虚拟机实例和 Container Registry 存储分区位于同一个 Google Cloud 项目中,则系统会为 Compute Engine 默认服务帐号配置适当的权限来推送或拉取映像。如果虚拟机位于不同的项目中,或者虚拟机使用不同的服务帐号,则必须针对代码库使用的存储分区配置访问权限

默认情况下,Compute Engine 虚拟机会针对存储分区配置 read-only 访问权限范围。如需推送私有 Docker 映像,您的实例必须按照访问权限范围中所述配置 read-write 存储空间访问权限范围。

部署到 App Engine

您可以使用 gcloud 命令行工具将 Container Registry 托管的映像部署到 App Engine。

您可以在映像的根目录中使用 gcloud beta app gen-config 命令自动创建将映像部署到 App Engine 所需的 app.yaml 文件。您也可以自行编写此文件。

创建 App Engine 配置文件、构建 Docker 映像并将映像推送到 Container Registry后,您可以运行以下命令来将映像部署到 App Engine:

gcloud app deploy --image-url=[HOSTNAME]/[PROJECT-ID]/[IMAGE]:[TAG]
    

其中:

  • [HOSTNAME] 列在控制台中的 Location 下方。可以是以下四个选项之一:gcr.ious.gcr.ioeu.gcr.ioasia.gcr.io
  • [PROJECT-ID] 是您的 Google Cloud Console 项目 ID。 如果您的项目 ID 包含英文冒号 (:),请参阅网域级项目
  • [IMAGE] 是 Container Registry 映像的名称。
  • [TAG] 是标识 Container Registry 映像版本的标记。如果您未指定标记,则 Container Registry 将查找默认标记 latest