你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn

在专用的代理池上运行 ACR 任务

设置 Azure 管理的 VM 池(代理池),以便能够在专用的计算环境中运行 Azure 容器注册表任务。 在注册表中配置了一个或多个池之后,可以选择某个池替代服务的默认计算环境来运行任务。

代理池提供以下功能:

  • 虚拟网络支持 - 将代理池分配到 Azure VNet,提供对该 VNet 中资源(例如容器注册表、密钥保管库或存储)的访问。
  • 根据需要进行缩放 - 为计算密集型任务增加代理池中的实例数,或缩放到零。 计费是基于池分配的。 有关详细信息,请参阅定价
  • 灵活的选项 - 选择不同的池层和缩放选项,以满足任务工作负载需求。
  • Azure 管理 - 任务池由 Azure 进行修补和维护,提供了保留的分配,无需维护单个的 VM。

此功能在“高级”容器注册表服务层级中可用。 有关注册表服务层级和限制的信息,请参阅 Azure 容器注册表 SKU

重要

此功能目前以预览版提供,存在一些限制。 需同意补充使用条款才可使用预览版。 在正式版 (GA) 推出之前,此功能的某些方面可能会有所更改。

预览版限制

  • 任务代理池目前支持 Linux 节点。 目前不支持 Windows 节点。
  • 任务代理池以预览版形式在以下区域中提供:美国西部 2、美国中南部、美国东部 2、美国东部、美国中部、欧洲西部、欧洲北部、加拿大中部、东亚、瑞士北部、USGov 亚利桑那州、USGov 德克萨斯州和 USGov 弗吉尼亚州。
  • 对于每个注册表,所有标准代理池的默认 vCPU(核心)总配额为 16,独立代理池的此总配额则为 0。 如需更多分配,请提出支持请求

先决条件

  • 若要使用本文中所述的 Azure CLI 步骤,需要安装 Azure CLI 版本 2.3.1 或更高版本。 如果需要进行安装或升级,请参阅安装 Azure CLI。 或是在 Azure Cloud Shell 中运行。
  • 如果还没有容器注册表,请在某个预览版区域中创建一个(需要“高级”层)。

池层

代理池层在池中按实例提供以下资源。

类型 CPU 内存 (GB)
S1 standard 2 3
S2 standard 4 8
S3 standard 8 16
I6 已隔离 64 216

创建和管理任务代理池

设置默认注册表(可选)

若要简化后面的 Azure CLI 命令,请通过运行 az config 命令来设置默认注册表:

az config set defaults.acr=<registryName>

以下示例假定已经设置了默认注册表。 如果尚未设置,请在每个 az acr 命令中传递 --registry <registryName> 参数。

创建代理池

通过使用 az acr agentpool create 命令来创建代理池。 以下示例创建层 S2 池(4 CPU/实例)。 在默认情况下,该池包含 1 个实例。

az acr agentpool create \
    --registry MyRegistry \
    --name myagentpool \
    --tier S2

注意

创建代理池和其他池管理操作需要几分钟才能完成。

缩放池

使用 az acr agentpool update 命令来纵向扩展或纵向缩减池大小。 下面的示例将池缩放到 2 个实例。 可以缩放到 0 个实例。

az acr agentpool update \
    --registry MyRegistry \
    --name myagentpool \
    --count 2

在虚拟网络中创建池

添加防火墙规则

任务代理池需要访问以下 Azure 服务。 必须将以下防火墙规则添加到任何现有的网络安全组或用户定义的路由。

方向 协议 Source Port 目标 Dest Port 已使用 注解
出站 TCP VirtualNetwork 任意 AzureKeyVault 443 默认
出站 TCP VirtualNetwork 任意 存储 443 默认
出站 TCP VirtualNetwork 任意 EventHub 443 默认
出站 TCP VirtualNetwork 任意 AzureActiveDirectory 443 默认
出站 TCP VirtualNetwork 任意 AzureMonitor 443,12000 默认 端口 12000 是用于诊断的唯一端口

