gcr.io 默认托管在 Artifact Registry 上

了解如何在 Artifact Registry 中设置 gcr.io 代码库,以及 Artifact Registry 与 Container Registry 权限以及存储桶配置之间的差异。

本文档中所述的手动步骤可以使用自动迁移工具完成。如果要使用自动迁移工具将具有活跃 Container Registry 使用量的项目转换为 Artifact Registry 标准代码库或 gcr.io 代码库,请参阅自动迁移到 Artifact Registry

Container Registry 弃用

2024 年 5 月 15 日之前未使用过 Container Registry 的 Google Cloud 项目将仅支持在 Artifact Registry 中托管和管理映像。这项变更会影响:

  • 新创建的项目。
  • 您尚未将映像推送到 Container Registry 的现有项目。

默认情况下,在 2024 年 1 月 8 日之前未使用 Container Registry 的组织会将所有新的 gcr.io 代码库托管在 Artifact Registry 上。

当您在这些项目中启用 Artifact Registry API 时,Artifact Registry 会自动处理 Artifact Registry 中 gcr.io 代码库的创建,并将对 gcr.io 网域的请求重定向到相应的 Artifact Registry 代码库。与活跃使用 Container Registry 的项目中现有的 gcr.io 网域支持不同,系统会自动重定向到 Artifact Registry。

在 2024 年 5 月 15 日之前发生以下任一操作的项目仍可使用 Container Registry:

  • 您在项目中启用了 Container Registry API。
  • 您已将一个映像推送到项目中的注册表主机。

为了迎接即将发生的变化,我们建议您:

  • 请按照本文档中的说明配置不使用 Container Registry 的项目,以使这些项目可以在更改生效时自动处理 gcr.io 请求。
  • 测试 gcr.io 网域支持,以验证您现有的自动化功能是否将继续正常运行。

托管在 Artifact Registry 上的 gcr.io 代码库是在 Container Registry 支持的同一多区域中创建。如果要在其他区域存储映像,您必须转换到 pkg.dev 网域中的标准代码库

所需的角色

如需获取设置“gcr.io”代码库所需的权限,请让管理员授予您以下 IAM 角色:

  • 如需创建 Artifact Registry 代码库并授予对各个代码库的访问权限,请执行以下操作: 针对项目的 Artifact Registry Administrator (roles/artifactregistry.admin)
  • 如需查看和管理应用于 Cloud Storage 存储分区的现有 Container Registry 配置,请拥有项目的 Storage Admin (roles/storage.admin)
  • 如需在项目级授予代码库访问权限,请执行以下操作: Project IAM Admin (roles/resourcemanager.projectIamAdmin) 或包含项目、文件夹或组织的同等权限的角色,例如 Folder Admin (roles/resourcemanager.folderAdmin) 或 Organization Admin (roles/resourcemanager.organizationAdmin)
  • 如需列出组织中已启用的服务,请运行以下命令: 对组织的 Cloud Asset Viewer (roles/cloudasset.viewer)

如需详细了解如何授予角色,请参阅管理访问权限

您也可以通过自定义角色或其他预定义角色来获取所需的权限。

准备工作

您可以列出 Container Registry 中至少存储了一个映像的项目。 然后,您可以按照本文档中的说明重点在 Artifact Registry 中设置其他项目来托管 gcr.io 请求。

运行以下命令以查找 Google Cloud 组织中的任何 Container Registry 使用情况。

  gcloud containers list-gcr-usage \
      --organization=ORGANIZATION

ORGANIZATION 替换为您的 Google Cloud 组织 ID

您还可以列出项目或文件夹的 Container Registry 用量。如需详细了解如何查找 Container Registry 用量,请参阅检查 Container Registry 用量

启用该 API

启用 Artifact Registry API,以便在自动 gcr.io 托管生效时,Artifact Registry 自动处理对 gcr.io 网域的请求。

  1. 运行以下命令:

    gcloud services enable \
        artifactregistry.googleapis.com
    
  2. 如果您通常将 Container Registry API 放置在 VPC Service Controls 服务边界内,请确保将 Artifact Registry API 也放置在该边界内。有关说明,请参阅在服务边界内保护代码库

