排查与虚拟网络外部终结点的连接问题
本文讨论如何排查从 Microsoft Azure Kubernetes 服务 (AKS) 群集连接到虚拟网络外部的终结点(即通过公共 Internet)的连接问题。
先决条件
客户端 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
,请确保满足以下条件:
可以访问出口设备(防火墙或代理)。
出口设备允许 来自群集的所需出站流量 。
若要获取 AKS 群集允许的 FQDN 列表,请运行 az aks egress-endpoints list 命令:
az aks egress-endpoints list --resource-group <resource_group> --name <cluster_name>
如果出站类型为 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 |
|
|
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:检查操作系统磁盘是否大量使用
若要检查操作系统磁盘是否大量使用,请执行以下步骤:
在Azure 门户中,搜索并选择虚拟机规模集。
在规模集列表中,选择用于 AKS 群集的规模集。
在规模集导航窗格中,转到 “监视 ”部分,然后选择“ 指标”。
通过查找以下字段,从 “指标 ”部分查看规模集的磁盘指标。
字段 值 范围 VMSS 名称 指标命名空间 虚拟主机 指标 OS 和数据磁盘指标
有关指标的详细信息,请参阅 OS 磁盘和数据磁盘指标。
若要查看有关磁盘利用率的 AKS 建议,请执行以下步骤:
在Azure 门户中,搜索并选择 Kubernetes 服务。
在 Kubernetes 服务列表中,选择 AKS 群集的名称。
在 AKS 群集导航窗格中,转到 “监视 ”部分,然后选择顾问 建议。
查看有关磁盘使用情况的列出的建议。
如果 OS 磁盘大量使用,请考虑使用以下补救措施:
增加 OS 磁盘大小。
切换到 临时 OS 磁盘。
如果这些补救措施无法解决问题,请分析在磁盘上执行大量读/写操作的过程。 然后,检查是否可以将操作移动到数据磁盘而不是 OS 磁盘。
步骤 3:检查源网络地址转换端口是否耗尽
如果应用程序进行许多出站连接,它们可能会耗尽出站设备的 IP 地址上的可用端口数。 使用指标、警报和资源运行状况遵循标准负载均衡器诊断,以监视现有负载均衡器源网络地址转换(SNAT)端口的使用情况和分配。 监视以验证或确定 SNAT 端口耗尽的风险。
是否达到或超过分配的最大 SNAT 端口数? 在这种情况下,可以检查应用程序以确定它是否重用现有连接。 有关详细信息,请参阅 设计应用程序以高效使用连接。
如果认为应用程序配置正确,并且确实需要比默认分配端口数更多的 SNAT 端口,请执行以下步骤:
增加出口设备上的公共 IP 数。 如果出口设备是负载均衡器,则可增加负载均衡器上的公共 IP 地址数。
第三方联系人免责声明
Microsoft 会提供第三方联系信息来帮助你查找有关本主题的其他信息。 此联系信息可能会更改,恕不另行通知。 Microsoft 不保证第三方联系信息的准确性。
联系我们寻求帮助
如果你有任何疑问或需要帮助,请创建支持请求或联系 Azure 社区支持。 你还可以将产品反馈提交到 Azure 反馈社区。