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

为 Azure 容器注册表(ACR)启用异地复制将会在你选择的 Azure 区域中创建异地副本资源。 将映像推送到异地复制的注册表时,内容会自动同步到所有异地副本。

使用异地复制:

  • 管理一个注册表:在所有异地副本中维护一组凭据、角色分配、网络规则和注册表配置。
  • 使用一个全局终结点:在所有生成和部署中引用 myregistry.azurecr.cn/myimage:tag 。 Azure将请求路由到客户端最佳网络性能配置文件的异地副本,这通常是最近的异地副本。 但是,如果客户端与多个异地副本的距离相同,或者最近的异地副本不可用,则请求可能会被路由到其他位置。
  • 自动同步:推送标记和摘要一次;ACR 将内容和元数据复制到所有异地副本。

异地复制需要 高级 SKU

注意

高可用性注意事项

复制模型

ACR 地理复制使用 主动-主动 模型。

  • 所有异地副本都处于活动状态且可写,您可以在任何异地副本中推送、拉取和删除镜像,而不只是主区域中的异地副本。
  • 这不同于主要辅助复制模型,其中只有一个区域接受写入,次要区域是被动的。

一致性模型

ACR 使用 最终一致性

  • 在任何异地副本中推送或删除映像后,ACR 最终会在后台将这一更改复制到所有异地副本。
  • 复制时间取决于映像大小。 如果推送了大量映像,或者推送的映像体积较大,则已推送的映像或标记可能不会立即在其他异地副本中可供拉取。 同样,在删除操作传播到其他异地副本之前,已删除的镜像或标签在这些副本中可能仍可被拉取。
  • 创建新的异地副本所花费的时间会随着注册表的总大小而缩放。 创建新的异地副本时,现有异地副本将继续正常处理推送、拉取和删除流量。 在新的异地副本于后台完成同步期间,不会出现受限状态或性能降级窗口。
  • 在后台复制最终完成之前,异地副本可能尚未包含最新的内容或元数据。 当特定推送映像的复制在每个异地副本中完成时,可以使用 Webhook 接收通知。

Important

需要规划应对的最终一致性故障模式:

  • 推送后立即跨区域拉取 — 将映像推送到一个地理复制副本后,立即从另一个地理复制副本拉取可能会因 manifest unknown 而失败,直到复制完成同步。 这种情况常见于 CI/CD 管道:CI 运行器推送镜像后,分布在多个区域的 Pod 会立即尝试拉取该镜像。
  • 标签覆盖竞争 —— 推送 myapp:v1 后,随后不久又将 myapp:v1 以不同的摘要重新推送(同一标签,不同内容),可能会导致不同的地理复制副本在复制窗口期间将同一标签解析为不同的摘要。
  • 删除传播 - 删除一个区域中的标记或存储库需要一段时间才能传播。 从尚未传播删除的异地副本拉取仍可返回已删除的内容。
  • 推送中途故障转移分散 — 跨越基于运行状况感知的故障转移边界或 DNS 切换事件的多层推送,可能会将各层落到一个异地副本上,而将清单落到另一个异地副本上,表现为清单验证错误,或在后续拉取时出现 blob unknown。 有关缓解方法,请参阅 推送因清单错误而失败

缓解措施:

  • 为紧随跨区域推送之后的拉取操作加入重试逻辑——要么采用退避重试,要么在拉取前先检查复制状态。
  • 在触发跨区域拉取之前,使用 网络钩子 在每个地理副本完成复制时接收通知。

数据平面高可用性

异地复制通过在多个区域中保留映像来提高数据平面可用性。 如果某个区域发生中断,镜像仍可通过其他异地复制副本访问——推送、拉取和删除操作仍可通过其余异地复制副本继续进行。

始终为异地副本启用区域冗余 — ACR 会自动将副本数据分散到多个可用性区域,以防止区域性中断。

注意

如果注册表使用 客户管理的密钥,请查看 密钥保管库故障转移和冗余指南 ,了解最大复原能力。

运行状况感知故障转移

