基于目标池的外部 TCP/UDP 网络负载平衡概览

Google Cloud 外部 TCP/UDP 网络负载平衡(此后称为网络负载平衡)是地区级的非代理负载平衡器。

网络负载平衡在 Virtual Private Cloud (VPC) 网络内同一个地区中的后端虚拟机 (VM) 实例之间分配 TCP 和 UDP 流量。网络负载平衡器可以接收以下任何一种流量:

  • 互联网上的任何客户端
  • 具有外部 IP 的 Google Cloud 虚拟机
  • 可通过 Cloud NAT 或基于实例的 NAT 访问互联网的 Google Cloud 虚拟机

根据转发规则配置,每个基于目标池的网络负载平衡器都支持以下协议流量类型之一:

  • TCP
  • UDP
  • TCP 和 UDP

网络负载平衡器按地区划分范围,而非全球范围。这意味着网络负载平衡器的所有后端实例必须位于同一区域。您可以将后端置于该区域的任何可用区中。

网络负载平衡器支持所有端口。您可以使用网络负载平衡对 TCP 和 UDP 流量进行负载平衡。由于负载平衡器是直通负载平衡器,因此您的后端会终止负载平衡的 TCP 连接或 UDP 数据包本身。例如,您可以在后端运行 HTTPS Web 服务器,并使用网络负载平衡将请求路由到该服务器,从而终止后端本身上的 TLS。

如果要在 GKE 中构建应用,我们建议您使用内置的 GKE 服务控制器,该控制器代表 GKE 用户部署 Google Cloud 负载平衡器。这与独立负载平衡架构相同,只不过其生命周期完全由 GKE 完全自动化并进行控制。 如需了解详情,请参阅使用服务公开应用

架构

负载平衡器由多个配置组件组成。单个负载平衡器可能具有以下各项:

网络负载平衡器始终有一个目标池。多个转发规则可以引用目标池。

目标池是负载平衡器的后端。它指定了将对流量进行负载平衡的后端实例。每条转发规则都是负载平衡器的前端。请注意,每个项目的转发规则数量和目标池数量都有限制

网络负载平衡器根据传入的 IP 协议数据(例如地址、端口和协议类型)平衡系统负载。

网络负载平衡器是一种直通式负载平衡器,因此您的后端会收到原始客户端请求。网络负载平衡器不执行任何传输层安全协议 (TLS) 的分流或代理。流量会直接路由到您的虚拟机。

为负载平衡器创建转发规则时,您会收到一个临时的虚拟 IP 地址 (VIP) 或保留来自地区级网络块的 VIP。

接着,您可以将转发规则与目标池相关联。VIP 是通过 Google 的全球入网点任播的,但网络负载平衡器的后端是地区级后端。负载平衡器不能包含跨多个地区的后端。

您可以使用 Google Cloud 防火墙来控制或过滤对后端虚拟机的访问。

网络负载平衡器会检查来源和目标端口与 IP 地址以及协议,以确定转发数据包的方式。对于 TCP 流量,您可以通过配置会话亲和性来修改负载平衡器的转发行为。网络负载平衡器将数据包转发到目标池中实例的第一个网络接口 (nic0)。

负载平衡器会保留传入数据包的来源 IP 地址。传入数据包的目标 IP 地址是与负载平衡器的转发规则关联的区域外部 IP 地址。

负载分配算法

默认情况下,为了将流量分配给实例,会话亲和性值会设置为 NONE。Cloud Load Balancing 根据来源 IP 和端口、目标 IP 和端口以及协议的哈希来选择实例。这意味着传入的 TCP 连接分散在不同的实例中,每个新的连接可能会转发到不同的实例。用于连接的所有数据包都定向到相同的实例,直到连接关闭。在负载平衡过程中不会考虑已建立的连接。

无论会话亲和性如何设置,用于连接的所有数据包都定向到所选实例,直到连接关闭。现有连接不会影响新传入连接的负载平衡决策。如果使用长期有效的 TCP 连接,这可能会导致后端之间出现失衡。

如果您需要某个客户端的多个连接转到同一实例,可以选择其他会话亲和性设置。

目标池数

目标池资源定义了一组应从转发规则接收传入流量的实例。当转发规则将流量定向到目标池时,Cloud Load Balancing 将根据来源 IP 和端口以及目标 IP 和端口的哈希从这些目标池中选取实例。每个目标池都在单个区域内运行,并将流量分配给后端实例的第一个网络接口 (nic0)。如需详细了解如何将流量分配到各个实例,请参阅本主题中的负载分配算法部分。

