内部 TCP/UDP 负载平衡问题排查

本指南介绍如何排查 Google Cloud 内部 TCP/UDP 负载平衡器的配置问题。

概览

本指南中讨论的问题类型包括:

  • 常规连接问题
  • 后端故障转移问题
  • 负载平衡器作为下一个跃点的问题

准备工作

在调查问题之前,请先熟悉以下页面。

关于常规连接:

关于故障转移:

关于下一个跃点:

排查常规连接问题

  • 具体情况:我无法从其他区域的虚拟机客户端连接到我的内部 TCP/UDP 负载平衡器。
  • 原因:未启用全球访问

如果您无法连接到内部 TCP/UDP 负载平衡器,请检查以下问题:

  • 确保定义了入站允许防火墙规则,以便允许对后端虚拟机进行运行状况检查。
  • 确保入站允许防火墙规则允许来自客户端的流量流向后端虚拟机。
  • 确保连接到负载平衡器的客户端与负载平衡器位于同一区域。如果客户端位于其他区域,请确保已启用全球访问。
  • 如需验证运行状况检查流量是否已到达后端虚拟机,请启用运行状况检查日志记录并搜索成功的日志条目。

  • 具体情况:我无法通过内部 TCP/UDP 负载平衡器连接到我的服务,但我可以直接连接到后端虚拟机。

  • 原因客机环境没有在运行,或者无法与元数据服务器通信 (metadata.google.internal169.254.169.254)。

检查以下内容:

  • 确保后端虚拟机上已安装并运行客机环境
  • 确保后端虚拟机客机操作系统中的防火墙规则(iptables、Windows 防火墙)不屏蔽对元数据服务器的访问。
  • 确保后端虚拟机上的服务正在侦听负载平衡器的转发规则对应的 IP 地址。

排查共享 VPC 问题

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

排查故障转移问题

如果已为内部 TCP/UDP 负载平衡器配置了故障转移,则以下部分介绍可能出现的问题。

连接

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

托管实例组和故障转移问题

  • 具体情况:活跃池在主后端和故障转移后端之间来回切换(波动)。
  • 可能的原因:如果将托管实例组与自动扩缩和故障转移搭配使用,可能导致活跃池在主后端和故障转移后端之间反复进行故障转移和故障恢复。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 何时执行故障转移和故障恢复。检查负载平衡器的配置:

    • 使用 Cloud Console 查看各后端实例组中正常运行的后端虚拟机的数量。Cloud Console 还会显示活跃池中的虚拟机。

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

在故障转移或故障恢复期间终止现有连接

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

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

如果将内部 TCP/UDP 负载平衡器设置为自定义静态路由的下一个跃点,可能会出现以下问题:

连接

  • 如果无法对后端执行 ping 操作,请注意,只有 TCP 和 UDP 流量才支持将内部 TCP/UDP 负载平衡器设置为下一个跃点的路由。负载平衡器会忽略其他协议数据包(如 ICMP)。如需了解详情,请参阅TCP、UDP 和其他协议流量

  • 当使用内部 TCP/UDP 负载平衡器作为自定义静态路由的下一个跃点时,无论针对负载平衡器的内部后端服务配置的协议如何,也无论负载平衡器的内部转发规则上配置的端口为何,所有 TCP 和 UDP 流量都会传送到负载平衡器运行正常的后端虚拟机。

  • 确保您已创建入站允许防火墙规则,以便正确识别应通过自定义静态路由的下一个跃点传送到后端虚拟机的流量来源。到达后端虚拟机的数据包会保留它们的源 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 路由选择。

不支持网络标记

如果下一个跃点是内部 TCP/UDP 负载平衡器,则您无法为自定义静态路由分配网络标记。例如,以下 gcloud 命令会生成下列错误消息:

$ gcloud compute routes create example-route \
--destination-range=0.0.0.0/0 \
--next-hop-ilb=internal-lb-forwarding-rule \
--tags='my_tag'

ERROR: (gcloud.compute.routes.create) Could not fetch resource:
 - Invalid value for field 'resource.tags': ''. Tag is not supported for routes
 with next hop ilb.

后续步骤