ACR 会自动监控每个异地副本的运行状况,并将全局终结点流量从无法可靠处理请求的异地副本切换出去。 这被称为运行状况感知故障转移。 ACR 基于 ACR 服务运行状况和Azure区域基础结构运行状况路由全局终结点流量。

  • 自动且按注册表:运行状况是按注册表而非按区域进行评估的。 如果降级仅影响区域中的一部分注册表,则只会重新路由这些注册表 , 同一区域中的其他注册表将继续在本地提供服务,不会造成不必要的延迟损失。
  • 时序:端到端重新路由通常需要几分钟,这样的速度既足够快,能够及时应对真正的区域性性能下降;又足够慢,可以避开那些会自行恢复的瞬时错误。 DNS TTL 可能会在所有客户端切换到新区域之前添加传播延迟。
  • 不需要客户操作:没有客户可调用的触发器。 运行状况感知故障转移完全由平台管理。
  • 故障回切是自动进行的:一旦异地副本的区域运行状况评估再次通过,例如当区域 ACR 或 Azure 基础架构恢复后,全局终结点就能够恢复将流量路由到已恢复的 Azure 区域中的异地副本。
  • 并非由限流触发:运行状况感知型故障转移基于 DNS,并根据区域 ACR 服务运行状况和 Azure 基础结构运行状况作出响应。 它不会根据 HTTP 429(限流)响应重新路由流量。 如果某个异地副本正在对你的请求进行限流,但该区域的基础设施运行正常,全局终结点仍会将你的请求路由到该异地副本。 若要管理限流,请使用 区域终结点 将工作负载分散到多个地理副本,以实现更好的容量分布。

运行状况感知故障转移的范围:

运行状况感知故障转移仅适用于针对 全局终结点 的操作(myregistry.azurecr.cn)。 它 不适用于

  • 区域终结点 - 使用区域终结点时(myregistry.<region>.geo.azurecr.cn)直接与一个特定的异地副本通信。 如果该区域降级,ACR 不会自动重新路由。 通过切换到另一个区域终结点来实现客户端故障转移。
  • 专用数据端点 — 注册表端点在将你重定向到某个专用数据端点以下载层后,在整个下载过程中,你都会一直使用该区域的数据端点。 区域由为 Blob 位置调用提供服务的注册表终结点提前决定。

故障转移期间的限制:

API 操作的限制速率是按每个副本计算。 在健康感知故障转移期间,原本分布在多个地理复制副本之间的流量,可能会大幅集中到仍留在全局终结点路由池中的地理复制副本上。 进行容量规划时,应确保至少有 两个或三个 异地副本,以便在故障转移期间将流量分散到多个健康的异地副本上。 当其中一个区域不可用时,仅包含两个区域的注册表更容易触及每个副本的限流上限。 若要缓解问题,请使用 区域终结点 将工作负荷分散到多个异地副本,并计划每个副本的容量。

如何确认故障转移:

  • Azure 门户:转到你的注册表,并在帮助部分下选择资源运行状况,以查看平台端的服务降级信号。
  • Azure CLI:使用 az acr replication list --registry myregistry --output table 检查复制状态。 出现问题的异地副本会显示为 online 以外的状态。
  • Azure Monitor:自动收集平台指标。 为资源日志启用 诊断设置 以获取详细的遥测数据。

主区域中断行为

主区域是最初创建注册表的区域。 它托管注册表的控制平面,用于管理注册表配置。 主区域在创建时是固定的,之后无法更改。 若要将注册表移动到其他主区域,请参阅 Relocate Azure 容器注册表,其中描述了重新部署过程(创建新注册表),而不是就地更改。

如果主区域不可用,效果仅限于控制平面(管理)操作。 所有数据平面操作将继续处理剩余的异地副本。

在主区域中断期间继续工作的内容:

  • 映像推送、拉取和删除 — 客户端可以使用全局终结点()或任何可用的区域终结点myregistry.azurecr.cnmyregistry.<region>.geo.azurecr.cn)从任何可用的异地副本推送、拉取和删除映像。 ACR 会自动将全局终结点请求路由到正常的异地副本。
  • 身份验证 — 所有身份验证方法都将继续正常工作,包括 Microsoft Entra ID、服务主体、托管标识和存储库范围令牌。 客户端可以向任何可用的异地副本进行身份验证,而无需更改凭据、令牌或注册表 URL。
  • Webhook 传递 - 为可用异地副本配置的 Webhook 将继续触发。 单次推送会产生来自接收该推送的异地副本的 webhook 事件,以及在复制完成后来自每个异地副本的事件。 Webhook 消费者应被设计为能够处理每个推送的镜像所对应的多个事件,并在需要时进行去重。
  • 区域终结点 - 如果启用了区域终结点,则它们将继续独立工作。 客户端可以使用区域终结点 URL 直接与特定异地副本通信。

