本文可帮助你排查Azure容器注册表性能可能遇到的问题。
症状
可能包括以下一项或多项:
- 使用 Docker CLI 拉取或推送映像所需的时间长于预期时间
- 将映像部署到服务(例如Azure Kubernetes Service)所需的时间比预期长
- 你无法在预期时间内完成大量并发拉取或推送操作
- 你会看到类似于
Too many requests的 HTTP 429 错误 - 异地复制的注册表中的拉取或推送操作花费的时间长于预期时间,或者推送失败,出现错误
Error writing blob或Error writing manifest
原因
- 网络连接速度可能会降低注册表操作速度 - 解决方案
- 在客户端中,映像层压缩或提取速度可能会很慢 - 解决方案
- 您在注册服务级别或环境中达到了已配置的限制 - 解决方案
- 异地复制的注册表在附近的区域中有副本 - 解决方案
- 您正在从地理位置较远的注册表副本拉取 - solution
如果此处无法解决你的问题,请参阅高级故障排除和后续步骤了解其他选项。
可能的解决方案
检查预期的网络速度
检查您的 Internet 上传和下载速度,或者使用 AzureSpeed 等工具来测试从托管注册表镜像层的 Azure Blob 存储进行 上传 和 下载 的速度。
请根据您的注册服务级别,检查镜像大小是否符合支持的最大尺寸,以及下载或上传带宽是否在支持范围内。 如果注册表位于“基本”或“标准”层级,请考虑升级以提高性能。
若要将映像部署到其他服务,请检查注册表和目标所在的区域。 请考虑在相同区域或网络上相近的区域中查找注册表和部署目标,以提高性能。
相关链接:
检查客户端硬件
Docker 客户端上的磁盘类型和 CPU 可能会影响在拉取或推送操作过程中客户端上提取或压缩映像层的速度。 例如,硬盘驱动器上的层提取所需时间比固态磁盘上的要长。 比较你的 Azure 容器注册表和公共注册表(例如 Docker Hub)中可比映像的拉取操作。
查看已配置的限制
如果要同时将多个多层映像推送或拉取到镜像仓库,请查看镜像仓库服务层级支持的 ReadOps 和 WriteOps 限制。 如果注册表位于“基本”或“标准”层级,请考虑升级以提高限制。 另外,请与网络提供商联系,了解在执行许多并发操作时可能会发生的网络限制。
查看 Docker 守护程序配置,以了解客户端上每个推送或拉取操作的最大并发上载数或下载数。 如果需要,请配置更高的限制。
由于每个映像层都需要单独的注册表读取或写入操作,因此请检查映像中的层数。 考虑用来减少图像层数的策略。
相关链接:
配置地理复制的注册表
如果 Docker 客户端将映像推送到异地复制的注册表,那么该客户端可能不会将所有映像层及其清单推送到单个已复制的区域。 这种情况可能发生,因为Azure Traffic Manager将注册表请求路由到网络最近的复制注册表。 如果注册表有两个附近的复制区域,则可以将映像层和清单分发到两个站点,并且在验证清单时推送操作将失败。
若要在推送映像时优化对最靠近副本的 DNS 解析,请在与推送作源相同的Azure区域中配置异地复制注册表,或者在Azure外部工作时配置最近的区域。
若要排查异地复制的注册表的操作问题,还可以暂时禁止流量管理器路由到一个或多个副本。
相关链接:
为异地复制的注册表配置 DNS
如果从异地复制的注册表拉取操作显得缓慢,可能是因为客户端的 DNS 配置解析到了地理位置较远的 DNS 服务器。 在这种情况下,流量管理器可能会将请求路由到网络上离 DNS 服务器较近但离客户端较远的副本。 运行 nslookup 或 dig(在 Linux 上)等工具来确定流量管理器将注册表请求路由到的副本。 例如:
nslookup myregistry.azurecr.cn
一种可能的解决方案是配置更近的 DNS 服务器。
相关链接:
高级故障排除
如果对注册表资源的权限允许,请检查注册表环境的运行状况。 如果报告了错误,请查看错误参考来了解可能的解决方案。
如果在注册表中启用了收集资源日志,请查看 ContainterRegistryRepositoryEvents 日志。 此日志存储有关推送或拉取事件等操作的信息。 查询此日志可获得有关存储库级操作失败的信息。
相关链接:
后续步骤
如果此处无法解决你的问题,请参阅以下选项。
- 其他注册表故障排除主题包括:
- Azure support 选项
Microsoft Q&A - 开具支持票证