排查 OutboundConnFailVMExtensionError 错误代码 (50) 的问题

本文介绍如何识别和解决 OutboundConnFailVMExtensionError 在创建、启动、缩放或升级Microsoft Azure Kubernetes 服务 (AKS) 群集时可能发生的错误(也称为错误代码 ERR_OUTBOUND_CONN_FAIL、错误号 50)。

Prerequisites

  • Netcat (nc) 命令行工具

  • 挖掘命令行工具

  • 客户端 URL (cURL) 工具

Symptoms

尝试创建、缩放或升级 AKS 群集时,可能会收到以下错误消息:

无法从代理建立出站连接,有关详细信息,请参阅 https://aka.ms/aks-required-ports-and-addresses

详细信息:Code=“VMExtensionProvisioningError”

Message=“VM 在处理扩展”vmssCSE“时报告了失败。

错误消息:“启用失败:无法执行命令:以退出状态终止的命令=50\n[stdout]\n\n[stderr]\nnc: 连接到 mcr.microsoft.com 端口 443 (tcp) 失败:连接超时\nCommand 以非零状态退出

错误详细信息:“vmssCSE 错误消息: {vmssCSE exit status=50, output=pt/apt.conf.d/95proxy...}

此错误还可能导致正在运行的节点变为 NotReady,或导致镜像拉取失败,因为群集中的部分或全部节点的出站连接被阻止。

Cause

用于下载预配节点所需组件的自定义脚本扩展无法建立必要的出站连接来获取包。 对于公共群集,节点尝试在端口 443 上与Microsoft容器注册表(MCR)终结点(mcr.microsoft.comMCR)通信。

出站流量可能被阻止的原因有很多。 排查出站连接失败的最佳方法是使用 Azure 虚拟网络验证程序(预览版)运行连接分析。 通过运行连接分析,可以将流量流中的跃点和阻止流量的 Azure 网络资源中的任何错误配置可视化。 若要手动排查出站连接故障,可以使用安全外壳协议(SSH)连接到节点。 本部分介绍两种类型的调查说明:

检查 Azure 网络资源是否阻止发到终结点的流量

若要确定流量是否由于 Azure 网络资源而被阻止到终结点,请使用 Azure 虚拟网络验证程序(预览版) 工具从 AKS 群集节点运行从 AKS 群集节点到终结点的连接分析。 连接分析涵盖以下资源:

  • Azure Load Balancer
  • Azure 防火墙
  • 网络地址转换 (NAT) 网关
  • 网络安全组 (NSG)
  • 网络策略
  • 用户定义的路由(路由表)
  • 虚拟网络对等互连

Note

Azure 虚拟网络验证程序(预览版)无法访问任何外部或第三方网络资源,例如自定义防火墙。 如果连接分析未检测到任何阻止的流量,建议对任何外部网络执行手动检查,以覆盖流量流中的所有跃点。

目前,此功能不支持使用 Azure CNI 覆盖的群集。 计划于 2025 年 8 月实现支持 CNI Overlay。

  1. 请在 Azure 门户中进入您的集群。 在边栏中,导航到“设置 -> 节点池”页面。
  2. 标识要从中运行连接分析的节点池。 单击节点池以将其选为范围。
  3. 从页面顶部的工具栏中选择“连接分析(预览版)。 如果未看到它,请单击三个点“...”在页面顶部的工具栏中打开展开的菜单。 用户在所选节点池上运行连接分析。
  4. 选择虚拟机规模集(VMSS)实例作为源。 源 IP 地址会自动填充。
  5. 选择公共域名/终结点作为分析的目标,一个示例是 mcr.microsoft.com。 目标 IP 地址也会自动填充。
  6. 运行分析并等待最多 2 分钟的结果。 在生成的关系图中,标识关联的 Azure 网络资源以及流量被阻止的位置。 若要查看详细的分析输出,请单击“JSON 输出”选项卡或单击关系图中的箭头。

手动故障排除

