本文介绍如何解决尝试访问Azure 容器注册表拉取容器映像或项目时发生的 I/O 超时错误。
现象
看到以下错误消息:
请求映像配置时出错:在 attempts=6: dial tcp <storage-endpoint-ip-address>:443: i/o timeout 之后下载失败
原因 1:端口 443 在存储(数据)终结点上不可用
注意
不要假定错误消息中显示的存储终结点 IP 地址是请求操作期间始终使用的 IP 地址。 还涉及其他 IP 地址,必须相应地允许流量。 建议不要允许基于特定 IP 地址的流量。 这是因为 IP 地址是动态的,使用的 IP 地址列表会更改。 建议允许域 <storage-account-name>.blob.core.windows.net
。 或者,可以使用Azure 容器注册表数据终结点,并允许客户端网络规则中的这些数据终结点。 如果(仅当)没有任何其他选项,我们建议你允许基于 IP 地址的流量。
Azure 代表每个注册表在 Azure 存储 帐户中分配 blob 存储,以管理容器映像和其他项目的数据。 当客户端访问容器注册表中的映像层时,它会使用注册表提供的存储帐户终结点发出请求。
默认存储(数据)终结点的域名取决于是否使用 专用数据终结点,如下表所示。
正在使用的专用数据终结点? | 默认存储(数据)终结点的域名格式 |
---|---|
是 | <container-registry-name>.<region-name>.data.azurecr.io |
否 | <storage-account-name>.blob.core.windows.net |
若要在端口 443 上手动测试设备与存储(数据)终结点之间的连接,请运行 telnet 或 NetCat 命令。 如果使用专用数据终结点,请选择以下命令之一:
Telnet 命令:
telnet <container-registry-name>.<region-name>.data.azurecr.io 443
NetCat 命令:
nc -vz <container-registry-name>.<region-name>.data.azurecr.io 443
如果未使用专用数据终结点,请选择以下命令之一:
Telnet 命令:
telnet <storage-account-name>.blob.core.windows.net 443
NetCat 命令:
nc -vz <storage-account-name>.blob.core.windows.net 443
解决方案 1:使端口 443 可用于设备与存储(数据)终结点之间的通信
确保设备与存储(数据)终结点之间通过端口 443 建立网络连接。
如果设备是受限网络体系结构的一部分,请确保它通过端口 443 与存储(数据)终结点建立网络连接。 可以考虑检查潜在的现有防火墙、代理服务器、访问控制列表、Internet 服务提供商(ISP)限制等。
注意
存储(数据)终结点包括许多 IP 地址范围。 你必须允许所有这些,而不仅仅是一些。 可以允许所有 IP 地址范围或使用 服务标记。 例如,服务标记Storage
表示整个云的Azure 存储,但Storage.<region-name>
(例如Storage.WestUS
)将范围缩小到仅从命名区域的存储 IP 地址范围。
原因 2:与 VM 的 NIC 或子网关联的 NSG 阻止通信
如果使用 Azure 虚拟机(VM)从Azure 容器注册表拉取,网络安全组(NSG)可能会阻止设备和登录服务器之间的通信。 阻止 NSG 与 Azure VM 的网络适配器或子网相关联。
运行原因 1 中显示的 telnet 或 NetCat 命令。 如果命令输出显示发生超时,请检查 NSG 配置是否阻止存储帐户的 IP 地址。 为此,请按照下列步骤进行操作:
转到 Azure IP 范围和服务标记 – 公有云,然后选择“ 下载 ”按钮以 JSON 文件的形式下载服务标记列表。
在文本编辑器中打开下载的 JSON 文件,然后搜索
Storage.<region-name>
。 (将<region-name>
占位符替换为包含容器注册表的区域的名称,如BrazilSoutheast
.)选择允许在该区域中使用的 IP 地址。 (你将在步骤 6 中将此 IP 地址用作关联的存储(数据)终结点 IP 地址。
在“网络观察程序”菜单窗格中,选择“网络诊断工具>NSG 诊断”。
在网络观察程序 |NSG 诊断页,按照下表中的说明完成表单。
字段 操作 目标资源类型 在 列表中选择虚拟机 。 虚拟机 在列表中选择 Azure VM 的名称。 协议 在 列表中选择 TCP 。 方向 选择“ 出站 ”选项。 源类型 在 列表中选择 IPv4 地址/CIDR 。 IPv4 地址/CIDR 输入 Azure VM 的 IP 地址。 目标 IP 地址 输入在步骤 3 中选择的关联存储(数据)终结点 IP 地址。 目标端口 输入 443。 选择“运行 NSG 诊断”按钮。
在“结果”框中,选中“流量状态”字段的值。
“流量状态”字段可以具有“允许”或“拒绝”的值。 “被拒绝”状态表示 NSG 正在阻止 Azure VM 与所选关联的存储(数据)终结点 IP 地址之间的流量。 在这种情况下,阻止 NSG 的名称也会显示在 “结果 ”框中。 在结果表中,找到相应应用操作列值为 Deny 的行的 NSG 名称列。
注意
此过程可以更好地评估导致此问题的原因,但仍然不完整。 Thsi 是因为它指示使用关联区域中Azure 存储的单个 IP 地址来测试连接。 但是,由于存储(数据)终结点必须允许访问许多 IP 地址范围,因此对单个 IP 地址的成功测试并不意味着所有 IP 地址范围的通信都成功。
解决方案 2:修改 NSG 配置以允许 VM 与关联的存储(数据)终结点之间的连接
在 NSG 级别进行更改,以便在 Azure VM 与关联的存储(数据)终结点(所有 IP 地址范围或关联的服务标记)之间的端口 443 上允许连接。 具体而言,请确保满足以下条件。
条件 | 详细信息 |
---|---|
路由表不会将流量丢弃到存储(数据)终结点。 如果下一跃点设置为 “无 ”,则会删除与存储(数据)终结点关联的路由的流量。 | 虚拟网络流量路由 |
如果路由表将流量发送到虚拟设备(例如与 Azure VM 子网关联的防火墙),请确保防火墙不会阻止发往端口 443 上的存储(数据)终结点的流量。 | 配置规则以访问防火墙后的 Azure 容器注册表 |
联系我们寻求帮助
如果你有任何疑问或需要帮助,请创建支持请求或联系 Azure 社区支持。 你还可以将产品反馈提交到 Azure 反馈社区。