排查您的网络负载均衡器问题 - Elastic Load Balancing

排查您的网络负载均衡器问题

以下信息可帮助您排查与网络负载均衡器相关的问题。

已注册目标未处于可用状态

如果目标进入 InService 状态所花费的时间超过预期,则该目标可能无法通过运行状况检查。您的目标未处于可用状态,除非通过一次运行状况检查。有关更多信息,请参阅 网络负载均衡器目标组的运行状况检查

验证您的实例是否通过运行状况检查,然后检查以下各项:

安全组不允许流量

与实例关联的安全组必须允许来自负载均衡器的使用运行状况检查端口和运行状况检查协议的流量。有关更多信息,请参阅 目标安全组。负载均衡器的安全组也必须允许流入实例的流量。有关更多信息,请参阅 更新网络负载均衡器的安全组

网络访问控制列表 (ACL) 不允许流量

与实例子网以及负载均衡器子网关联的网络 ACL 必须允许来自负载均衡器的流量和运行状况检查。有关更多信息,请参阅 网络 ACL

请求未路由至目标

检查以下各项:

安全组不允许流量

与实例相关联的安全组必须允许侦听器端口上来自客户端 IP 地址 (如果目标通过实例 ID 指定) 或负载均衡器节点 (如果目标通过 IP 地址指定) 的流量。有关更多信息,请参阅 目标安全组。负载均衡器的安全组也必须允许流入实例的流量。有关更多信息,请参阅 更新网络负载均衡器的安全组

网络访问控制列表 (ACL) 不允许流量

与 VPC 的子网关联的网络 ACL 必须允许负载均衡器和目标在侦听器端口上双向通信。有关更多信息,请参阅 网络 ACL

目标处于未启用的可用区中

如果您在可用区中注册目标但未启用该可用区,这些已注册目标将无法从负载均衡器接收流量。

实例位于对等的 VPC 中

如果您在与负载均衡器 VPC 对等的 VPC 中拥有实例,则必须通过 IP 地址而不是实例 ID 将这些实例注册到负载均衡器。

配置的服务器 ID 与目标上配置的 ID 不匹配

如果您使用的是 QUIC 侦听器,请确保在目标上配置的 ID 与在网络负载均衡器目标组中配置的 ID 相匹配。

目标接收比预期更多的运行状况检查请求

网络负载均衡器的运行状况检查是分布式的,使用共识机制来确定目标运行状况。因此,目标可以接收的运行状况检查数量可以超过通过 HealthCheckIntervalSeconds 设置配置的数量。

目标接收比预期更少的运行状况检查请求

检查是否启用了 net.ipv4.tcp_tw_recycle。已知此设置会导致负载均衡器出现问题。net.ipv4.tcp_tw_reuse 设置被认为是更安全的替代设置。

运行状况不佳的目标收到来自负载均衡器的请求

当所有注册的目标皆运行状况不佳时,就会发生这种情况。如果至少有一个运行正常的已注册目标,则网络负载均衡器仅将请求路由到运行正常的已注册目标。

如果只有运行状况不佳的已注册目标,则网络负载均衡器会将请求路由到所有已注册目标(即失效时开放模式)。当所有目标都运行状况不佳且相应的可用区没有运行正常的目标可供发送请求时,网络负载均衡器会执行此操作,而不是从 DNS 中删除所有 IP 地址。

由于主机标头不匹配,目标无法通过 HTTP 或 HTTPS 运行状况检查

运行状况检查请求中的 HTTP 主机标头包含负载均衡器节点和侦听器端口的 IP 地址,但不包含目标和运行状况检查端口的 IP 地址。如果要通过主机标头映射传入请求,则必须确保运行状况检查与任何 HTTP 主机标头匹配。另一种选择是在其他端口上添加单独的 HTTP 服务,并配置目标组,改为使用该端口进行运行状况检查。或者,可以考虑使用 TCP 运行状况检查。

无法将安全组与网络负载均衡器关联

如果创建网络负载均衡器时没有关联安全组,则在创建后将无法关联安全组。您只能在创建时将安全组与负载均衡器相关联,或将安全组与最初使用安全组创建的现有负载均衡器相关联。

无法删除所有安全组

如果创建网络负载均衡器时关联了安全组,则必须始终至少有一个与之关联的安全组。您不能从负载均衡器中同时删除所有安全组。

TCP_ELB_Reset_Count 指标升高

对于客户端通过网络负载均衡器发出的每个 TCP 请求,都将跟踪该连接的状态。如果客户端或目标通过连接发送数据的间隔超过空闲超时期限,则连接将关闭。如果客户端或目标在空闲超时期限后发送数据,则会收到一个 TCP RST 数据包,以指示连接不再有效。此外,如果目标运行不正常,除非运行不正常的目标触发了负载均衡器故障断开,否则负载均衡器会为关联到目标的客户端连接上收到的数据包发送 TCP RST。

