排查内部直通网络负载均衡器的问题

本指南介绍如何排查 Google Cloud 内部直通网络负载均衡器的配置问题。在调查问题之前,请先熟悉以下页面。

排查网络分析器的常见问题

网络分析器会自动监控您的 VPC 网络配置,并检测欠佳配置和错误配置。它可识别网络故障,提供根本原因信息,并建议可能的解决方法。如需了解网络分析器可自动检测到的不同错误配置场景,请参阅网络分析器文档中的负载均衡器数据分析

网络分析器在 Google Cloud 控制台中作为 Network Intelligence Center 的一部分提供。

进入网络分析器

后端具有不兼容的均衡模式

创建负载均衡器时,您可能会看到以下错误:

Validation failed for instance group INSTANCE_GROUP:

backend services 1 and 2 point to the same instance group
but the backends have incompatible balancing_mode. Values should be the same.

如果您尝试在两个不同的负载均衡器中使用同一后端,并且该后端没有兼容的均衡模式,则会发生此错误。

详情请参阅以下内容:

排查常规连接问题

如果您无法连接到内部直通网络负载均衡器,请检查以下常见问题。

验证防火墙规则

  • 确保定义了入站允许防火墙规则,以便允许对后端虚拟机进行健康检查。
  • 确保入站流量允许防火墙规则允许来自客户端的流量流向后端虚拟机。
  • 确保存在相关防火墙规则,以允许流量到达负载均衡器正在使用的端口上的后端虚拟机。
  • 如果您要对防火墙规则使用目标标记,请确保正确标记负载均衡器的后端虚拟机。

如需了解如何配置内部直通网络负载均衡器所需的防火墙规则,请参阅配置防火墙规则

验证访客环境是否在后端虚拟机上运行

如果您可以连接到运行状况良好的后端虚拟机,但无法连接到负载均衡器,则可能是因为客机环境(以前称为 Windows 客机环境或 Linux 客机环境)当前未运行或无法与元数据服务器(metadata.google.internal169.254.169.254)通信。

检查以下内容:

  • 确保后端虚拟机上已安装并运行客机环境。
  • 确保后端虚拟机客机操作系统中的防火墙规则(iptables 或 Windows 防火墙)不阻止对元数据服务器的访问。

验证后端虚拟机是否接受发送到负载均衡器的数据包

每个后端虚拟机都必须配置为接受发送到负载均衡器的数据包。也就是说,传送到后端虚拟机的数据包的目标是负载均衡器的 IP 地址。在大多数情况下,这通过本地路由来实现。

对于通过 Google Cloud 映像创建的虚拟机,访客代理会安装负载均衡器的 IP 地址的本地路由。基于 Container-Optimized OS 的 Google Kubernetes Engine 实例使用 iptables 来实现此功能。

在 Linux 后端虚拟机上,您可以通过运行以下命令来验证本地路由是否存在。将 LOAD_BALANCER_IP 替换为负载均衡器的 IP 地址。

sudo ip route list table local | grep LOAD_BALANCER_IP

验证后端虚拟机上的服务 IP 地址和端口绑定

发送到内部直通网络负载均衡器的数据包到达具有负载均衡器本身的目标 IP 地址的后端虚拟机。这种类型的负载均衡器不是代理,这是一种正常的行为。

