Azure 容器注册表中的异地复制

需要本地存在或热备份的公司可选择从多个 Azure 区域运行服务。 最佳实践是在映像运行于的每个区域放置一个容器注册表,允许近网络操作,以实现快速可靠的映像层传输。 异地复制允许 Azure 容器注册表充当单个注册表,向多个区域提供多主区域注册表。

异地复制注册表有以下优点:

  • 单个注册表、映像和标记的名称可跨多个区域使用
  • 通过近网络注册表访问提高区域部署的性能和可靠性
  • 通过从容器主机所在区域或邻近区域的本地复制注册表中拉取映像层来降低数据传输成本
  • 跨多个区域对注册表进行单一管理
  • 发生区域性中断时的注册表复原能力

注意

  • 如果需要在多个 Azure 容器注册表中维护容器映像的副本,则 Azure 容器注册表还支持映像导入。 例如,在 DevOps 工作流中,可以将映像从开发注册表导入到生产注册表中,不需要使用 Docker 命令。
  • 如果要将注册表移到不同的 Azure 区域(而不是对注册表进行异地复制),请参阅手动将容器注册表移到另一个区域

先决条件

  • 用户需要具有以下权限(在注册表级别)才能创建/删除复制:

    权限 说明
    Microsoft.ContainerRegistry/registries/write 创建重复项
    Microsoft.ContainerRegistry/registries/replications/write 删除重复项

示例用例

Contoso 在中国各地运行着一个公开展示网站。 为了向这些市场提供本地近网内容,Contoso 在中国北部和中国东部运行 Azure Kubernetes 服务 (AKS) 群集。 部署为 Docker 映像的网站应用程序在所有区域中均使用相同的代码和映像。 从在每个区域独特部署的数据库检索该区域的本地内容。 对于本地数据库这样的资源,每个区域部署均有其唯一配置。

开发团队位于北京,使用中国北部数据中心。

推送到多个注册表
推送到多个注册表

使用异地复制功能之前,Contoso 已在中国北部拥有基于 CN 的注册表,在中国东部拥有其他注册表。 为了向这些不同的区域提供服务,开发团队将映像推送到了两个不同的注册表。

docker push contoso.azurecr.cn/public/products/web:1.2
docker push contosochinaeast.azurecr.cn/public/products/web:1.2

从多个注册表拉取
从多个注册表拉取

多个注册表的典型挑战包括:

  • 中国东部和中国北部均拉取自中国北部的注册表,当每个这样的远程容器主机从中国北部的数据中心拉取映像时,将产生出口费用。
  • 开发团队必须将映像推送到中国北部和中国东部的注册表。
  • 开发团队必须使用引用本地注册表的映像名称配置和维护每个区域的部署。
  • 必须为每个区域配置注册表访问。

异地复制的优点

从异地复制注册表拉取

Azure 容器注册表的异地复制功能具有以下优势:

  • 跨所有区域管理单个注册表:contoso.azurecr.cn
  • 管理多个映像部署的单个配置,因为所有区域使用同一个映像 URL:contoso.azurecr.cn/public/products/web:1.2
  • 推送到单个注册表,而 ACR 会自动管理异地复制。 ACR 仅复制独一无二的层,从而减少跨区域的数据传输。
  • 配置区域性 Webhook 来通知你特定副本中的事件。
  • 提供高度可用的注册表,该注册表可在发生区域性中断时复原。

Azure 容器注册表还支持可用性区域,以便在 Azure 区域中创建可复原和高度可用的 Azure 容器注册表。 某个区域内用于冗余的可用性区域和跨多个区域的异地复制合并在一起,可增强注册表的可靠性和性能。

配置异地复制

配置异地复制就如在地图上单击区域一样简单。 还可以使用工具(包括 Azure CLI 中的 az acr replication 命令)管理异地复制,或使用 Azure 资源管理器模板部署为异地复制启用的注册表。

部署到 Azure

异地复制是高级注册表的一项功能。 如果尚未使用高级注册表,可在 Azure 门户中将基本和标准更改为高级:

在 Azure 门户中切换服务层级

若要为高级注册表配置异地复制,请登录 Azure 门户

导航到 Azure 容器注册表,然后选择“复制”:

Azure 门户容器注册表 UI 中的副本

地图中显示了所有当前的 Azure 区域:

Azure 门户中的区域地图

  • 蓝色六边形表示当前的副本
  • 绿色六边形表示可能的复制区域
  • 灰色六边形表示尚不可复制的 Azure 区域

若要配置副本,请选择一个绿色六边形,然后选择“创建”:

Azure 门户中的“创建副本”UI

若要创建其他副本,请选择表示其他区域的绿色六边形,然后单击“创建”。

ACR 将开始在配置的副本间同步映像。 完成后,门户将显示“就绪”。 门户中的副本状态不会自动更新。 使用刷新按钮查看更新状态。

