排查与虚拟网络外部终结点的连接问题

本文讨论如何排查从 Microsoft Azure Kubernetes 服务 (AKS) 群集连接到虚拟网络外部的终结点(即通过公共 Internet)的连接问题。

先决条件

  • Azure CLI

  • 客户端 URL (curl) 工具。

  • Kubernetes kubectl 工具或类似的工具连接到群集。 若要使用 Azure CLI 安装 kubectl,请运行 az aks install-cli 命令。

故障排除清单

问题是否持久?

步骤 1:执行基本故障排除

请确保可以连接到 Internet 上的公共终结点。 有关说明,请参阅 出站 AKS 群集连接的基本故障排除。

步骤 2:确定 AKS 群集的出站类型

若要标识 AKS 群集的出站类型,请运行 az aks show 命令:

az aks show --resource-group <resource_group> --name <cluster_name> --query "networkProfile.outboundType"

如果出站类型为 loadBalancer,则除非使用 kubenet 网络,否则没有路由表。 如果使用 kubenet,请确保默认路由表没有阻止出站 Internet 连接的其他配置。 如果使用其他网络(例如 Azure CNI、动态分配或 Azure CNI 覆盖),则默认情况下不会创建路由表。 在这种情况下,请确保 NSG(网络安全组)没有阻止出站 Internet 连接的自定义配置。

如果出站类型为 userDefinedRouting,请确保满足以下条件:

如果出站类型为 managedNATGateway,请运行 az network nat gateway show 命令,检查 AKS 子网是否与 NAT 网关相关联:

az network nat gateway show --resource-group <resource_group> --name <nat_gateway_name> --query "subnets[].id"

有关如何将 NAT 网关与 AKS 配合使用的详细信息,请参阅 托管 NAT 网关

步骤 3:连接到应用程序 Pod 时检查 curl 输出

curl 响应代码可以帮助你识别问题类型。 响应代码可用后,请尝试更好地了解问题的行为方式。 有关 HTTP 状态代码和问题的基础行为的详细信息,请参阅下表。

信源 链接。
Internet 分配号码机构 (IANA) 超文本传输协议 (HTTP) 状态代码注册表
Mozilla HTTP 响应状态代码
维基百科 HTTP 状态代码列表

以下 HTTP 状态代码可能指示列出的问题。

HTTP 状态代码 问题 示例
4xx
  1. 问题会影响客户端请求。
  2. 客户端和服务器之间存在网络阻止程序。
  1. 请求的页面不存在,或者客户端无权访问页面。
  2. 网络安全组或防火墙阻止了流量。
5xx 问题会影响服务器。 应用程序已关闭,或者网关不起作用。

可以使用 curl 尝试连接到应用程序终结点。 下面是一个示例命令和输出:

# 404 error code example
$ curl -vv <host IP address>/test.index

*   Trying <host IP address>:80...
* TCP_NODELAY set
* Connected to <host IP address> (<host IP address>) port 80 (#0)
> GET /test.index HTTP/1.1
> Host: <host IP address>
> User-Agent: curl/7.68.0
> Accept: */*
>
* Mark bundle as not supporting multiuse
< HTTP/1.1 404 Not Found
...
* Connection #0 to host <host IP address> left intact

步骤 4:检查出站流量暂时绕过虚拟设备会发生什么情况

若要快速测试以确定出口设备(虚拟设备)是否导致此问题,可以暂时允许所有流量通过 Internet。 若要配置此设置,可以改为更改通过虚拟设备的默认 IP 地址和端口路由 0.0.0.0/0 以通过 Internet。

如果流出设备在绕过虚拟设备时效果良好,请检查虚拟设备的日志以查看哪些数据包被拒绝,并相应地在虚拟设备中添加允许规则。

是否为间歇性问题?

出于多种原因,可能会遇到间歇性出站问题。 若要排查间歇性出站连接问题,请尝试以下步骤:

步骤 1:检查 Pod 或节点资源是否耗尽

运行以下命令来检查使用的资源量:

kubectl top pods
kubectl top nodes

步骤 2:检查操作系统磁盘是否大量使用

若要检查操作系统磁盘是否大量使用,请执行以下步骤:

  1. Azure 门户中,搜索并选择虚拟机规模集

  2. 在规模集列表中,选择用于 AKS 群集的规模集。

  3. 在规模集导航窗格中,转到 “监视 ”部分,然后选择“ 指标”。

  4. 通过查找以下字段,从 “指标 ”部分查看规模集的磁盘指标。

    字段
    范围 VMSS 名称
    指标命名空间 虚拟主机
    指标 OS 和数据磁盘指标

有关指标的详细信息,请参阅 OS 磁盘和数据磁盘指标

若要查看有关磁盘利用率的 AKS 建议,请执行以下步骤:

  1. Azure 门户中,搜索并选择 Kubernetes 服务

  2. 在 Kubernetes 服务列表中,选择 AKS 群集的名称。

  3. 在 AKS 群集导航窗格中,转到 “监视 ”部分,然后选择顾问 建议

  4. 查看有关磁盘使用情况的列出的建议。

如果 OS 磁盘大量使用,请考虑使用以下补救措施:

如果这些补救措施无法解决问题,请分析在磁盘上执行大量读/写操作的过程。 然后,检查是否可以将操作移动到数据磁盘而不是 OS 磁盘。

步骤 3:检查源网络地址转换端口是否耗尽

如果应用程序进行许多出站连接,它们可能会耗尽出站设备的 IP 地址上的可用端口数。 使用指标、警报和资源运行状况遵循标准负载均衡器诊断,以监视现有负载均衡器源网络地址转换(SNAT)端口使用情况和分配。 监视以验证或确定 SNAT 端口耗尽的风险

是否达到或超过分配的最大 SNAT 端口数? 在这种情况下,可以检查应用程序以确定它是否重用现有连接。 有关详细信息,请参阅 设计应用程序以高效使用连接。

如果认为应用程序配置正确,并且确实需要比默认分配端口数更多的 SNAT 端口,请执行以下步骤:

  1. 增加出口设备上的公共 IP 数。 如果出口设备是负载均衡器,则可增加负载均衡器上的公共 IP 地址数

  2. 增加 AKS 工作器节点的每节点端口数

第三方联系人免责声明

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

联系我们寻求帮助

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