设置具有 gcr.io 网域支持的代码库

本文档介绍了如何在 Google Cloud 控制台中手动设置 gcr.io 代码库, Artifact Registry

我们建议您使用我们的自动迁移工具 改用 Artifact Registry 中的 gcr.io 个代码库。

如果您想使用以下命令在 Artifact Registry 中创建 gcr.io 代码库 客户管理的加密密钥 (CMEK),则 完成准备工作中的步骤,然后 请参阅手动创建代码库中的说明。

准备工作

  1. 安装 Google Cloud CLI(如果尚未安装) 已安装。对于现有安装,请运行以下命令以更新 更新到最新版本:

    gcloud components update
    
  2. 启用 Artifact Registry API 和 Resource Manager API。 gcloud CLI 使用 Resource Manager API 检查是否存在 所需权限

    运行以下命令:

    gcloud services enable \
        cloudresourcemanager.googleapis.com \
        artifactregistry.googleapis.com
    
  3. 可以先了解 Artifact Registry 的价格 您就可以开始转换了

所需的角色

为了获得设置“gcr.io”代码库所需的权限, 请让管理员向您授予 针对 Google Cloud 项目的以下 IAM 角色:

  • 如需创建 Artifact Registry 代码库并授予对各个代码库的访问权限,请执行以下操作: Artifact Registry 管理员 (roles/artifactregistry.admin)
  • 如需查看和管理应用于 Cloud Storage 存储分区的现有 Container Registry 配置,请执行以下操作: Storage Admin (roles/storage.admin)
  • 如需在首次将映像推送到 gcr.io 主机名时创建 gcr.io 代码库,请执行以下操作: Artifact Registry Create-on-push Writer (roles/artifactregistry.createOnPushWriter)
  • 如需在项目级授予代码库访问权限,请执行以下操作: Project IAM Admin (roles/resourcemanager.projectIamAdmin) 或包含同等权限的角色,例如 Folder Admin (roles/resourcemanager.folderAdmin) 或 Organization Admin (roles/resourcemanager.organizationAdmin)

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

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

限制

以下限制适用于支持 gcr.io 网域的代码库:

  • 您无法将 Container Registry 主机映射到 Artifact Registry 代码库。
  • 每个 Container Registry 主机名仅映射到一个 位于同一个多区域位置的 Artifact Registry gcr.io 代码库。
  • gcr.io 代码库的名称是预定义的,您无法修改。

如果您需要更好地控制代码库的位置,可以 改用 Artifact Registry 上的标准代码库 pkg.dev 网域。由于标准代码库不支持 gcr.io 网域,则此过渡方法需要对您的现有 自动化和工作流。如需了解详情,请参阅选择转换选项 功能差异

创建代码库

创建 gcr.io 代码库,以便为您的用户配置访问权限,并 先将现有 Container Registry 映像复制到 Artifact Registry,然后再启用 重定向。

快速创建代码库

以下步骤会创建 gcr.io 个使用 Google 拥有的密钥和 Google 管理的密钥。如果您想使用客户管理的加密 密钥 (CMEK),则必须创建代码库

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

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

    打开“代码库”页面

    页面上会显示一个横幅 You have gcr.io repositories in Container Registry.

    打开“设置”页面

  2. 在横幅中,点击创建 gcr.io 代码库

    此时会打开 Create gcr.io repositories 面板。复制图片部分 部分列出了每个代码库的完全限定名称, 创建。如果要复制代码库,您需要用到这些代码库名称 请先从 Container Registry 中检索映像

  3. 点击创建

Artifact Registry 为所有 Container Registry 创建 gcr.io 个代码库 主机名:

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

如需查看代码库的 Artifact Registry 网址,请按住 将指针悬停在警告图标 ( ) 上 。

在将流量重定向到新代码库之前,您需要确保 现有自动化操作可以访问代码库下一步是配置 permissions,用于授予对代码库的访问权限。

手动创建代码库

手动创建 gcr.io 个代码库(如果您想使用) 要加密的客户管理的加密密钥 (CMEK) 代码库内容,或者您的代码库中存在位置限制, 禁止 Google Cloud 组织在以下位置创建新资源: 特定地理位置

如需手动创建 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 欧洲
      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 欧洲
      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
    

在将流量重定向到新代码库之前,您需要确保 现有自动化操作可以访问代码库下一步是配置 permissions,用于授予对代码库的访问权限。

向代码库授予权限

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 存储分区。