如果 Azure 虚拟网络验证程序(预览版)工具无法充分了解问题,则可以使用安全外壳协议(SSH)手动排查出站连接失败问题,以连接到节点。 若要建立连接,请按照连接到 Azure Kubernetes 服务 (AKS) 群集节点中的说明进行维护或故障排除。 然后,按照以下步骤测试群集上的连接:

  1. 连接到节点后,运行nc命令:dig

    nc -vz mcr.microsoft.com 443 
    dig mcr.microsoft.com 443
    

    Note

    如果无法通过 SSH 访问节点,可以通过针对虚拟机规模集实例运行 az vmss run-command invoke 命令来测试出站连接:

    # Get the VMSS instance IDs.
    az vmss list-instances --resource-group <mc-resource-group-name> \
        --name <vmss-name> \
        --output table
    
    # Use an instance ID to test outbound connectivity.
    az vmss run-command invoke --resource-group <mc-resource-group-name> \
        --name <vmss-name> \
        --command-id RunShellScript \
        --instance-id <vmss-instance-id> \
        --output json \
        --scripts "nc -vz mcr.microsoft.com 443"
    
  2. 如果尝试使用 HTTP 代理创建 AKS 群集,请在连接到节点后运行nccurldig命令:

    # Test connectivity to the HTTP proxy server from the AKS node.
    nc -vz <http-s-proxy-address> <port>
    
    # Test traffic from the HTTP proxy server to HTTPS.
    curl --proxy http://<http-proxy-address>:<port>/ --head https://mcr.microsoft.com
    
    # Test traffic from the HTTPS proxy server to HTTPS.
    curl --proxy https://<https-proxy-address>:<port>/ --head https://mcr.microsoft.com
    
    # Test DNS functionality.
    dig mcr.microsoft.com 443
    

    Note

    如果无法通过 SSH 访问节点,可以通过对虚拟机规模集实例运行 az vmss run-command invoke 命令来测试出站连接:

    # Get the VMSS instance IDs.
    az vmss list-instances --resource-group <mc-resource-group-name> \
        --name <vmss-name> \
        --output table
    
    # Use an instance ID to test connectivity from the HTTP proxy server to HTTPS.
    az vmss run-command invoke --resource-group <mc-resource-group-name> \
        --name <vmss-name> \
        --command-id RunShellScript \
        --instance-id <vmss-instance-id> \
        --output json \
        --scripts "curl --proxy http://<http-proxy-address>:<port>/ --head https://mcr.microsoft.com"
    
    # Use an instance ID to test connectivity from the HTTPS proxy server to HTTPS.
    az vmss run-command invoke --resource-group <mc-resource-group-name> \
        --name <vmss-name> \
        --command-id RunShellScript \
        --instance-id <vmss-instance-id> \
        --output json \
        --scripts "curl --proxy https://<https-proxy-address>:<port>/ --head https://mcr.microsoft.com"
    
    # Use an instance ID to test DNS functionality.
    az vmss run-command invoke --resource-group <mc-resource-group-name> \
        --name <vmss-name> \
        --command-id RunShellScript \
        --instance-id <vmss-instance-id> \
        --output json \
        --scripts "dig mcr.microsoft.com 443"
    

Solution

下表列出了可能阻止流量的具体原因,以及每个原因对应的解决方案:

Issue Solution
防火墙规则、代理服务器或网络安全组(NSG)阻止流量 当防火墙、代理服务器或 NSG 阻止 AKS 所需的端口或完全限定的域名(FQDN)时,会出现此问题。 确保允许这些端口和 FQDN。 若要确定阻止的内容,请检查上一 “原因 ”部分中提供的连接。 有关 AKS 所需端口和 FQDN 的详细信息,请参阅 Azure Kubernetes 服务 (AKS) 群集的出站网络和 FQDN 规则。
AAAA (IPv6) 记录在防火墙上被阻止 在防火墙上,验证是否存在任何阻止终结点在 Azure DNS 中解析的问题。
专用群集无法解析内部 Azure 资源 在专用群集中,如果使用自定义 DNS,则必须将 Azure DNS IP 地址 (168.63.129.16) 添加为上游 DNS 服务器。 验证是否已在 DNS 服务器上设置地址。 有关详细信息,请参阅 创建专用 AKS 群集什么是 IP 地址 168.63.129.16?

详细信息

第三方联系人免责声明

Microsoft 会提供第三方联系信息来帮助你查找有关本主题的其他信息。 此联系信息可能会更改,恕不另行通知。 Microsoft 不保证第三方联系信息的准确性。

联系我们寻求帮助

如果你有任何疑问或需要帮助,请创建支持请求联系 Azure 社区支持。 你还可以将产品反馈提交到 Azure 反馈社区