排查与注册表相关的网络问题

本文将帮助你排查在访问位于虚拟网络中或防火墙或代理服务器后面的 Azure 容器注册表时可能遇到的问题。

症状

可能包括以下一项或多项:

  • 无法推送或拉取映像,出现错误 dial tcp: lookup myregistry.azurecr.cn
  • 无法推送或拉取映像,出现错误 Client.Timeout exceeded while awaiting headers
  • 无法推送或拉取映像,出现 Azure CLI 错误 Could not connect to the registry login server
  • 无法将映像从注册表拉取到 Azure Kubernetes 服务或其他 Azure 服务
  • 无法访问 HTTPS 代理后面的注册表,出现错误 Error response from daemon: login attempt failed with status: 403 ForbiddenError response from daemon: Get <registry>: proxyconnect tcp: EOF Login failed
  • 无法配置虚拟网络设置,出现错误“Failed to save firewall and virtual network settings for container registry
  • 无法在 Azure 门户中访问或查看注册表设置,或者无法使用 Azure CLI 管理注册表
  • 无法添加或修改虚拟网络设置或公共访问规则
  • Azure 容器注册表任务无法推送或拉取映像
  • Microsoft Defender for Cloud 无法扫描注册表中的映像,或者 Microsoft Defender for Cloud 无法显示扫描结果
  • 在尝试访问使用专用终结点配置的注册表时,你收到错误 host is not reachable

原因

  • 客户端防火墙或代理阻止访问 - 解决方案
  • 注册表上的公用网络访问规则阻止访问 - 解决方案
  • 虚拟网络或专用终结点配置阻止访问 - 解决方案
  • 尝试将 Microsoft Defender for Cloud 或某些其他 Azure 服务与具有专用终结点、服务终结点或公共 IP 访问规则的注册表相集成 - 解决方案

进一步诊断

运行 az acr check-health 命令可详细了解注册表环境的运行状况,以及对目标注册表的访问(可选)。 例如,诊断某些网络连接或配置问题。

参阅检查 Azure 容器注册表的运行状况以查看命令示例。 如果报告了错误,请查看错误参考和以下部分,以了解建议的解决方案。

如果在将 Azure Kubernetes 服务与集成注册表配合使用时遇到问题,请运行 az aks check-acr 命令,以验证 AKS 群集是否可以访问该注册表。

注意

当注册表身份验证或授权存在问题时,也可能出现一些网络连接症状。 请参阅注册表登录故障排除

可能的解决方案

配置客户端防火墙访问权限

若要从客户端防火墙或代理服务器后面访问注册表,请将防火墙规则配置为可访问注册表的公共 REST 和数据终结点。 如果启用了专用数据终结点,则需要用于访问以下终结点的规则:

  • REST 终结点:<registryname>.azurecr.cn
  • 数据终结点:<registry-name>.<region>.data.azurecr.cn

对于异地复制的注册表,请为每个区域副本配置对数据终结点的访问权限。

在 HTTPS 代理后面,确保 Docker 客户端和 Docker 守护程序均已针对代理行为进行了配置。 如果更改了 Docker 守护程序的代理设置,必需重启该守护程序。

ContainerRegistryLoginEvents 表中的注册表资源日志可能有助于诊断尝试的连接被阻止的问题。

相关链接:

配置对注册表的公共访问权限

如果通过 Internet 访问注册表,请确认注册表允许从客户端通过公用网络进行的访问。 默认情况下,Azure 容器注册表允许从所有网络访问公共注册表终结点。 注册表可以将访问限制为来自所选网络或所选 IP 地址。

如果为具有服务终结点的虚拟网络配置了注册表,禁用公用网络访问还会禁止通过服务终结点进行访问。 如果为具有专用链接的虚拟网络配置了注册表,则 IP 网络规则不适用于注册表的专用终结点。

相关链接:

配置 VNet 访问权限

确认虚拟网络为专用链接配置了专用终结点,或者配置了服务终结点(预览版)。 当前不支持 Azure Bastion 终结点。

如果配置了专用终结点,请确认 DNS 已将注册表的公共 FQDN(例如,myregistry.azurecr.cn)解析为注册表的专用 IP 地址。

  • 使用 --vnet 参数运行 az acr check-health 命令以确认到虚拟网络中的专用终结点的 DNS 路由。
  • 使用网络实用工具(如 dignslookup)进行 DNS 查找。
  • 确保为注册表 FQDN 和每个数据终结点 FQDN 配置 DNS 记录

查看用于限制从网络中的其他资源发往注册表的流量的 NSG 规则和服务标记。

如果配置了注册表的服务终结点,请确认用于允许从该网络子网进行访问的网络规则已添加到注册表。 服务终结点仅支持从网络中的虚拟机和 AKS 群集进行访问。

若要使用其他 Azure 订阅中的虚拟网络限制注册表访问,请确保在该订阅中注册 Microsoft.ContainerRegistry 资源提供程序。 使用 Azure 门户、Azure CLI 或其他 Azure 工具为 Azure 容器注册表注册资源提供程序

如果在网络中配置了 Azure 防火墙或类似的解决方案,请检查是否已允许来自其他资源(如 AKS 群集)的出口流量到达注册表终结点。

相关链接:

配置服务访问

目前,多个 Azure 服务不允许访问具有网络限制的容器注册表:

  • Microsoft Defender for Cloud 在限制对专用终结点、选定子网或 IP 地址的访问权限的注册表中,无法执行映像漏洞扫描
  • 某些 Azure 服务(包括 Azure 应用服务和 Azure 容器实例)的资源无法访问具有网络限制的容器注册表。

如果需要使用容器注册表访问或集成这些 Azure 服务,请去除网络限制。 例如,删除注册表的专用终结点,或者删除或修改注册表的公共访问规则。

从 2021 年 1 月开始,可以将受网络限制的注册表配置为允许从所选的受信任服务访问

相关链接:

高级故障排除

如果在注册表中启用了收集资源日志,请查看 ContainterRegistryLoginEvents 日志。 此日志存储身份验证事件和状态,包括传入标识和 IP 地址。 查询此日志可获得有关注册表身份验证失败的信息。

相关链接:

后续步骤

如果此处无法解决你的问题,请参阅以下选项。