网络负载平衡器不是代理。 来自后端虚拟机的响应直接发送到客户端,而不是通过负载平衡器返回。负载平衡器会保留数据包的来源 IP 地址。传入数据包的目标 IP 地址是与负载平衡器的转发规则关联的区域外部 IP 地址。因此:

  • 作为网络负载平衡器的后端虚拟机参与的实例必须运行相应的 Linux 客机环境Windows 客机环境或提供同等功能的其他进程。

    客机操作系统环境(或等效进程)负责在每个后端虚拟机上配置本地路由。这些路由允许虚拟机接受其目标位置与负载平衡器转发规则的 IP 地址相匹配的数据包。

  • 在接受实现了负载平衡的流量的后端实例上,您必须将软件配置为绑定到与负载平衡器的转发规则相关联的 IP 地址(或任何 IP 地址 0.0.0.0/0)。

网络负载平衡支持 Cloud Load Balancing 自动扩缩器,通过该自动扩缩器,用户可以根据后端利用率对目标池中的实例组进行自动扩缩。如需了解详情,请参阅根据 CPU 利用率进行扩缩

如果您打算让自己的目标池包含单个虚拟机实例,则应考虑改用协议转发功能。

目标池仅能与处理 TCP 和 UDP 流量的转发规则一起使用。对于所有其他协议,您必须创建目标实例。您必须先创建目标池,才能将其与转发规则一起使用。每个项目最多可以有 50 个目标池。

转发规则

转发规则与目标池配合使用以支持负载平衡。如需使用负载平衡,您必须创建将流量定向到特定目标池的转发规则。如果没有转发规则,您就无法对流量进行负载平衡。

每个转发规则都会将特定的 IP 地址、协议和(可选)端口范围与单个目标池相匹配。当流量被发送到由一个转发规则负责处理流量的某个外部 IP 地址时,该转发规则会将这些流量定向到相应的目标池。

如果您要对到达 Google Cloud VPC 网络之前可能会被分段的 UDP 数据包进行负载平衡处理,请参阅负载平衡和经过分段的 UDP 数据包

基于目标池的网络负载平衡器支持每条转发规则的以下协议:TCPUDP。如果要将网络负载平衡器配置为转发所有 IP 协议流量,则必须使用基于后端服务的网络负载平衡

多个转发规则

您可以为同一外部 TCP/UDP 网络负载平衡器配置多个地区外部转发规则。(可选)每个转发规则可以具有不同的地区外部 IP 地址,或者多个转发规则可以具有相同的地区外部 IP 地址。

配置多个地区外部转发规则在以下使用场景中非常有用:

  • 您需要为同一目标池配置多个外部 IP 地址。
  • 您需要为同一个目标池使用相同的外部 IP 地址,以配置不同的端口范围或不同的协议。

使用多个转发规则时,请确保将后端虚拟机上运行的软件配置为绑定到所有必要的 IP 地址。这是必需的,因为通过负载平衡器传送的数据包的目标 IP 地址是与各自的地区外部转发规则关联的地区外部 IP 地址。

运行状况检查

运行状况检查可确保 Compute Engine 仅将新的连接转发到已启动并准备好接收它们的实例。Compute Engine 以指定的频率向每个实例发送运行状况检查请求。在实例超过其允许的运行状况检查失败次数后,就不再被视为可接收新流量的合格实例。

为了允许 TCP 连接的安全关停和关闭,现有连接未主动终止。但是,与运行状况不佳的后端的现有连接不能保证长时间保持可用。如果可能,您应尽快为运行状况不佳的后端启动正常关停过程。

运行状况检查工具继续查询运行状况不佳的实例,并在成功检查达到特定次数后将实例返回池中。如果所有实例均被标记为 UNHEALTHY,则负载平衡器会将新流量定向到所有现有实例。

网络负载平衡依靠传统的 HTTP 运行状况检查来确定实例运行状况。即使您的服务未使用 HTTP,但必须在运行状况检查系统可查询的每个实例上运行基本的 Web 服务器。

旧式 HTTPS 运行状况检查不受网络负载平衡器支持,而且不能与其他大多数负载平衡器类型配合使用。

防火墙规则

网络负载平衡器的运行状况检查是从这些 IP 地址范围发出的。您需要创建入站允许防火墙规则,以允许来自这些范围的流量。

网络负载平衡是一种直通式负载平衡器,这意味着您的防火墙规则必须允许来自客户端来源 IP 地址的流量通过。如果您的服务面向互联网开放,允许来自所有 IP 地址范围的流量通过是最容易的。如果要限制访问权限,只允许某些来源 IP 地址,您可以设置防火墙规则来强制执行该限制,但您必须允许运行状况检查 IP 范围的访问。

如需获取防火墙规则示例和配置示例,请参阅网络负载平衡规则

请求和返回数据包的 IP 地址

当后端虚拟机从客户端接收负载平衡数据包时,数据包的来源和目标如下:

  • 来源:与连接到负载平衡器的系统的 Google Cloud 虚拟机或可通过互联网路由的 IP 地址关联的外部 IP 地址。
  • 目标:负载平衡器转发规则的 IP 地址。