在主区域中断期间不可用的内容:

  • 全局终结点路由到主区域异地副本 - ACR 的运行状况检测会自动停止将全局终结点流量路由到主区域异地副本,并将其重定向到正常的异地副本。
  • 主区域的区域终结点 - 主区域的区域终结点 (myregistry.<home-region>.geo.azurecr.cn) 在主区域关闭时不可用。 其他地理复制副本的区域终结点继续独立运行。
  • 注册表配置更改 - 在主区域恢复之前,无法修改注册表属性,例如网络规则、复制设置或可用性区域配置。
  • ACR 任务 - 任务 绑定到主区域,在主区域不可用时不会运行。

服务层级和限制注意事项

Azure 容器注册表服务层级和限制适用于每个异地副本。

某些服务层级限制具有以下特殊注意事项:

  • 存储限制:服务层的存储限制在所有异地副本之间共享。 例如,如果推送 1 GiB 映像并将其复制到 5 个异地副本,则只有 1 GiB 计入层的最大存储限制。
  • API 速率限制:API 操作的限流(例如每分钟读取和写入次数)特定于地理副本。 使用 区域终结点 将工作负荷分散到多个异地副本,以便更好地分配容量,并避免将所有流量集中在单个异地副本上。

有关服务层级和限制的详细信息,请参阅 ACR 服务层级

定价注意事项

  • 存储计费:存储按每个地理副本计费。 例如,复制到 5 个异地副本的 1 GiB 映像按 5 GiB 存储(1 GiB × 5 个异地副本)收费。
  • 数据传输:异地复制可以通过启用区域内映像推送和拉取来降低成本,从而避免在这些推送或拉取操作期间产生跨区域数据传输费用。 但是,当 ACR 将推送内容复制到其他异地副本作为最终一致性的一部分时,跨区域数据传输费用仍适用。

有关详细信息,请参阅 ACR 定价

添加或删除异地副本

所需权限

若要管理地理副本,您的身份需要以下权限:

权限 说明
Microsoft.ContainerRegistry/registries/read 获取注册表属性
Microsoft.ContainerRegistry/registries/write 创建或更新注册表属性
Microsoft.ContainerRegistry/registries/replications/read 列出异地副本
Microsoft.ContainerRegistry/registries/replications/write 创建或更新异地副本
Microsoft.ContainerRegistry/registries/replications/delete 删除异地副本
Microsoft.ContainerRegistry/registries/replications/operationStatuses/read 获取地理副本操作状态

Azure 门户

  1. Azure 门户中转到您的注册表。

  2. “服务”下,选择 “异地复制”。

  3. 在地图上:

    • 蓝色六边形:主页区域(在其中创建了注册表)
    • 绿色六边形:可用区域
    • 灰色六边形:不可用区域
  4. 选择绿色六边形,然后选择“ 创建”。

    Azure门户中地理复制地图的屏幕截图。

Azure CLI

# Create a replica
az acr replication create --registry myregistry --location chinaeast2

# List replicas
az acr replication list --registry myregistry --output table

# Delete a replica
az acr replication delete --registry myregistry --name chinaeast2

有关更多命令,请参阅 az acr replication

异地复制注册表的全局终结点

配置异地复制后,可以通过注册表的全局终结点(myregistry.azurecr.cn)推送、拉取或删除注册表中的内容。

全局端点的工作原理

通过全局终结点推送、拉取或删除时,ACR 会将请求路由到对客户端而言网络性能最佳的异地副本。

  • 对客户端而言,网络性能最佳的异地副本通常是距离最近的异地副本。

  • 但是,如果客户端与多个异地副本的距离相同,或者最近的异地副本不可用,则请求可能会被路由到其他位置。

  • ACR 管理此路由。 你无法控制由哪个地理副本处理某个特定请求。

    显示全局终结点请求流的示意图:客户端连接到 myregistry.azurecr.cn,Azure 托管路由会选择网络性能最佳的异地副本,而该异地副本会发出 307 重定向,将请求定向到其数据终结点以下载 blob。