向代码库授予权限

Container Registry 使用 Cloud Storage 角色来控制访问权限。 Artifact Registry 有自己的 IAM 角色,这些角色比 Container Registry 更清晰地将读取、写入和代码库管理员角色分开。

如需快速将针对存储分区授予的现有权限映射到建议的 Artifact Registry 角色,请使用角色映射工具

或者,您也可以使用 Google Cloud 控制台查看有权访问存储分区的主账号列表。

  1. 在 Google Cloud 控制台中,进入 Cloud Storage 存储桶页面。

    进入“存储桶”

  2. 点击要查看的注册表主机的存储桶。 在存储桶名称中,PROJECT-ID 是您的 Google Cloud 项目 ID

    • gcr.io: artifacts.PROJECT-ID.appspot.com
    • asia.gcr.io: asia.artifacts.PROJECT-ID.appspot.com
    • eu.gcr.io: eu.artifacts.PROJECT-ID.appspot.com
    • us.gcr.io: us.artifacts.PROJECT-ID.appspot.com
  3. 点击权限标签页。

  4. 在“权限”标签中,点击按角色查看子标签。

  5. 展开某个角色以查看拥有该角色的主账号。

该列表包含直接在存储桶中授予的 IAM 角色以及从父项目继承的角色。根据角色,您可以选择要授予的最合适的 Artifact Registry 角色。

Cloud Storage 和基本角色

向当前访问 Container Registry 的用户和服务帐号授予对 Artifact Registry 代码库的访问权限。对于从父项目继承的 Cloud Storage 角色,您应验证主帐号当前使用 Container Registry。某些主账号可能只访问与 Container Registry 无关的其他 Cloud Storage 存储分区。

在 IAM 之前存在的基本角色 Owner、Editor 和 Viewer 对存储分区的访问权限有限。它们本身不会授予其名称所暗示的对 Cloud Storage 资源的所有访问权限,并且为其他 Google Cloud 服务提供额外的权限。验证哪些用户和服务帐号需要访问 Artifact Registry,并使用角色映射表来帮助您授予适当的角色(如果 Artifact Registry 访问权限合适)。

下表根据预定义 Cloud Storage 角色为 Container Registry 访问权限授予的权限映射了 Artifact Registry 角色。

所需的访问权限 当前角色 Artifact Registry 角色 在何处授予角色
仅拉取映像(只读) Storage Object Viewer
(roles/storage.objectViewer)
Artifact Registry 读取者
(roles/artifactregistry.reader)
Artifact Registry 代码库或 Google Cloud 项目
  • 推送和拉取映像(读取和写入)
  • 删除图片
存储空间旧存储分区写入者
(roles/storage.legacyBucketWriter)
Artifact Registry 代码库管理员
(roles/artifactregistry.repoAdmin)
Artifact Registry 代码库或 Google Cloud 项目
首次将映像推送到项目中的 gcr.io 主机名时,在 Artifact Registry 中创建 gcr.io 代码库。 Storage Admin
(roles/storage.admin)
Artifact Registry Create-on-push 代码库管理员
(roles/artifactregistry.createOnPushRepoAdmin)
Google Cloud 项目
创建、管理和删除代码库 Storage Admin
(roles/storage.admin)
Artifact Registry 管理员
(roles/artifactregistry.Admin)
Google Cloud 项目
从项目继承的服务代理角色

Google Cloud 服务的默认服务帐号具有自己的在项目级授予的角色。例如,Cloud Run 的服务代理具有 Cloud Run Service Agent 角色。

在大多数情况下,这些服务代理角色包含 Container Registry 和 Artifact Registry 的等效默认权限,如果您在现有 Container Registry 服务所在的项目中运行 Artifact Registry,则无需执行任何其他更改。

如需详细了解服务代理角色中的权限,请参阅服务代理角色参考文档

自定义角色

使用角色映射表,可帮助您根据用户或服务帐号所需的访问权限级别,确定要向其授予的角色。