在 v3 发布之前就已存在的基本角色“Owner”“Editor”和“Viewer” IAM 拥有 对存储分区的有限访问权限。 它们本身不会授予对 Cloud Storage 的所有访问权限 并为其他 Google Cloud 服务提供额外权限。验证哪些用户和服务账号需要 可以使用 Artifact Registry 的访问权限,并使用角色映射表来帮助 如果 Artifact Registry 访问权限适当,则可以授予适当的角色。

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

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

请参阅 服务代理角色参考,详细了解相关权限 Service Agent 角色。

自定义角色

您可以借助角色映射表来决定 根据访问权限级别向用户或服务账号授予的角色 所需的资源

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

从 Container Registry 中复制容器

建议您使用我们的自动迁移工具将 将映像从 Container Registry 迁移到 Artifact Registry

如果您想使用其他工具复制图片,请参阅 从 Container Registry 中复制映像

设置其他功能

本部分介绍了您可能已设置的其他功能的配置。 启动 Container Registry

Artifact Analysis

Artifact Analysis 同时支持 Container Registry 和 Artifact Registry这两款产品使用相同的 适用于映像元数据和漏洞的 Artifact Analysis API 扫描以及 Artifact Analysis 通知的相同 Pub/Sub 主题。

但是,只有在启用重定向后,才会执行以下操作:

  • 自动扫描 Artifact Registry 中的 gcr.io 个代码库。
  • Pub/Sub 通知中包含 gcr.io 代码库活动。

您可以继续使用 gcloud container images 命令,用于列出与 gcr.io 映像路径关联的备注和发生实例。

Container Registry Artifact Registry
通过按需扫描扫描操作系统和语言包漏洞 在具有受支持操作系统的映像中运行。自动扫描仅返回操作系统 以及漏洞信息 详细了解 扫描
按需扫描
自动扫描
  • Google Cloud CLI 命令 <ph type="x-smartling-placeholder"></ph> gcloud container images包含用于查看扫描结果的标志 包括漏洞和其他元数据。
  • 扫描仅返回以下环境中映像的操作系统漏洞信息 Container Registry <ph type="x-smartling-placeholder"></ph> 支持的操作系统
通过按需和按需扫描,扫描操作系统和语言包漏洞 自动扫描。 详细了解 扫描
按需扫描
自动扫描
  • Google Cloud CLI 命令 gcloud 工件 docker images 包含用于查看扫描结果的标志, 包括漏洞和其他元数据。
  • 扫描会返回 Artifact Registry 中映像的操作系统漏洞信息, <ph type="x-smartling-placeholder"></ph> 支持的操作系统和语言包 针对受支持和不受支持的操作提供漏洞信息 系统。

Pub/Sub 通知

Artifact Registry 会将更改发布到与 Container Registry 相同的 gcr 主题。如果您已经在使用 具有 Container Registry 的 Pub/Sub Artifact Registry但是,Artifact Registry 不会 gcr.io 个代码库的消息,直至您启用重定向。

如果您在单个项目中设置 Artifact Registry,则 gcr 主题可能不存在。如需查看设置说明,请参阅配置 Pub/Sub 通知

启用对 gcr.io 流量的重定向

创建 gcr.io 代码库后 并配置了权限和身份验证 第三方客户端,您可以启用 gcr.io 流量的重定向。

如果您在启用重定向后遇到问题,可以将流量路由回 然后再次启用重定向 问题。

验证权限以启用重定向

如需启用重定向,您必须在项目级拥有以下权限:

  • artifactregistry.projectsettings.update:要更新的权限 Artifact Registry 项目设置。此权限位于 Artifact Registry Administrator 角色 (roles/artifactregistry.admin).
  • storage.buckets.update - 拥有更新 Cloud Storage 存储分区中的 整个项目。Storage Admin 角色拥有此权限 (roles/storage.admin).

如果您没有这些权限,请让管理员执行以下操作: 授权 在项目级管理它们

以下命令可向 Artifact Registry Administrator 授予 和 Storage Admin 角色的权限。

gcloud projects add-iam-policy-binding PROJECT_ID \
    --member='user:PRINCIPAL' \
    --role='roles/artifactregistry.admin'

gcloud projects add-iam-policy-binding PROJECT_ID \
    --member='user:PRINCIPAL' \
    --role='roles/storage.admin'

替换以下值:

  • PROJECT_ID 是 Google Cloud 项目 ID
  • PRINCIPAL 是要更新的账号的电子邮件地址。 例如 user:my-user@example.com

验证项目设置

如需验证项目设置,请运行以下命令:

gcloud artifacts settings enable-upgrade-redirection \
    --project=PROJECT_ID --dry-run

PROJECT_ID 替换为您的 Google Cloud 项目 ID