使用全局端点

验证:

az acr login --name myregistry

标记并推送映像:

docker tag myapp:v1 myregistry.azurecr.cn/myapp:v1
docker push myregistry.azurecr.cn/myapp:v1

拉取镜像:

docker pull myregistry.azurecr.cn/myapp:v1

导入映像:

az acr import \
  --name myregistry \
  --source mcr.microsoft.com/hello-world:latest \
  --image hello-world:latest

Kubernetes 部署清单:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: myapp
spec:
  template:
    spec:
      containers:
      - name: myapp
        image: myregistry.azurecr.cn/myapp:v1

暂时从全局终结点路由中排除异地副本

可以通过禁用特定异地副本的 --global-endpoint-routing 设置,将其从全局端点路由中排除。 这对于维护或故障排除很有用,或者当你知道某个特定的异地副本或 Azure 区域出现性能下降时。 甚至可以为主区域地理复制副本禁用全局终结点路由——主区域仅用于控制平面操作,其数据平面流量可以安全地排除在全局路由之外。 若要详细了解主区域决定哪些内容,请参阅 主区域中断行为

  • 当特定异地副本的设置为--global-endpoint-routing时,ACR 将停止将发送到全局终结点的请求路由到该特定异地副本。
  • 即使为该特定异地副本禁用全局终结点路由,数据也继续 双向 同步到异地副本。 即使异地副本被排除在全局路由之外,从任何区域推送到注册表的每个镜像仍会复制到该副本。 重新启用异地副本后,它即可立即承载流量,无需追赶同步时间。
  • 因此,存储配额和成本将继续用于该异地副本。
  • 如果启用了区域终结点,则即使全局终结点路由已禁用,异地副本的区域终结点 URL(myregistry.<region-name>.geo.azurecr.cn)也会继续工作。 --global-endpoint-routing 仅控制异地复制副本参与 全局 终端节点路由。
# Exclude a geo-replica from global endpoint routing
az acr replication update --registry myregistry --name chinaeast2 \
  --global-endpoint-routing false

# Re-enable a geo-replica in global endpoint routing
az acr replication update --registry myregistry --name chinaeast2 \
  --global-endpoint-routing true

注意

在 Azure CLI 2.86.0 及更高版本中,--region-endpoint-enabled 已重命名为 --global-endpoint-routing。 旧标志名称已弃用,并在 Azure CLI 2.87.0(2026 年 6 月)中删除。 如果您有使用 --region-endpoint-enabled 的现有脚本或自动化流程,请将其更新为使用 --global-endpoint-routing

Important

不要为全局终结点运行生存期较长的 DNS 缓存。 为异地副本禁用全局终结点路由时,ACR 会通过快速路径在服务器端清除 DNS 记录。 但是,如果客户端为全局终结点运行自己的长期 DNS 缓存,这些客户端将继续解析为禁用的异地副本,直到客户端缓存过期。 长期存在的缓存会导致从客户端看来 --global-endpoint-routing false 似乎没有生效。

Tip

您可选择对向全局终结点的推送使用短时 DNS 缓存。 仅在单次推送期间有效的短期 DNS 固定有助于确保推送一致性,使所有层和清单都发送到同一个地理副本。 这还可避免 DNS 跳转,这可能导致清单错误,请参见 故障排除

异地复制注册表的区域终结点(预览版)

区域终结点为每个副本提供专用 URL,使你能够明确指定由哪个区域的异地副本处理你的推送、拉取或删除请求:

  • myregistry.chinaeast2.geo.azurecr.cn
  • myregistry.chinaeast2.geo.azurecr.cn

如果需要,请使用区域终结点:

Scenario 说明
可预测路由 确保工作负载始终使用特定副本,以实现区域内亲和性。
客户端故障转移 自行实现故障转移逻辑,基于你自己的客户端运行状况检查在各区域之间显式切换,而不依赖 Azure 自身为全局终结点提供支持的运行状况检查。
推拉一致性 为推送、拉取和删除操作指定特定的异地复制副本,以避免 CI/CD 管道或容器部署清单文件中因复制延迟和最终一致性而产生的竞争问题。
故障排除 测试或调试特定的区域副本。
容量规划 准确了解每个工作负载由哪个副本承载,以便按副本进行容量规划并避免限流。

