默认托管在 Artifact Registry 上的 gcr.io

了解如何在 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 的组织将在 Artifact Registry 上托管任何新的 gcr.io 代码库。

在这些项目中启用 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 container images 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 Reader
roles/artifactregistry.reader)
Artifact Registry 代码库或 Google Cloud 项目
  • 推送和拉取映像(读取和写入)
  • 删除图片
存储空间旧存储分区写入者
(roles/storage.legacyBucketWriter)
Artifact Registry Repository Administrator
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 拥有的密钥和 Google 管理的密钥加密的 gcr.io 代码库。如果您想使用客户管理的加密密钥 (CMEK),则必须自行创建 gcr.io 代码库,并在创建时指定 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 拥有和 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 是代码库的说明。请勿包含敏感数据,因为仓库说明未加密。

    • 如果您使用 CMEK 对代码库内容进行加密,则 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 等服务的集成是否按预期运行。