Artifact Registry 会检查映射到 Container Registry 的代码库 主机名。

虽然 Artifact Registry 可以创建缺失的 gcr.io 代码库, 启用重定向时,我们建议您先创建这些重定向, 在启用重定向之前可以执行以下操作:

开启重定向

要为 gcr.io 流量启用重定向,请执行以下操作:

控制台

  1. 在 Google Cloud 控制台中打开“设置”页面。

    打开“设置”页面

  2. 点击路由到 Artifact Registry

gcloud

如需启用重定向,请运行以下命令:

gcloud artifacts settings enable-upgrade-redirection \
    --project=PROJECT_ID

PROJECT_ID 替换为您的 Google Cloud 项目 ID

Artifact Registry 开始启用重定向。

如需检查重定向的当前状态,请运行以下命令:

gcloud artifacts settings describe

启用重定向后,结果为:

legacyRedirectionState: REDIRECTION_FROM_GCR_IO_ENABLED

gcr.ioasia.gcr.ioeu.gcr.ious.gcr.io的所有流量均为 即使您没有为所有命令创建 gcr.io 代码库 Container Registry 主机名。如果您将映像推送到 具有对应的 Artifact Registry 代码库,Artifact Registry 会创建该代码库 (如果您拥有 artifactregistry.repositories.createOnPush 角色) 权限。预定义角色 Create-on-push Writer (artifactregistry.createOnPushWriter) 和 Create-on-push 代码库 管理员 (artifactregistry.createOnPushRepoAdmin) 拥有此权限。

启用重定向后,您可以测试自动化操作,并验证能否 使用新的 gcr.io 代码库推送和拉取映像。

验证重定向

验证对 gcr.io 主机名发出的拉取请求和推送请求是否均有效。

  1. 使用 gcr.io 将测试映像推送到您的某个 gcr.io 代码库 路径。

    1. 使用 gcr.io 路径标记映像。例如,此命令 将映像 local-image 标记为 us.gcr.io/my-project/test-image

      docker tag local-image us.gcr.io/my-project/test-image
      
    2. 推送您标记的映像。例如,此命令会将 图片 us.gcr.io/my-project/test-image

      docker push us.gcr.io/my-project/test-image
      
  2. 列出代码库中的映像,以验证映像是否已上传 成功。例如,如需列出 us.gcr.io/my-project 中的映像,请运行以下命令: 命令:

    gcloud container images list --repository=us.gcr.io/my-project
    
  3. 使用映像的 Container Registry 路径从代码库中拉取映像。 例如,此命令会拉取映像 us.gcr.io/my-project/test-image

    docker pull us.gcr.io/my-project/test-image
    

完成此初始测试后,请验证要构建和使用 部署映像按预期运行,包括:

  • 使用 Container Registry 的用户和服务账号仍然可以 在启用重定向后部署映像。
  • 您的自动化操作只会将映像推送到现有代码库。
  • 如果已启用 Artifact Analysis 漏洞扫描, 识别 gcr.io 代码库中存在漏洞的映像。
  • 如果您使用 Binary Authorization,现有政策将适用于映像 从 gcr.io 代码库部署。
  • 已配置的 Pub/Sub 订阅包含以下各项的通知: 更新

清理 Container Registry 映像

启用重定向后,用于删除 gcr.io 路径中图片的命令 删除相应 Artifact Registry gcr.io 代码库中的映像。 用于删除 gcr.io 路径中映像的删除命令不会删除存储在 Container Registry 主机

如需安全移除所有 Container Registry 映像,请删除相应 Cloud Storage 每个 Container Registry 主机名的存储分区

如需删除每个 Container Registry 存储桶,请执行以下操作:

控制台

  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. 如需确认删除,请输入存储桶名称,然后点击删除

gsutil

如果您要批量删除存储桶中的十万或更多图片, 避免使用 gsutil,因为删除过程需要很长时间才能完成。 请改用 Google Cloud 控制台来执行操作。

如需删除存储桶,请使用 gsutil rm 并附加 -r 标志。

gsutil rm -r gs://BUCKET-NAME

BUCKET-NAME 替换为 Container Registry 存储 存储桶名称。在存储桶名称中,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

响应如下例所示:

Removing gs://artifacts.my-project.appspot.com/...

如果有其他 Google Cloud 服务在同一 Google Cloud 中运行,请执行以下操作: 启用 Container Registry API。如果您尝试 停用 Container Registry API。 如果其他配置了 依赖项。停用 Container Registry API 自动停用同一项目中具有已配置 依赖项,即使您当前没有将 Container Registry 与那些 服务。

后续步骤