由于负载平衡器是直通负载平衡器(而非代理),因此数据包到达负载平衡器的转发规则的目标 IP 地址。在后端虚拟机上运行的软件应配置为执行以下操作:

  • 侦听(绑定到)负载平衡器的转发规则 IP 地址或任何 IP 地址(0.0.0.0::
  • 如果负载平衡器转发规则的协议支持端口:侦听(绑定到)负载平衡器的转发规则中包含的端口

返回数据包直接从负载平衡器的后端虚拟机发送到客户端。返回数据包的来源 IP 地址和目标 IP 地址取决于协议:

  • TCP 面向连接,因此后端虚拟机的来源 IP 地址必须与转发规则的 IP 地址匹配,以便客户端可以将响应数据包与相应的 TCP 连接相关联。
  • UDP 是无连接的,因此后端虚拟机可以发送来源 IP 地址与转发规则的 IP 地址或为虚拟机分配的任何 IP 地址相匹配的响应数据包。实际上,大多数客户端都期望响应来自作为其数据包发送目的地的同一 IP 地址。

下表总结了响应数据包的来源和目标:

流量类型 来源 目标
TCP 负载平衡器转发规则的 IP 地址 请求数据包的来源
UDP 对于大多数用例,负载平衡器转发规则的 IP 地址 请求数据包的来源

如果虚拟机具有外部 IP 地址或使用 Cloud NAT,您还可以将响应数据包的来源 IP 地址设置为虚拟机 NIC 的主要内部 IPv4 地址。Google Cloud 或 Cloud NAT 会将响应数据包的来源 IP 地址更改为 NIC 的外部 IPv4 地址,或者 Cloud NAT 外部 IPv4 地址,以便将响应数据包发送到客户端的外部 IP 地址。不使用转发规则的 IP 地址作为来源属于一种高级方案,因为客户端从外部 IP 地址接收到响应数据包,而该外部 IP 地址与发送请求数据包的 IP 地址不匹配。

返回路径

Google Cloud 会使用未在您的 VPC 网络中定义的特殊路由来执行运行状况检查。如需了解详情,请参阅负载平衡器返回路径

共享 VPC 架构

下表总结了网络负载平衡的共享 VPC 组件:

IP 地址 转发规则 后端组件
区域外部 IP 地址必须在实现负载平衡的实例所在的项目中定义。 区域外部转发规则必须在与目标池中的实例相同的项目(服务项目)中定义。 目标池必须在相应目标池中的实例所在的项目和区域中定义。与目标池关联的运行状况检查也必须在相同项目中定义。

流量分配

基于目标池的网络负载平衡器分发新连接的方式取决于会话亲和性的配置方式。

会话粘性

会话亲和性控制用于分发从客户端到负载平衡器的后端虚拟机的新连接的哈希方法。基于目标池的网络负载平衡器使用 sessionAffinity 参数来配置会话亲和性。

如需了解详情,请参阅使用目标池

负载平衡和经过分段的 UDP 数据包

如果您要对 UDP 数据包进行负载平衡处理,请注意以下事项:

  1. 未分段的数据包通常会在所有配置中进行处理。
  2. UDP 数据包在到达 Google Cloud 之前可能会被分段。 中间网络可能会等待所有数据段到达,然后再进行转发,从而导致延迟,或者可能会丢弃数据段。Google Cloud 不会等待所有数据段;它会在每个数据段到达时立即转发。
  3. 由于后续 UDP 数据段不包含目标端口,因此在以下情况可能会出现问题:

    • 如果将目标池会话亲和性设置为 NONE(5 元组亲和性),后续数据段可能会被丢弃,因为负载平衡器无法计算 5 元组哈希。
    • 如果同一个负载平衡 IP 地址有多个 UDP 转发规则,后续数据段可能会到达错误的转发规则。

如果您想要经过分段的 UDP 数据包,请执行以下操作:

  • 将会话亲和性设置为 NONECLIENT_IP_PROTOCLIENT_IP
    • 将会话亲和性设置为 NONE 表示不需要维护亲和性。因此负载平衡器将使用 5 元组哈希为不分段的数据包选择后端,但为分段的数据包使用 3 元组哈希。
    • 将会话亲和性设置为 CLIENT_IP_PROTOCLIENT_IP 表示,来源和目标端口不会被用于哈希处理,因此会同时为已分段和未分段的数据包计算相同的哈希值。
  • 对每个负载平衡的 IP 地址只使用一个 UDP 转发规则。这确保了所有数据段到达相同的转发规则。

通过这些设置,来自同一数据包的 UDP 数据段会被转发到同一实例进行重组。

将目标实例用作后端

如果您使用目标实例作为网络负载平衡器的后端,并且预期会对 UDP 数据包进行分段,则应为每个负载平衡的 IP 地址仅使用一条 UDP 转发规则,然后配置转发规则以接受 0-65535 端口上的所有流量。这样可以确保所有分段均具有相同的转发规则,即使它们没有相同的目标端口。

限制

  • 网络负载平衡器不支持 VPC 网络对等互连。

后续步骤