如果您在 UnhealthyHostCount 指标升高之前或之时看到 TCP_ELB_Reset_Count 指标出现峰值,则可能是发送了 TCP RST 数据包,因为目标开始失败但尚未被标记为运行不良。如果您在 TCP_ELB_Reset_Count 中看到持续升高且目标未被标记为运行不良,则可以查看 VPC 流日志,以便客户端发送与过期流相关的数据。

从目标到其负载均衡器的请求连接超时

检查目标组是否启用了客户端 IP 保留。启用客户端 IP 保留后,不支持 NAT 环回(也称为发夹转换)。

如果实例是它注册到的负载均衡器的客户端,且它启用了客户端 IP 保留,则连接仅在请求路由到不同的实例时才会成功。如果请求路由到发送请求的同一个实例,连接会超时,因为源地址和目的地 IP 地址相同。请注意,这适用于在同一 EC2 Worker 节点实例中运行的 Amazon EKS 容器组(pod),即使它们的 IP 地址不同。

如果实例必须将请求发送到它注册到的负载均衡器,请执行下列操作之一:

  • 禁用客户端 IP 保留。建议改用代理协议 v2 来获取客户端 IP 地址。

  • 确保必须相互通信的容器位于不同的容器实例上。

当将目标移到网络负载均衡器时,性能会下降

经典负载均衡器和应用程序负载均衡器都使用多路复用连接,但网络负载均衡器不使用。因此,您的目标可能会在网络负载均衡器后面收到更多的 TCP 连接。请确保您的目标准备好处理它们可能会收到的连接请求量。

使用 PrivateLink 流量或禁用客户端 IP 保留时,网络负载均衡器支持到每个唯一目标(IP 地址和端口)的 5.5 万个并发连接或每分钟大约 5.5 万个连接。如果超过这些限制,则会增大出现端口分配错误的几率。您可以使用 PortAllocationErrorCount 指标来跟踪端口分配错误。您可以使用 ActiveFlowCount 指标来跟踪活跃的连接。有关更多信息,请参阅 网络负载均衡器的 CloudWatch 指标

要修复端口分配错误,我们建议您请将目标添加到目标组。

或者,如果您无法向目标组添加目标,则可以向负载平衡器网络接口最多添加 7 个辅助 IP 地址。辅助 IP 地址是从相应子网的 IPv4 CIDR 数据块中自动分配的。每个辅助 IP 地址消耗 6 个网络寻址单元。请注意,添加辅助 IP 地址后,您无法将其删除。释放辅助 IP 地址的唯一方法是删除负载均衡器。

TCP 连接建立间歇性失败或 TCP 连接建立延迟

启用“客户端 IP 地址保留”后,客户端可以使用相同的源临时端口连接到不同的目标 IP 地址。这些目标IP地址可以来自同一负载均衡器(位于不同可用区),前提是启用了跨区域负载均衡;或者来自不同的网络负载均衡器,但这些均衡器必须使用相同的注册目标 IP 地址和端口。在此情况下,如果这些连接被路由至相同的目标 IP 地址和端口,则目标将检测到重复连接,因为它们均来自相同的客户端 IP 地址和端口。在建立其中一个连接时,会导致连接错误和延迟。如果客户端前面有 NAT 设备,并且在同时连接到多个网络负载均衡器 IP 地址时分配相同的源 IP 地址和源端口,则经常发生这种情况。

您可以通过增加客户端或 NAT 设备分配的源临时端口的数量或增加负载均衡器的目标数来减少此类连接错误。我们建议客户端在连接失败后,进行重新连接时更改所使用的源端口。为了防止此类连接错误,如果您使用的是单个网络负载均衡器,则可以考虑禁用跨区域负载均衡,或者如果您使用的是多个网络负载均衡器,则可以考虑避免使用在多个目标组中注册的相同目标 IP 地址和端口。或者,您可以考虑禁用客户端 IP 保留。如果您需要客户端 IP,则可以使用代理协议 v2 进行检索。要了解有关代理协议 v2 的更多信息,请参阅 代理协议

预置负载均衡器时可能出现故障

网络负载均衡器在预置时可能失败的原因之一是您使用已在其他地方指定或分配的 IP 地址(例如,为 EC2 实例分配的辅助 IP 地址)。此 IP 地址阻止设置负载均衡器,其状态为 failed。您可以通过取消分配关联的 IP 地址并重试创建过程来解决此问题。

目标之间的流量分布不均匀

TCP 和 TLS 监侦听器负责路由 TCP 连接,而 UDP 侦听器则负责路由 UDP 流。负载均衡器使用流哈希算法来选择目标。来自客户端的单个连接本质上是粘性的。