Important

基于运行状况的故障转移不适用于区域终结点。 使用区域终结点时,直接与一个特定的异地副本通信。 如果该区域降级,ACR 不会自动重新路由。 运行状况感知故障转移仅适用于针对全局终结点(myregistry.azurecr.cn)的操作。 请参阅上表中的 客户端故障转移 方案。

注意

限流是按副本而不是按注册表进行的。 将工作负荷固定到单个区域终结点时,可将所有流量集中在该一个异地副本上。 如果所有群集都使用同一个区域端点,则在高峰期可能会触及该异地副本的单区域限流上限。 若要缓解问题,可将工作负荷分散到多个区域终结点,以便更好地分配容量,或者将全局终结点用于不需要显式固定的工作负荷。

区域终结点与全局终结点共存

启用区域终结点不会禁用或替换全局终结点。 可以同时使用两者:

  • 如果您希望使用由 Azure 在跨地理复制副本之间管理的自动路由,请使用 全局终结点myregistry.azurecr.cn)。
  • 如果需要更精细的客户端路由控制,请使用区域终结点myregistry.<region-name>.geo.azurecr.cn),以完全绕过 Azure 管理的全局终结点路由。

区域终结点的工作原理

区域端点充当特定地理复制副本的登录服务器。 在对区域终结点(而不是注册表的全局终结点)进行身份验证和交互时,所有注册表操作(身份验证、项目上传/下载、存储库操作和元数据操作)直接转到该特定区域副本,从而完全绕过Azure托管路由。

层 Blob 下载(实际容器映像层)仍遵循注册表的现有配置:

  • 没有专用终端节点或专用数据终端节点的注册表:从特定的异地复制副本下载映像层时,层 Blob 下载会重定向到 Azure 存储帐户(*.blob.core.chinacloudapi.cn)。
  • 启用了专用终结点或专用数据终结点的注册表:从特定异地副本下载映像层时,层 Blob 下载会重定向到相应区域的专用数据终结点(myregistry.<region-name>.data.azurecr.cn)。

下图演示了区域终结点请求流:

显示区域终结点请求流的关系图:客户端连接到 myregistry.region.geo.azurecr.cn,请求直接转到特定的区域异地副本,异地副本发出 307 重定向到其数据终结点进行 Blob 下载。

注意

通过区域终结点推送到异地副本的图像和标记仍将在最终一致性下传播到所有其他异地副本。

区域终结点先决条件

  • 高级 SKU - 区域终结点仅在 高级 层注册表上提供。
  • Azure CLI — 版本 2.86.0 或更高版本。 所有区域终结点命令(--regional-endpointsaz acr show-endpointsaz acr login --endpoint)在 Azure CLI 2.86.0 及更高版本中均可原生使用。

Important

如果以前安装了专用预览版 CLI 扩展: 如果参与区域终结点专用预览版并安装了 acrregionalendpoint CLI 扩展,请卸载它以防止与内置 CLI 命令冲突:

az extension remove --name acrregionalendpoint

可以使用以下方法验证扩展不再安装:

az extension list --query "[?name=='acrregionalendpoint']" -o table

注意

即使在不进行异地复制的情况下,也可以在任何高级 SKU 注册表上启用区域终结点。 没有异地复制的注册表在主区域中具有单个异地副本,该副本获取一个区域终结点 URL。 但是,当注册表至少有两个异地副本时,此功能最有用。

启用区域终结点

创建新的注册表或更新现有注册表时,可以启用区域终结点。

创建启用了区域终结点的新注册表:

az acr create \
  -n myregistry \
  -g myrg \
  -l regionname \
  --sku Premium \
  --regional-endpoints enabled

在现有注册表上启用区域终结点:

az acr update \
  -n myregistry \
  -g myrg \
  --regional-endpoints enabled

区域端点在注册表级别启用,并适用于每个异地复制副本。 无法为单个副本启用区域终结点。 启用区域终结点时,Azure 容器注册表会自动为每个异地副本创建登录服务器 URL。

使用区域终端节点

验证并使用区域终结点

