将项目传输到另一个注册表
本文介绍如何将映像集合或其他注册表项目从一个 Azure 容器注册表传输到另一个注册表。 源和目标注册表可存在于相同或不同的订阅、Active Directory 租户、Azure 云或相互独立的云中。
要传输项目,请创建一个传输管道,以使用 blob 存储在两个注册表之间复制项目:
- 将源注册表中的项目导出到源存储帐户中的 blob
- 将 blob 从源存储帐户复制到目标存储帐户
- 目标存储帐户中的 blob 作为项目导入到目标注册表。 可以将导入管道设置为在目标存储中更新项目 blob 时触发。
在本文中,你将创建用于创建和运行传输管道的必备资源。 Azure CLI 用于预配关联的资源(例如存储机密)。 建议使用 Azure CLI 2.2.0 或更高版本。 如果需要安装或升级 CLI,请参阅安装 Azure CLI。
此功能在“高级”容器注册表服务层级中可用。 有关注册表服务层级和限制的信息,请参阅 Azure 容器注册表层级。
重要
此功能目前以预览版提供。 需同意补充使用条款才可使用预览版。 在正式版 (GA) 推出之前,此功能的某些方面可能会有所更改。
考虑用例
传输非常适合用于在相互独立的云中复制两个 Azure 容器注册表之间的内容,这种方法可按每个云中的存储帐户进行调解。 如果要改为从连接的云(包括 Docker Hub 和其他云供应商)中的容器注册表复制映像,建议使用映像导入。
先决条件
容器注册表 - 需要具有要传输项目的现有源注册表以及目标注册表。 ACR 传输适用于在相互独立的云之间移动内容。 出于测试目的,源注册表和目标注册表可存在于相同或不同的 Azure 订阅、Active Directory 租户或云中。
如果需要创建注册表,请参阅快速入门:使用 Azure CLI 创建专用容器注册表。
存储帐户 - 在选择的订阅和位置中创建源和目标存储帐户。 出于测试目的,可使用与源和目标注册表相同的一个或多个订阅。 对于跨云方案,通常在每个云中创建一个单独的存储帐户。
如果需要,请使用 Azure CLI 或其他工具创建存储帐户。
在每个帐户中创建用于传输项目的 blob 容器。 例如,创建一个名为 transfer 的容器。
密钥保管库 - 需要使用密钥保管库来存储用于访问源和目标存储帐户的 SAS 令牌机密。 请在与源和目标注册表相同的一个或多个 Azure 订阅中创建源和目标密钥保管库。 为便于演示,本文所用的模板和命令还假定源密钥保管库和目标密钥保管库分别与源注册表和目标注册表位于同一资源组。 使用公共资源组并不是必需的,但这样可简化本文所用的模板和命令。
如果需要,请使用 Azure CLI 或其他工具创建密钥保管库。
环境变量 - 对于本文中的示例命令,可为源和目标环境设置以下环境变量。 所有示例的格式都适用于 Bash shell。
SOURCE_RG="<source-resource-group>" TARGET_RG="<target-resource-group>" SOURCE_KV="<source-key-vault>" TARGET_KV="<target-key-vault>" SOURCE_SA="<source-storage-account>" TARGET_SA="<target-storage-account>"
方案概述
为注册表间的映像传输创建以下三个管道资源。 这些管道资源均通过 PUT 操作创建。 这些资源在源和目标注册表及存储帐户上运行 。
存储身份验证使用 SAS 令牌,这些令牌在密钥保管库中作为机密进行管理。 管道使用托管标识来读取保管库中的机密。
- ExportPipeline - 持久资源,其中包含有关源注册表和存储帐户的高级信息。 这些信息包括源存储 blob 容器 URI 以及管理源 SAS 令牌的密钥保管库。
- ImportPipeline - 持久资源,其中包含有关目标注册表和存储帐户的高级信息。 这些信息包括目标存储 blob 容器 URI 以及管理目标 SAS 令牌的密钥保管库。 导入触发器默认启用,因此当项目 blob 位于目标存储容器中时,管道会自动运行。
- PipelineRun - 用于调用 ExportPipeline 或 ImportPipeline 资源的资源。
- 创建 PipelineRun 资源并指定要导出的项目可手动运行 ExportPipeline。
- 如果启用了导入触发器,ImportPipeline 则会自动运行。 还可以使用 PipelineRun 手动运行。
- 当前每个 PipelineRun 最多可传输 50 个项目。
使用须知
- ExportPipeline 和 ImportPipeline 通常位于与源和目标云关联的不同 Active Directory 租户中。 此方案需要单独的托管标识和密钥保管库,以用于导出和导入资源。 出于测试目的,可以将这些资源放在同一个云中,以共享标识。
- 默认情况下,ExportPipeline 和 ImportPipeline 模板各自启用系统分配的托管标识来访问密钥保管库机密。 ExportPipeline 和 ImportPipeline 模板还支持你提供的用户分配的标识。
创建并存储 SAS 密钥
传输使用共享访问签名 (SAS) 令牌来访问源和目标环境中的存储帐户。 按照以下部分的说明生成并存储令牌。
重要
虽然 ACR 传输将处理存储在 Keyvault 机密中的手动生成的 SAS 令牌,但对于生产工作负载,我们强烈建议改为使用 Keyvault 托管存储 SAS 定义机密。
生成用于导出的 SAS 令牌
运行 az storage container generate-sas 命令,为源存储帐户中的容器生成 SAS 令牌,用于项目导出。
推荐的令牌权限:读取、写入、列出、添加。
在下面的示例中,将命令输出分配给 EXPORT_SAS 环境变量,以“?”字符作为前缀。 更新环境的 --expiry
值:
EXPORT_SAS=?$(az storage container generate-sas \
--name transfer \
--account-name $SOURCE_SA \
--expiry 2021-01-01 \
--permissions alrw \
--https-only \
--output tsv)
存储用于导出的 SAS 令牌
使用 az keyvault secret 将 SAS 令牌存储在源 Azure 密钥保管库中:
az keyvault secret set \
--name acrexportsas \
--value $EXPORT_SAS \
--vault-name $SOURCE_KV
生成用于导入的 SAS 令牌
运行 az storage container generate-sas 命令,为目标存储帐户中的容器生成 SAS 令牌,用于项目导入。
推荐的令牌权限:读取、删除、列出
在下面的示例中,将命令输出分配给 IMPORT_SAS 环境变量,以“?”字符作为前缀。 更新环境的 --expiry
值:
IMPORT_SAS=?$(az storage container generate-sas \
--name transfer \
--account-name $TARGET_SA \
--expiry 2021-01-01 \
--permissions dlr \
--https-only \
--output tsv)
存储用于导入的 SAS 令牌
使用 az keyvault secret 将 SAS 令牌存储在目标 Azure 密钥保管库中:
az keyvault secret set \
--name acrimportsas \
--value $IMPORT_SAS \
--vault-name $TARGET_KV
后续步骤
按照以下教程之一创建 ACR 传输资源。 对于大多数非自动化用例,建议使用 Az CLI 扩展。