如需了解如何授予 Artifact Registry 角色,请参阅配置角色和权限

存储桶配置

在 Artifact Registry 中创建代码库时,Artifact Registry 不会在项目中创建相应的 Cloud Storage 存储分区。如果您拥有可与存储分区直接交互的 Container Registry 自动化功能,则必须更新该自动化操作,才能对 Artifact Registry 代码库进行相应的更改。

例如,如果您以编程方式授予 Container Registry 存储分区的 Cloud Storage 权限,则必须更新该自动化功能,以向托管 gcr.io 网域映像的 Artifact Registry 代码库授予 Artifact Registry 权限。

在 Artifact Registry 中,您可以为存储在代码库(而不是存储桶)中的数据设置加密方法。在 Artifact Registry 上自动 gcr.io 托管会创建使用 Google 管理的加密密钥加密的 gcr.io 代码库。如果要使用客户管理的加密密钥 (CMEK),则必须自行创建 gcr.io 代码库,并在创建 CMEK 时指定 CMEK 作为加密方法。

如需手动创建 gcr.io 代码库,请执行以下操作:

  1. 如果您使用的是 CMEK,请创建要用于此代码库的密钥,并授予使用该密钥的权限。请参阅启用客户管理的加密密钥

  2. 添加代码库。

    控制台

    1. 打开 Google Cloud 控制台中的制品库页面。

      打开“代码库”页面

    2. 点击创建代码库

    3. 指定代码库名称。

      Container Registry 主机名 Artifact Registry 代码库名称
      gcr.io gcr.io
      asia.gcr.io asia.gcr.io
      eu.gcr.io eu.gcr.io
      us.gcr.io us.gcr.io
    4. 将 Docker 指定为代码库格式。

    5. 位置类型下,为代码库指定多区域:

      Container Registry 主机名 Artifact Registry 代码库位置
      gcr.io us
      asia.gcr.io asia
      eu.gcr.io europe
      us.gcr.io us
    6. 为代码库添加说明。请勿包含敏感数据,因为代码库说明未加密。

    7. 加密部分中,选择代码库的加密机制。

      • Google 管理的密钥 - 使用 Google 管理的加密密钥来加密代码库内容。
      • 客户管理的密钥 - 使用您通过 Cloud Key Management Service 控制的密钥来加密代码库内容。如需查看密钥设置说明,请参阅为代码库设置 CMEK
    8. 点击创建

    gcloud

    运行以下命令创建新代码库。

    gcloud artifacts repositories create REPOSITORY \
        --repository-format=docker \
        --location=LOCATION \
        --description=DESCRIPTION \
        --kms-key=KMS-KEY
    

    替换以下值:

    • REPOSITORY 是代码库的名称。

      Container Registry 主机名 Artifact Registry 代码库名称
      gcr.io gcr.io
      asia.gcr.io asia.gcr.io
      eu.gcr.io eu.gcr.io
      us.gcr.io us.gcr.io
    • LOCATION 是代码库的多区域:

      Container Registry 主机名 Artifact Registry 代码库位置
      gcr.io us
      asia.gcr.io asia
      eu.gcr.io europe
      us.gcr.io us
    • DESCRIPTION 是代码库的说明。请勿包含敏感数据,因为代码库说明未加密。

    • 如果您使用客户管理的加密密钥来加密代码库内容,则 KMS-KEY 是 Cloud KMS 加密密钥的完整路径。路径的格式为:

      projects/KMS-PROJECT/locations/KMS-LOCATION/keyRings/KEY-RING/cryptoKeys/KEY

      替换以下值:

      • KMS-PROJECT 是存储密钥的项目。
      • KMS-LOCATION 是密钥的位置。
      • KEY-RING 是密钥环的名称。
      • KEY 是密钥的名称。

    您可以通过使用以下命令列出代码库,确认代码库已创建:

    gcloud artifacts repositories list
    

后续步骤

在测试项目中设置 gcr.io 网域支持,以验证现有的自动化和与 Cloud Build、Google Kubernetes Engine 或 Cloud Functions 等服务的集成是否按预期运行。