区域终结点支持与全局终结点相同的身份验证方法:Microsoft Entra ID、服务主体、托管标识和管理员凭据。

Important

切换终结点时重新进行身份验证。 ACR 令牌可同时用于全局终结点和区域终结点。 但是,Docker 和 containerd 等容器工具会按主机名存储凭据,因此,从全局端点切换到区域端点(或在不同区域端点之间切换)时,需要为该主机名提供新的 az acr login。 对于 AKS,Kubernetes ACR 凭据提供程序 会在终结点更改时自动处理此问题。

登录到特定区域终结点:

az acr login --name myregistry --endpoint chinaeast2

标记映像并将其推送到区域终结点。 通过区域终结点推送到异地副本的图像和标记仍将在最终一致性下传播到所有其他异地副本。

docker tag myapp:v1 myregistry.chinaeast2.geo.azurecr.cn/myapp:v1
docker push myregistry.chinaeast2.geo.azurecr.cn/myapp:v1

从区域终结点拉取映像:

docker pull myregistry.chinaeast2.geo.azurecr.cn/myapp:v1

使用部署清单中嵌入的区域性终结点

如果需要将工作负荷固定到特定区域,可以直接在 Kubernetes 部署清单中指定区域终结点。 这可确保特定区域中的群集始终从其同位置副本拉取数据,从而实现可预测的路由并降低延迟。

中国东部 2 群集部署:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: myapp-chinaeast2
spec:
  template:
    spec:
      containers:
      - name: myapp
        image: myregistry.chinaeast2.geo.azurecr.cn/myapp:v1

中国东部 2 群集部署:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: myapp-chinaeast2
spec:
  template:
    spec:
      containers:
      - name: myapp
        image: myregistry.chinaeast2.geo.azurecr.cn/myapp:v1

通过在各个群集的清单中使用不同的区域终结点,你可以选择确保每个群集都从其本地副本拉取,而不是依赖 Azure 管理的路由。

有关 Azure Kubernetes 服务 (AKS) 与 ACR 进行身份验证的信息,请参阅 从 Azure Kubernetes 服务 对 Azure 容器注册表进行身份验证

将区域终结点与基于 DNS 的路由配合使用,而无需更改部署清单

如果不想为每个区域维护不同的部署清单,可以保留指向全局终结点(myregistry.azurecr.cn)的所有清单,并使用软件定义的网络或区域流量管理器根据原始区域的流量将全局终结点解析为相应的区域终结点。 这可实现与区域终结点(可预测路由和降低延迟)相同的共置目标,而无需在部署清单中嵌入特定于区域的 URL。

有关 Azure Kubernetes 服务 (AKS) 与 ACR 进行身份验证的信息,请参阅 从 Azure Kubernetes 服务 对 Azure 容器注册表进行身份验证

使用区域终结点从特定异地副本导入

在注册表之间导入映像时,可以使用区域终结点从源注册表的特定异地副本导入。 这对于需要可预测的网络路径或需要从特定区域中的副本导入的方案非常有用。

az acr import \
  --name mydownstreamregistry \
  --source myupstreamregistry.chinaeast2.geo.azurecr.cn/myapp:v1 \
  --image myapp:v1

区域终结点网络注意事项

防火墙规则

如果对区域终结点使用 ACR 防火墙规则或自定义防火墙,请将防火墙规则配置为允许访问:

终结点 Purpose
myregistry.<region-name>.geo.azurecr.cn 注册表操作的区域终结点
myregistry.azurecr.cn 全局端点(如果也使用的话)
myregistry.<region-name>.data.azurecr.cn 层下载(如果使用专用终结点或专用数据终结点)
*.blob.core.chinacloudapi.cn 层下载(如果未使用专用终结点或专用数据终结点)

专用端点

为虚拟网络中的注册表创建 专用终结点 时,专用终结点资源会公开多个虚拟网络专用 IP,这些 IP 涵盖 所有 注册表的终结点图面:全局终结点、每个区域终结点(如果已启用区域终结点),以及每个专用数据终结点(配置专用终结点时自动启用)。