注意

如果任务需要来自公共 Internet 的其他资源,请添加相应的规则。 例如,需要其他规则来运行从 Docker Hub 拉取基础映像的 docker 生成任务,或者来还原某个 NuGet 包。

以 MCR 为部署基础的客户可参考 MCR/MAR 防火墙规则。

高级网络配置

如果标准防火墙/NSG(网络安全组)规则被视为过于宽松,并且出站连接需要更精细的控制,请考虑以下方法:

  • 在代理池子网上启用服务终结点。 这会授予代理池对其服务依赖项的访问权限,同时保持安全的网络状况。
  • 请务必注意,出站防火墙/NSG 规则仍是必需的。 这些规则有助于虚拟网络将源 IP 从公共 IP 切换到专用,这是启用服务终结点以外的其他步骤。

此处介绍了有关服务终结点的详细信息。

至少需要以下服务终结点

  • Microsoft.AzureActiveDirectory
  • Microsoft.ContainerRegistry
  • Microsoft.EventHub
  • Microsoft.KeyVault
  • Microsoft.Storage(或考虑异地复制的相应存储区域)

注意

目前,Azure Monitor 的服务终结点不存在。 如果未配置 Azure Monitor 的出站流量,代理池将无法发出诊断日志,但可能仍然显示为正常运行。 在这种情况下,ACR 将无法完全解决遇到的任何问题,因此在规划网络配置时,网络管理员必须考虑到这一点。

此外,请务必注意,所有 ACR 任务都有预缓存的映像,适用于一些更常见的用例。 任务一次只缓存一个版本,这意味着如果使用完整标记的映像引用,则生成代理将尝试拉取映像。 例如,一个常见的用例是 cmd: mcr.microsoft.com/acr/acr-cli:<tag>。 但是,预缓存的版本会经常更新,这意味着计算机上的实际版本可能会更高。 在这种情况下,网络配置必须配置出站流量到目标注册表主机的路由,这在上面的示例是 mcr.microsoft.com。 相同的规则适用于任何其他外部公共注册表(docker.io、quay.io、ghcr.io 等)。

在 VNet 中创建池

以下示例在 myvnet 网络的 mysubnet 子网中创建代理池 :

# Get the subnet ID
subnetId=$(az network vnet subnet show \
        --resource-group myresourcegroup \
        --vnet-name myvnet \
        --name mysubnetname \
        --query id --output tsv)

az acr agentpool create \
    --registry MyRegistry \
    --name myagentpool \
    --tier S2 \
    --subnet-id $subnetId

在代理池上运行任务

下面的示例演示如何在对任务排队时指定代理池。

注意

若要在 ACR 任务中使用代理池,请确保该池至少包含 1 个实例。

快速任务

通过使用 az acr build 命令在代理池上将快速任务排队,并传递 --agent-pool 参数:

az acr build \
    --registry MyRegistry \
    --agent-pool myagentpool \
    --image myimage:mytag \
    --file Dockerfile \
    https://github.com/Azure-Samples/acr-build-helloworld-node.git#main

自动触发的任务

例如,使用 az acr task create 在代理池是创建计划的任务,传递 --agent-pool 参数。

az acr task create \
    --registry MyRegistry \
    --name mytask \
    --agent-pool myagentpool \
    --image myimage:mytag \
    --schedule "0 21 * * *" \
    --file Dockerfile \
    --context https://github.com/Azure-Samples/acr-build-helloworld-node.git#main \
    --commit-trigger-enabled false

若要验证任务设置,请运行 az acr task run

az acr task run \
    --registry MyRegistry \
    --name mytask

查询池状态

若要查找代理池上目前计划的运行的数量,请运行 az acr agentpool show

az acr agentpool show \
    --registry MyRegistry \
    --name myagentpool \
    --queue-count

后续步骤

如需更多关于云中容器映像生成和维护的示例,请查看 ACR 任务教程系列