在后端虚拟机上运行的软件必须执行以下操作:

  • 监听(绑定到)负载均衡器的 IP 地址或任意 IP 地址(0.0.0.0::
  • 侦听(绑定到)负载均衡器的转发规则中包含的端口

如需对此进行测试,请使用 SSH 或 RDP 连接到后端虚拟机。然后,使用 curltelnet 或类似工具执行以下测试:

  • 尝试通过后端虚拟机本身(即 127.0.0.1 或 localhost)的内部 IP 地址与服务联系。
  • 尝试通过负载均衡器转发规则的 IP 地址与服务联系。

检查客户端虚拟机是否与负载均衡器位于同一区域

如果连接到负载均衡器的客户端位于其他区域,请确保已启用全球访问权限

验证健康检查流量是否可以到达后端虚拟机

如需验证健康检查流量是否已到达后端虚拟机,请启用健康检查日志记录并搜索成功的日志条目。

您还可以通过查看后端的“运行状况良好”状态来验证负载均衡器功能是否正常。

如果后端中没有运行状况良好的实例,请确保配置了适当的健康检查,并且后端中的每个虚拟机都在侦听已配置的健康检查端口。

从同一 VPC 网络中的客户端运行以下命令,验证后端虚拟机是否正在侦听特定 TCP 端口:

telnet SERVER_IP_ADDRESS PORT

替换以下内容:

  • SERVER_IP_ADDRESS:后端虚拟机的 IP 地址。
  • PORT:您为健康检查配置的端口。 默认情况下,健康检查端口为 80

或者,您可以使用 SSH 连接后端虚拟机并运行以下命令:

curl localhost:PORT

同样,将 PORT 替换为您为健康检查配置的端口。

执行此测试的另一种方法是运行以下命令:

netstat -npal | grep LISTEN

在输出中,检查以下内容:

  • <var>LB_IP_ADDRESS</var>:<var>PORT</var>
  • 0.0.0.0:<var>PORT</var>
  • :::<var>PORT</var>

该测试无法确定路由是否已正确设置以便能够响应负载均衡器的 IP 地址。这是一个具有类似症状的单独问题。对于路由,请运行 ip route list table local 命令并验证负载均衡器的 IP 地址是否已列出,如验证后端虚拟机是否接受发送到负载均衡器的数据包中所述。

性能问题排查

如果您遇到性能问题并且延迟时间有所增加,请检查以下常见问题。

验证服务器功能

如果所有后端服务器都响应健康检查,请验证来自客户端的请求在服务器上直接发出时是否正常运行。例如,如果客户端通过负载均衡器向服务器发送 HTTP 请求,并且没有响应,或者响应速度比正常速度慢得多,请在每个后端服务器上发出同一 HTTP 请求并观察行为。

如果从服务器本身发出请求时,任何单个后端服务器都未正常运作,则您可以确定服务器应用栈未正常运行。您可以将进一步问题排查的重点放在应用本身。如果所有服务器都正常运作,下一步是查看客户端和网络。

验证网络连接和延迟时间

如果所有后端服务器都正确响应请求,请验证网络延迟时间。从客户端虚拟机向每个服务器持续发出 ping 命令,如下所示:

ping SERVER_IP_ADDRESS

此测试会显示内置网络延迟时间,以及网络是否存在丢包问题。在某些情况下,防火墙规则可能会阻止 ICMP 流量。如果是这样,此测试将无法生成任何结果。请向您的防火墙规则管理员验证是否属于这种情况。

如果 ping 命令显示的延迟时间比正常时间长很多或者丢包现象严重,请创建 Google Cloud 支持请求以进行进一步调查。

确定有问题的客户端-服务器组合

如果网络 ping 测试显示延迟时间较短并且没有丢包现象,则下一步是确定哪个特定客户端-服务器组合(如果有)会产生有问题的结果。为此,您可以将后端服务器数量减少一半,直到服务器数量达到 1,同时重现有问题的行为(例如,长延迟时间或无响应)。

如果您确定一个或多个有问题的客户端-服务器组合,请执行流量捕获和分析

如果未确定有问题的客户端-服务器组合,请跳到性能测试

执行流量捕获和分析

如果您确定具体有问题的客户端-服务器组合,则可以使用数据包捕获来找出导致延迟或中断的通信部分。数据包捕获可以通过 tcpdump 完成,具体操作如下所示:

  1. 在服务器上安装 tcpdump。
  2. 在服务器上启动 tcpdump 捕获。
  3. 从客户端发出示例请求,如下所示:

    curl URL
    
  4. 分析 tcpdump 输出以确定问题。

进行性能测试

如果您未确定任何有问题的客户端-服务器组合,并且所有客户端和服务器的总体性能低于预期,请考虑以下测试:

  1. 一个客户端和一个服务器,不带负载均衡。
  2. 一个客户端和一个服务器,具有负载均衡。

    结果:测试 [1] 和 [2] 的结果组合可确定负载均衡器是否导致问题。

  3. 一个客户端和多个服务器,具有负载均衡。

    结果:确定一个客户端的性能限制。

  4. 多个客户端和一个服务器,具有负载均衡。

    结果:确定一个服务器的性能限制。

  5. 多个客户端和多个服务器,不带负载均衡。

    结果:确定网络的性能限制。

在多个客户端和服务器上运行压力测试时,客户端或服务器资源(CPU、内存、I/O)可能会成为瓶颈,并减少聚合结果。即使每个客户端和服务器都正常运行,也可能出现聚合结果降级的情况。

排查共享 VPC 问题

如果您使用的是共享 VPC,并且无法在特定子网中创建新的内部直通网络负载均衡器,则原因可能在于组织政策。在组织政策中,将该子网添加到允许的子网列表中,或与组织管理员联系。如需了解详情,请参阅 constraints/compute.restrictSharedVpcSubnetworks 限制条件。

排查故障切换问题

如果已为内部直通网络负载均衡器配置了故障切换,则以下部分介绍可能出现的问题。

连接

  • 请务必指定至少一个故障切换后端。
  • 验证您的故障切换政策设置:
    • 故障切换比率
    • 当所有后端虚拟机运行状况都不佳时舍弃流量
    • 在进行故障切换时停用连接排空

托管实例组和故障切换问题

  • 具体情况:活跃池在主后端和故障切换后端之间来回切换(波动)。
  • 可能的原因:如果将托管实例组与自动扩缩和故障切换搭配使用,可能导致活跃池在主后端和故障切换后端之间反复进行故障切换和故障恢复。Google Cloud 不会阻止您使用托管实例组配置故障切换,因为您的部署可能会受益于此设置。

为故障切换组停用连接排空限制

只有在使用协议 TCP 设置后端服务时,停用连接排空才会生效。

如果在停用连接排空的情况下使用 UDP 创建后端服务,则会显示以下错误消息:

gcloud compute backend-services create my-failover-bs \
    --global-health-checks \
    --load-balancing-scheme=internal \
    --health-checks=my-tcp-health-check \
    --region=us-central1 \
    --no-connection-drain-on-failover \
    --drop-traffic-if-unhealthy \
    --failover-ratio=0.5 \
    --protocol=UDP
ERROR: (gcloud.compute.backend-services.create) Invalid value for
[--protocol]: can only specify --connection-drain-on-failover if the protocol is
TCP.

流量误发到其他后端虚拟机

首先检查以下内容:如果客户端虚拟机也是负载均衡器的后端虚拟机,则后端虚拟机本身始终应答发送到负载均衡器的转发规则的 IP 地址的连接。如需了解详情,请参阅测试来自单个客户端的连接从负载均衡虚拟机发送请求

如果客户端虚拟机不是负载均衡器的后端虚拟机,请执行以下操作:

  • 对于来自单个客户端的请求,请参阅测试来自单个客户端的连接以了解此方法的限制。

  • 请确保您已配置流量允许防火墙规则以允许执行健康检查

  • 对于故障切换配置,请务必了解活跃池中的成员身份以及 Google Cloud 何时执行故障切换和故障恢复。检查负载均衡器的配置:

    • 使用 Google Cloud 控制台检查各后端实例组中健康状况良好的后端虚拟机的数量。Google Cloud 控制台还会显示活跃池中的虚拟机。

    • 请务必正确设置负载均衡器的故障切换比率。例如,如果您有 10 个主要虚拟机且故障切换比率设置为 0.2,这表示 Google Cloud 会在正常运行的主要虚拟机数量小于两个 (10 × 0.2 = 2) 时执行故障切换。故障切换比率 0.0 具有特殊含义:Google Cloud 会在所有主要虚拟机均健康状况不佳时执行故障切换。

在故障切换或故障恢复期间终止现有连接

修改您的后端服务的故障切换政策。确保在故障切换时启用连接排空。

排查负载均衡器作为下一个跃点的问题

如果将内部直通网络负载均衡器设置为自定义静态路由的下一个跃点,可能会出现以下问题:

连接问题

  • 如果对路由的目标范围中下一个跃点是内部直通网络负载均衡器的转发规则的 IP 地址无法进行 ping 操作,请注意,使用此类下一个跃点的路由可能无法处理 ICMP 流量,具体取决于路由的创建时间。如果路由是在 2021 年 5 月 15 日之前创建的,则它仅会处理 2021 年 8 月 16 日之前的 TCP 和 UDP 流量。从 2021 年 8 月 16 日开始,无论路由是何时创建的,所有路由都将自动转发所有协议流量(TCP、UDP 和 ICMP)。如果您不想等到那个时候,则可以通过创建新路由并删除旧路由来立即启用 ping 功能。

  • 当使用内部直通网络负载均衡器作为自定义静态路由的下一个跃点时,无论为负载均衡器的内部后端服务配置什么协议,也无论在负载均衡器内部转发规则上配置的端口为何,所有流量都会传送到负载均衡器的运行状况良好的后端虚拟机。

  • 确保您已创建入站允许防火墙规则,以便正确识别应通过自定义静态路由的下一个跃点传送到后端虚拟机的流量来源。到达后端虚拟机的数据包会保留它们的源 IP 地址,即使通过自定义静态路由传送也是如此。

目标范围的值无效

自定义静态路由的目标范围不能比 VPC 网络中的任何子网路由更具体。如果您在创建自定义静态路由时收到以下错误消息:

Invalid value for field 'resource.destRange': [ROUTE_DESTINATION].
[ROUTE_DESTINATION] hides the address space of the network .... Cannot change
the routing of packets destined for the network.
  • 您创建的自定义静态路由的目标不能与子网路由的目标完全一致,也不能比它更具体(具有更长的掩码)。如需了解详情,请参阅适用范围和顺序

  • 如果数据包误传送到其他目标,请移除您的 VPC 网络中目标更具体的其他路由。请参阅路由顺序,了解 Google Cloud 路由选择。

排查日志记录问题

如果您为内部直通网络负载均衡器配置日志记录功能,则可能会出现以下问题:

  • 如果没有获取足够的数据包作为样本来捕获 RTT,则某些日志中可能缺少 RTT 测量(如字节值)。在低容量连接中发生这种情况的几率更高。
  • RTT 值仅适用于 TCP 流。
  • 发送的某些数据包没有负载。如果抽样的是仅有标头的数据包,则字节值为 0

后续步骤