每个终结点接口都会占用虚拟网络子网中的一个专用 IP 地址。 相应地规划子网大小:

  • 1 个 IP 用于全局端点(myregistry.azurecr.cn
  • 每个异地副本对应 1 个 IP,用于专用数据终结点 (myregistry.<region>.data.azurecr.cn) — 在至少具有一个专用终结点的注册表中始终启用
  • 对于区域终结点,每个异地副本 1 个 IPmyregistry.<region>.geo.azurecr.cn)— 仅当启用了区域终结点时

示例:启用了 3 个地理复制副本和区域终结点的注册表,每个专用终结点资源需要 1(全局)+ 3(数据)+ 3(区域)= 7 个专用 IP 地址。 如果没有区域终结点,同一注册表需要 1 + 3 = 4 个专用 IP 地址

如果有多个异地副本,当子网中没有足够的可用 IP 地址时,可能无法创建专用终结点。 有关详细信息,请参阅 使用专用终结点从虚拟网络私下连接到注册表

专用数据终结点

当区域终结点与 专用数据终结点 同时启用时——无论是显式启用,还是由于至少配置了一个专用终结点而自动启用——层 Blob 下载将自动从区域终结点重定向到异地副本的专用数据终结点(myregistry.<region-name>.data.azurecr.cn)。 重定向目标始终与区域端点位于 同一区域——从 myregistry.chinaeast2.geo.azurecr.cn 发起的拉取始终会重定向到 myregistry.chinaeast2.data.azurecr.cn,绝不会重定向到其他区域中的数据端点。

从全局端点拉取时,此同一区域保障也适用。 ACR 会将请求路由到为客户端提供最佳网络性能的异地副本,而提供服务的异地副本会返回一个 307 重定向,指向其自身专用的数据终结点——绝不会跨区域。

Tip

启用专用数据终结点以实现最佳的区域内性能,并为层下载启用专用 URL:

az acr update -n <registry-name> --data-endpoint-enabled true

有关详细信息,请参阅 Azure 容器注册表 中的专用数据终结点

端点引用

有关控制它们的所有注册表终结点类型、URL 格式和 CLI 标志的完整参考,请参阅 Azure 容器注册表 终结点参考

故障排除

推送失败,出现清单错误

docker push 是一系列 HTTP 请求:先为每一层上传 blob,然后上传一个通过摘要引用这些层的清单。 某些 Linux DNS 解析程序不会一致缓存响应。 如果邻近区域中存在多个异地副本,则在一次推送过程中,DNS 可能会解析到不同的异地副本(DNS 跳转),从而导致推送的清单引用已推送到另一个异地副本的层。 由于复制是最终一致的,清单可能会到达尚未包含其引用层的副本上,从而导致清单验证失败。

解决方案 (按首选项顺序):

  1. 使用 区域终端节点 使推送端到端始终定向到单个地理复制副本。 每个子请求(登录、Blob 上传、清单上传)都会发送到同一个地理复制副本。 这是最简洁的修复方案,也是对于任何对推送/拉取一致性有要求的流程所推荐的方法。
  2. 使用短生存期 DNS 缓存,例如 dnsmasq 范围限定为单个推送的持续时间。 有关 Azure 中的 Linux VM,请参阅 DNS 名称解析选项。 这种固定只应持续到本次推送结束,不应更久——不要为全局终结点使用长期有效的 DNS 缓存,因为这会干扰 --global-endpoint-routing false 以及基于运行状况感知的故障转移路由。
  3. 将发布步骤设计为幂等操作,以便在推送过程中发生故障时触发重试也能安全进行。

启用了专用终结点的注册表的异地副本创建停滞

如果为启用了专用终结点的注册表创建异地副本的标识没有足够的权限来创建专用终结点网络资源,通常会出现此问题。

解决方案

  • 若要解决此问题,请手动删除陷入预配状态的异地副本。
  • 之后,请确保在创建异地副本之前,身份具有权限 Microsoft.Network/privateEndpoints/privateLinkServiceProxies/write
  • 此外,还请验证连接到注册表的每个专用终结点子网都具有可用的 IP 容量。 如果任何连接的虚拟网络 中的任何 子网没有足够的可用 IP,复制预配将失败并回滚。 副本短暂处于Creating状态,然后被删除。 生成的错误无法识别哪个子网或虚拟网络已用尽。 有关子网大小调整指南,请参阅 使用专用终结点私下连接到注册表