使用异地复制注册表的注意事项

  • 异地复制注册表中的每个区域在设置后都是独立的。 Azure 容器注册表 SLA 适用于每个异地复制区域。
  • 每当你在异地复制注册表中执行推送或拉取映像操作时,后台的 Azure 流量管理器都会将请求发送到区域中离注册表最近的位置以降低网络延迟。
  • 将映像或标记更新推送到最近的区域后,Azure 容器注册表需要一些时间将清单和层复制到你选择加入的其余区域。 较大的映像比较小的映像复制所需的时间更长。 映像和标记通过最终一致性模型在复制区域之间进行同步。
  • 若要管理依赖于异地复制注册表的推送更新的工作流,建议你配置 Webhook 以响应推送事件。 你可以在异地复制注册表中设置区域性 Webhook,以跟踪在异地复制区域内完成的推送事件。
  • 为了向表示内容层的 blob 提供服务,Azure 容器注册表使用了数据终结点。 可以在注册表的每个异地复制区域中为注册表启用专用数据终结点。 这些终结点允许配置严格限定范围的防火墙访问规则。 出于故障排除目的,你可以选择禁止路由到副本同时维护复制的数据。
  • 如果使用虚拟网络中的专用终结点为注册表配置专用链接,则默认情况下会启用每个异地复制区域中的专用数据终结点。

高可用性注意事项

  • 为实现高可用性和复原能力,我们建议在支持启用区域冗余的区域创建注册表。 也建议在每个副本区域中启用区域冗余。
  • 如果注册表主区域(创建区域)或其中某个副本区域出现中断,则异地复制注册表仍可用于数据平面操作,例如推送或拉取容器映像。
  • 如果注册表主区域变得不可用,则可能无法执行注册表管理操作,包括配置网络规则、启用可用性区域和管理副本。
  • 若要规划使用 Azure 密钥保管库中存储的客户管理的密钥加密的异地复制注册表的高可用性,请查看密钥保管库故障转移和冗余指南。

删除副本

为注册表配置副本后,如果不再需要该副本,则可以随时将其删除。 使用 Azure 门户或其他工具(例如 Azure CLI 中的 az acr replication delete 命令)删除副本。

若要在 Azure 门户中删除副本:

  1. 导航到你的 Azure 容器注册表,然后选择“复制”
  2. 选择某个副本的名称,然后选择“删除”。 确认要删除该副本。

若要使用 Azure CLI 删除中国东部区域中 myregistry 的副本:

az acr replication delete --name chinaeast --registry myregistry

异地复制定价

异地复制是 Azure 容器注册表高级服务层级的一项功能。 将注册表复制到所需区域时,每个区域都会产生高级注册表费用。

在前面的示例中,Contoso 将两个注册表合并到一起,并向中国东部和中国北部添加副本。 Contoso 每月将支付两次高级费用,且无额外配置或管理。 现在每个区域就从本地拉取映像,既提升了性能和可靠性,又节省了从中国北部到中国东部的网络传输费用。

使用异地复制注册表对推送操作进行故障排除

将映像推送到异地复制注册表的 Docker 客户端可能不会将所有映像层及其清单推送到单个复制区域。 出现这种情况的原因可能是因为 Azure 流量管理器将注册表请求路由到离网络最近的复制注册表。 如果注册表有两个附近的复制区域,则可以将映像层和清单分发到两个站点,并且在验证清单时推送操作将失败。 之所以出现此问题是因为在某些 Linux 主机上解析注册表的 DNS 名称的方式。 这个问题不会发生在 Windows 上,因为 Windows 提供了一个客户端 DNS 缓存。

如果出现此问题,一种解决方案是在 Linux 主机上应用客户端 DNS 缓存,比如 dnsmasq。 这有助于确保一致地解析注册表的名称。 如果你使用 Azure 中的 Linux VM 推送到注册表,请参阅 Azure 中 Linux 虚拟机的 DNS 名称解析选项中的选项。

若要在推送映像时将 DNS 解析优化到最近的副本,请在推送操作源所在的 Azure 区域中配置异地复制注册表,或者在 Azure 外部工作时配置最近的区域。

暂时禁止路由到副本

若要对针对异地复制注册表的操作进行故障排除,可能需要暂时禁止流量管理器路由到一个或多个副本。 从 Azure CLI 版本 2.8 开始,你可以在创建或更新复制区域时配置 --region-endpoint-enabled 选项(预览)。 将副本的 --region-endpoint-enabled 选项设置为 false 时,流量管理器不再将 docker 推送或拉取请求路由到该区域。 默认情况下,允许路由到所有副本,并且无论启用还是禁用路由,都将在所有副本间实现数据同步。

若要禁止路由到现有副本,请先运行 az acr replication list 以列出注册表中的副本。 然后,运行 az acr replication update 并为特定副本设置 --region-endpoint-enabled false。 例如,若要在 myregistry 中配置 chinanorth 副本的设置,请执行以下操作 :

# Show names of existing replications
az acr replication list --registry --output table

# Disable routing to replication
az acr replication update --name chinanorth \
  --registry myregistry --resource-group MyResourceGroup \
  --region-endpoint-enabled false

若要恢复路由到副本,请执行以下操作:

az acr replication update --name chinanorth \
  --registry myregistry --resource-group MyResourceGroup \
  --region-endpoint-enabled true

为已启用专用终结点的注册表创建复制

为启用了专用终结点的主注册表创建新的注册表复制时,我们建议你验证用户标识是否具有有效的专用终结点创建权限。 否则,操作会在创建复制时停滞在预配状态。

如果在创建注册表复制时停滞在预配状态,请执行以下步骤:

  • 手动删除停滞在预配状态的复制。
  • 添加Microsoft.Network/privateEndpoints/privateLinkServiceProxies/write用户标识的权限。
  • 重新创建注册表复制请求。

此权限检查仅适用于启用了专用终结点的注册表。

后续步骤

签出三部分的教程系列,Azure 容器注册表中的异地复制。 演示创建异地复制注册表、构建容器,然后使用单个 docker push 命令将其部署到多个区域的用于容器的 Web 应用。