启用项目缓存以缓存另一个 Azure 容器注册表中的项目

本文介绍如何在 Azure 容器注册表(ACR)中启用 项目缓存功能 ,以便从另一个 Azure 容器注册表缓存映像。 下游注册表使用托管标识向上游注册表进行身份验证,因此无需在 Azure 密钥保管库 中存储凭据。

除了此处列出的先决条件之外,还需要具有活动订阅的 Azure 帐户。 创建试用版订阅

先决条件

  • 现有的下游 ACR 实例(本文中称为 MyRegistry)。 如果还没有 容器注册表,请创建新的容器注册表
  • 包含要缓存工件的现有上游 ACR 实例(本文中称为 UpstreamRegistry)。
  • Azure CLI 2.85.0 或更高版本。 可以使用Azure CLI本地安装。 若要确认版本,请运行 az --version。 若要安装或升级,请参阅安装 Azure CLI

配置项目缓存

创建用户分配的托管标识

ACR 到 ACR 缓存使用用户分配的托管标识(而不是 密钥保管库 中存储的用户名和密码凭据)向上游注册表进行身份验证。 需要创建托管标识,并向其授予对上游注册表的访问权限。

  1. 创建用户分配的托管标识:

    az identity create \
      --name MyACRCacheIdentity \
      --resource-group MyResourceGroup
    
  2. 获取托管身份的主体 ID 和资源 ID:

    IDENTITY_PRINCIPAL_ID=$(az identity show \
      --name MyACRCacheIdentity \
      --resource-group MyResourceGroup \
      --query 'principalId' \
      -o tsv)
    
    IDENTITY_RESOURCE_ID=$(az identity show \
      --name MyACRCacheIdentity \
      --resource-group MyResourceGroup \
      --query 'id' \
      -o tsv)
    

在上游注册表上分配拉取权限

上游注册表必须 启用 ABAC(Attribute-Based 访问控制), 以便你可以分配精细的存储库权限。 托管标识需要上游注册表上的 容器注册表存储库读取者 角色,该角色的范围限定为要缓存的特定存储库。

注释

如果上游注册表尚未启用 ABAC,请运行 az acr update --name UpstreamRegistry --role-assignment-mode rbac-abac

  1. 获取上游注册表的资源 ID:

    UPSTREAM_ID=$(az acr show \
      --name UpstreamRegistry \
      --query 'id' \
      -o tsv)
    
  2. 容器注册表存储库读取者 角色分配给上游注册表上的托管标识:

    az role assignment create \
      --role "Container Registry Repository Reader" \
      --assignee "$IDENTITY_PRINCIPAL_ID" \
      --scope "$UPSTREAM_ID/repositories/myapp"
    

创建缓存规则

创建一个缓存规则,用于将项目从上游注册表拉取到下游注册表。

  1. 运行 az acr cache create 以创建缓存规则。 使用 --identity 参数指定用户分配的托管标识,以便通过上游注册表进行身份验证:

    az acr cache create \
      -r MyRegistry \
      -n MyRule \
      -s upstreamregistry.azurecr.cn/myapp \
      -t myapp \
      --identity "$IDENTITY_RESOURCE_ID"
    
  2. 运行 az acr cache show 以验证缓存规则:

    az acr cache show -r MyRegistry -n MyRule
    

验证缓存

配置缓存规则并分配所需权限后,从下游注册表拉取映像以验证缓存是否正常工作。

docker pull myregistry.azurecr.cn/myapp:latest

首次拉取会从上游注册表检索镜像,并将其缓存在下游注册表中。 随后的拉取操作将直接从下游注册表的缓存中获取。

清理资源

不再需要缓存资源时,请删除缓存规则、角色分配和托管标识。

  1. 通过运行 az acr cache delete以下命令删除缓存规则:

    az acr cache delete -r MyRegistry -n <cache-rule-name>
    

    替换<cache-rule-name>为创建缓存规则时使用的名称(例如,MyRule用于Azure CLI选项卡或cacheRule用于Bicep选项卡)。

  2. 删除上游注册表上的角色分配:

    UPSTREAM_ID=$(az acr show --name UpstreamRegistry --query 'id' -o tsv)
    
    IDENTITY_PRINCIPAL_ID=$(az identity show \
      --name MyACRCacheIdentity \
      --resource-group MyResourceGroup \
      --query 'principalId' \
      -o tsv)
    
    az role assignment delete \
      --role "Container Registry Repository Reader" \
      --assignee "$IDENTITY_PRINCIPAL_ID" \
      --scope "$UPSTREAM_ID/repositories/myapp"
    
  3. 删除用户分配的托管标识:

    az identity delete \
      --name MyACRCacheIdentity \
      --resource-group MyResourceGroup
    

    注释

    在删除身份之前,请确保该身份未被任何其他资源使用。

后续步骤