如果您发现某些目标接收的流量似乎比其他目标要多,我们建议您查看 VPC 流日志。比较每个目标 IP 地址的唯一连接数。尽可能缩小时间窗口,因为目标注册、目标取消注册和运行状况不佳的目标会影响这些连接数。

以下是可能导致连接分配不均的情况:

  • 若初始目标数量较少,后续又注册了更多目标,则原始目标仍会保留与客户端的连接。对于 HTTP 工作负载,keepalive 可确保客户端重复使用连接。如果您降低 Web 应用程序的最大 keepalives 数,则客户端将更频繁地建立新连接。

  • 当启用“目标组粘性”时,若存在少量客户端且这些客户端通过具有单一源 IP 地址的 NAT 设备通信,则来自这些客户端的连接将被路由至同一目标。

  • 如果“跨区域负载均衡”处于禁用状态,且客户端优先选择来自某个负载均衡器区域的 IP 地址,则连接将在负载均衡器区域之间分配不均。

DNS 名称解析包含的 IP 地址少于已启用的可用区

理想情况下,可用区中至少有一台运行正常的主机时,网络负载均衡器会为每个已启用的可用区提供一个 IP 地址。特定可用区中没有运行正常的主机并且禁用了跨区域负载均衡时,系统将从 DNS 中删除此可用区的相应网络负载均衡器的 IP 地址。

例如,假设您的网络负载均衡器启用了三个可用区,则所有可用区都至少有一个运行正常的已注册目标实例。

  • 如果可用区 A 中的已注册目标实例运行状况不佳,则系统将从 DNS 中删除网络负载均衡器的可用区 A 的相应 IP 地址。

  • 如果任意两个已启用的可用区没有运行正常的已注册目标实例,则系统将从 DNS 中删除网络负载均衡器的相应两个 IP 地址。

  • 如果在所有已启用的可用区中没有运行正常的已注册目标实例,则系统会启用失效时开放模式,并且 DNS 将在结果中提供来自三个已启用可用区的所有 IP 地址。

IP 分段数据包不会路由到目标

网络负载均衡器不支持非 UDP 流量的 IP 分段数据包。

使用资源地图对运行状况不佳的目标进行故障排除

如果您的网络负载均衡器目标未通过运行状况检查,则可以使用资源地图查找运行状况不佳的目标并根据失败原因代码采取措施。有关更多信息,请参阅 查看网络负载均衡器资源地图

资源地图提供了两个视图:概述不正常目标地图。默认情况下,概览处于选中状态,并显示您的负载均衡器的所有资源。选择运行状况不佳的目标地图视图将仅显示与网络负载均衡器关联的每个目标组中运行状况不佳的目标。

注意

必须启用显示资源详细信息才能查看资源地图内所有适用资源的运行状况检查摘要和错误消息。如果未启用,您必须选择每个资源才能查看其详细信息。

目标组列显示每个目标组的正常目标和不正常目标的摘要。这样可以帮助确定是所有目标都未通过运行状况检查,还是只有特定目标失败。如果目标组中的所有目标都未通过运行状况检查,则请检查目标组的运行状况检查设置。选择目标组的名称,以在新选项卡中打开详细信息页面。

目标列显示每个目标的 TargetID 和当前运行状况检查状态。当目标运行状况不佳时,将显示运行状况检查失败的原因代码。当单个目标未通过运行状况检查时,请验证该目标是否有足够的资源。选择目标的 ID,以在新选项卡中打开详细信息页面。

选择导出后,您可以选择将网络负载均衡器资源地图的当前视图导出为 PDF。

验证您的实例是否未通过运行状况检查,然后根据失败原因代码检查以下问题:

  • 运行状况不佳:请求超时

    • 验证与您的目标和网络负载均衡器关联的安全组和网络访问控制列表(ACL)没有阻止连接。

    • 验证目标具有足够的可用容量来接受来自网络负载均衡器的连接。

    • 在每个目标的应用程序日志中,可以查看网络负载均衡器的运行状况检查响应。有关更多信息,请参阅运行状况检查原因代码

  • 运行状况不佳:FailedHealthChecks

    • 验证目标正在侦听运行状况检查端口上的流量。

      使用 TLS 侦听器时

      您选择用于前端连接的安全策略。用于后端连接的安全策略是根据正在使用的前端安全策略自动选择的。

      • 如果您的 TLS 侦听器对前端连接使用 TLS 1.3 安全策略,则 ELBSecurityPolicy-TLS13-1-0-2021-06 安全策略将用于后端连接。

      • 如果您的 TLS 侦听器没有对前端连接使用 TLS 1.3 安全策略,则 ELBSecurityPolicy-2016-08 安全策略将用于后端连接。

      有关更多信息,请参阅安全策略

    • 验证目标是否以安全策略指定的正确格式提供了服务器证书和密钥。

    • 验证目标是否支持一个或多个匹配的密码,以及网络负载均衡器提供的用于建立 TLS 握手的协议。