内部 TCP/UDP 负载平衡器作为下一个跃点

内部 TCP/UDP 负载平衡是一种区域级负载平衡器,可让您在内部 IP 地址后面运行和扩缩您的服务。您可以使用内部 TCP/UDP 负载平衡器作为数据包沿其最终目的地路径转发到的下一个跃点。为此,您需要将负载平衡器设置为自定义静态路由中的下一个跃点

在查看本页信息之前,您应该已熟悉以下概念:

内部 TCP/UDP 负载平衡器下一个跃点适用于以下情况:

  • 对充当网关或路由器虚拟机的多个虚拟机的流量进行负载平衡。

  • 将网关虚拟设备用作默认路由的下一个跃点。使用此配置时,Virtual Private Cloud (VPC) 网络中的虚拟机实例可通过一组负载均衡的虚拟网关虚拟机将流量发送到互联网。

  • 将同一组多 NIC 网关或路由器虚拟机用作后端,通过多个负载均衡器向两个或多个方向发送流量。为此,您需要创建一个负载均衡器,并将其用作每个 VPC 网络中自定义静态路由的下一个跃点。每个内部 TCP/UDP 负载均衡器都在单个 VPC 网络中运行,将流量分配到该网络中后端虚拟机的网络接口。

架构

在下图中,路由器虚拟机的一个虚拟机实例组用作两个不同负载均衡器的后端。第一个内部 TCP/UDP 负载均衡将数据包发送到后端虚拟机的 nic0,第二个内部 TCP/UDP 负载均衡会将数据包发送到同一后端上的 nic1

将负载平衡到多个 NIC(点击可放大)
将负载平衡到多个 NIC(点击可放大)

将内部 TCP/UDP 负载平衡器用作下一个跃点的好处

如果负载平衡器是静态路由的下一个跃点,则在定义路由的 VPC 网络中的客户端虚拟机的客机操作系统内不需要进行特殊配置。客户端虚拟机以线缆串接设备的方式通过 VPC 网络路由将数据包发送到负载平衡器的后端。

通过使用内部 TCP/UDP 负载平衡器作为静态路由的下一个跃点,您可以获得内部 TCP/UDP 负载平衡所具有的相同好处。负载均衡器的健康检查可以确保新连接路由到健康状况良好的后端虚拟机。通过将托管实例组用作后端,您可以配置自动扩缩功能以根据服务需求扩大或缩小虚拟机集。

规格

以下是将内部 TCP/UDP 负载平衡器用作下一个跃点的规范。

路由

您可以创建自定义静态路由,将 TCP、UDP 和其他协议流量传递到内部 TCP/UDP 负载均衡器,其中负载均衡器是静态路由的下一个跃点。路由可以是可公开路由的外部(可公开路由)CIDR 前缀,也可以是内部 CIDR 前缀(如果前缀与子网路由不冲突)。例如,您可以将默认路由 (0.0.0.0/0) 替换为将流量定向到第三方后端虚拟机进行数据包处理的路由。

用于指定下一个跃点的选项

您可以通过两种方法将负载均衡器指定为下一个跃点。

规范选项 下一个跃点网络 可以导出到对等互连的网络
转发规则的名称和负载均衡器的区域 下一个跃点负载均衡器和路由必须位于同一 VPC 网络中 是,通过导出自定义路由(适用于没有实例标记的路由
转发规则的内部 IP 地址 下一个跃点负载均衡器可以与路由位于同一个 VPC 网络中,也可以位于对等互连 VPC 网络中 是,始终导出(带有实例标记的路由除外)

客户端 IP 地址会话粘性

内部 TCP/UDP 负载均衡提供两个类似的“客户端 IP 地址”会话亲和性选项

  • 客户端 IP (CLIENT_IP):数据包的来源 IP 地址和目标 IP 地址的二元组哈希。当内部 TCP/UDP 负载均衡器不是路由的下一个跃点时,发送到负载均衡器的转发规则 IP 地址的数据包将共享相同的目标 IP 地址,即转发规则 IP 地址。在这种情况下,二元组哈希使用的其中一个地址将保持不变。因此,如果已配置且运行状况良好的后端数量没有更改,且数据包具有相同的来源 IP 地址,则此二元组会话亲和性选项会选择同一后端。
  • 客户端 IP、无目标 (CLIENT_IP_NO_DESTINATION):数据包的来源 IP 地址的一元组哈希。使用内部 TCP/UDP 负载均衡器作为下一个跃点时,目标 IP 地址通常会发生变化,因为目标 IP 地址是由路由的目标属性指定的地址。在这种情况下,即使已配置且运行状况良好的后端数量没有变化并且数据包具有相同的来源 IP 地址,二元组哈希客户端 IP (CLIENT_IP) 会话亲和性也无法选择同一后端。(此规则的一个例外是仅配置一个后端的情况。)如果您需要将具有相同来源 IP 地址的数据包路由到同一后端,则必须使用客户端 IP、无目标 (CLIENT_IP_NO_DESTINATION) 会话亲和性选项。

目标范围

自定义静态路由的目标不能等于子网路由,也不能比其更具体。请注意,更具体意味着子网掩码更长。此规则适用于所有自定义静态路由,包括下一个跃点是内部 TCP/UDP 负载平衡器时。例如,假设您的子网路由为 10.140.0.0/20。自定义静态路由的目标不能是相同的 (10.140.0.0/20),并且不能比 10.140.0.0/22 中的更具体。

相同的 VPC 网络和区域

只有在以下场景下,自定义静态路由会将内部 TCP/UDP 负载平衡器用作下一个跃点:

  • 单个 VPC 网络。负载平衡器和自定义静态路由必须位于同一个 VPC 网络中。

  • 单个区域或所有区域。除非您配置全球访问权限,否则自定义静态路由只能供与负载平衡器位于同一区域的资源使用。即使路由本身是整个 VPC 网络的路由表的一部分,系统也会强制实施此区域限制。如果您启用全球访问权限,则自定义静态路由可供任何区域中的资源使用。

通告自定义静态路由

要通告自定义静态路由的前缀(目的地),您可以使用 Cloud Router 路由器自定义路由通告。路由通告的范围取决于负载均衡器的全局访问设置,如下所示:

  • 停用全球访问权限后,内部 TCP/UDP 负载均衡器仅适用于与负载均衡器位于同一区域的虚拟机、Cloud VPN 隧道和 Cloud Interconnect 连接 (VLAN)。因此,只有当 Cloud Router 路由器和负载均衡器位于同一区域时,自定义静态路由前缀的自定义路由通告才有意义。

  • 启用全球访问权限后,内部 TCP/UDP 负载均衡器可用于任何区域中的虚拟机、Cloud VPN 隧道和 Cloud Interconnect 连接 (VLAN)。通过全局动态路由,本地系统可以使用来自任何连接区域的自定义静态路由。

下表总结了负载均衡器的可访问性。

全球访问权限 VPC 网络动态路由模式 负载平衡器访问权限
已停用 区域 可由同一区域中的路由器访问
已停用 全球 可由同一区域中的路由器访问
已启用 区域 任何区域中的所有路由器均可访问
已启用 全球 任何区域中的所有路由器均可访问

如需了解详情,请参阅内部 TCP/UDP 负载平衡和连接网络

操作顺序

您必须先创建内部 TCP/UDP 负载平衡器,然后才能创建将该负载平衡器用作下一个跃点的自定义静态路由。负载平衡器必须已存在,您才能创建路由。如果您尝试创建路由,但路由引用的负载均衡器不存在,则 Google Cloud 会返回错误。

如需指定内部 TCP/UDP 负载均衡器下一个跃点,您可以使用转发规则的名称和负载均衡器的区域,或使用与转发规则关联的内部 IP 地址。

使用下一个跃点(引用内部 TCP/UDP 负载均衡器)创建路由后,除非先删除路由,否则无法删除负载均衡器。具体来说,您不能删除内部转发规则,除非没有自定义静态路由将该负载均衡器用作下一个跃点。

后端要求

  • 您必须将内部 TCP/UDP 负载均衡器的所有后端虚拟机配置为允许 IP 转发(--can-ip-forward = True)。如需了解详情,请参阅基于实例或基于负载均衡器的路由的注意事项

  • 您不能将后端为 Google Kubernetes Engine (GKE) 节点的内部 TCP/UDP 负载平衡器用作自定义静态路由的下一个跃点。如果目标与集群管理的 IP 地址匹配,则节点上的软件只能将流量路由到 Pod,而不是任意目标。

TCP、UDP 和其他协议流量的处理

在内部 TCP/UDP 负载平衡器部署为下一个跃点后,无论以下因素如何,Google Cloud 都会将所有端口上的所有流量转发到后端虚拟机

  • 转发规则的协议和端口配置
  • 后端服务的协议配置

作为路由的下一个跃点的内部 TCP/UDP 负载平衡器可无缝支持转发 Google Cloud VPC 网络支持的协议(例如 TCP、UDP 和 ICMP)的所有流量。

其他注意事项

  • 全球访问权限的影响。使用内部 TCP/UDP 负载均衡器下一个跃点的自定义静态路由在所有区域进行编程。下一个跃点是否可用取决于负载均衡器的全球访问权限设置。启用全球访问权限后,负载均衡器下一个跃点可在 VPC 网络的所有区域中访问。停用全球访问权限后,负载均衡器下一个跃点只能在与负载均衡器相同的区域中访问。停用全球访问权限后,系统会丢弃从另一个区域发送到使用内部 TCP/UDP 负载均衡器下一个跃点的路由的数据包。
  • 当所有后端运行状况不佳时。当内部 TCP/UDP 负载均衡器的所有后端都未通过健康检查时,使用该负载均衡器下一个跃点的路由仍然有效。该路由处理的数据包根据流量分配发送到其中一个下一个跃点负载均衡器的后端。

  • 不支持使用公共内部 IP 地址 (--purpose=SHARED_LOADBALANCER_VIP) 的转发规则。下一个跃点内部 TCP/UDP 负载均衡器和使用通用 IP 地址的内部 TCP/UDP 负载均衡器转发规则是互斥的功能。下一个跃点内部 TCP/UDP 负载均衡器必须使用负载均衡器的转发规则独有的 IP 地址,以便明确引用一个后端服务(一个负载均衡器)。转发规则可以使用公共内部 IP 地址来引用不同的后端服务(不同的内部 TCP/UDP 负载均衡器)。

  • 相同的目的地和多个下一个跃点内部 TCP/UDP 负载均衡器。如果您使用不同的内部 TCP/UDP 负载均衡器下一个跃点创建两个或多个目的地相同的自定义静态路由,则 Google Cloud 绝不会使用 ECMP 在负载均衡器下一个跃点之间分配流量。如果路由具有唯一的优先级,则 Google Cloud 会使用具有最高优先级的路由的下一个跃点内部 TCP/UDP 负载均衡器。如果路由具有相同的优先级,则 Google Cloud 仍会只选择一个下一个跃点内部 TCP/UDP 负载均衡器。在后一种情况下,如下图所示,Google Cloud 使用确定性的内部算法来选择单个下一个跃点转发规则 (forwarding-rule-a),并忽略具有相同优先级的其他路由。

    同一目的地、不同的内部 TCP/UDP 负载均衡器下一个跃点
    同一目的地、不同的内部 TCP/UDP 负载均衡器下一个跃点
  • 多个目的地、相同的下一个跃点内部 TCP/UDP 负载均衡器

    使用实例标记

    如果您使用实例标记(也称为网络标记),则可以将同一下一个跃点内部 TCP/UDP 负载均衡器用于多个自定义静态路由,这些路由具有相同的目的地和优先级。

    不使用实例标记:如果不使用网络标记,则无法创建多个具有相同目的地、优先级和内部 TCP/UDP 负载均衡器下一个跃点组合的自定义静态路由。例如,route-xroute-yroute-z 全都可以创建,但 route-x-copy 无法创建。

    使用通用内部 TCP/UDP 负载均衡器下一个跃点的不带标记的路由示例
    使用通用内部 TCP/UDP 负载均衡器下一个跃点的不带标记的路由示例
  • 实例标记

    您可以指定实例标记(也称为网络标记),以使下一个跃点路由仅应用于已配置该标记的客户端实例。这样,您就可以选择用哪个带标记的下一个跃点路由填充哪些客户端实例,以及将流量路由到哪组设备。

    您无需将不同的客户端实例隔离到单独的 VPC 网络中,每个客户端实例均指向将一组设备作为前端的首选内部 TCP/UDP 负载均衡器。

  • 指向同一目的地前缀的多个路由。使用实例标记,您可以指定多个指向同一目的地的路由,并将不同内部负载均衡器作为下一个跃点。您可以为这些相同的目的地路由使用不同的实例标记或不同的优先级。

使用场景

您可以将内部 TCP/UDP 负载平衡器用作多个部署和拓扑中的下一个跃点。

对于每个示例,请注意以下准则:

  • 每个虚拟机接口必须位于单独的 VPC 网络中。

  • 您无法使用后端虚拟机或负载平衡器在同一 VPC 网络的子网之间路由流量,因为无法替换子网路由。

  • 内部 TCP/UDP 负载平衡器是软件定义的直通负载平衡器。数据包传送到后端虚拟机,无需更改来源或目标信息(地址或地址及端口)。

    充当内部 TCP/UDP 负载均衡器后端的虚拟设备负责路由、数据包过滤、代理和地址转换。

将内部 TCP/UDP 负载平衡器用作 NAT 网关的下一个跃点

在此使用场景中,系统通过负载平衡将流量从内部虚拟机路由到多个 NAT 网关实例,这些实例将流量路由到互联网。

NAT 使用场景(点击放大)
NAT 使用场景(点击可放大)

中心辐射型拓扑:使用 VPC 网络对等互连来交换下一个跃点路由

除了交换子网路由之外,您还可以配置 VPC 网络对等互连以导出和导入自定义静态和动态路由。不包括具有默认互联网网关的下一个跃点的自定义静态路由。包括使用下一个跃点内部 TCP/UDP 负载均衡器的自定义静态路由。

通过执行以下操作,您可以使用位于 hub VPC 网络中的下一个跃点防火墙虚拟设备来配置一个中心辐射型拓扑:

  • hub VPC 网络中,创建内部 TCP/UDP 负载平衡器并将防火墙虚拟设备用作后端。
  • hub VPC 网络中,创建自定义静态路由,并将下一个跃点设置为内部 TCP/UDP 负载平衡器。
  • 使用 VPC 网络对等互连将 hub VPC 网络连接到每个 spoke VPC 网络。
  • 对于每个对等互连,配置 hub 网络以导出其自定义路由,并配置相应的 spoke 网络以导入自定义路由。具有负载平衡器下一个跃点的路由是 hub 网络导出的路由之一。

根据路由顺序hub VPC 网络中的下一个跃点防火墙设备负载平衡器在辐射网络中可用于:

  • 与负载均衡器位于同一区域的客户端(如果全球访问权限已停用)
  • 所有区域的客户端,依照路由顺序(如果全球访问权限已启用)。
中心辐射型拓扑(点击可放大)
中心辐射型拓扑(点击可放大)

将负载平衡到多个 NIC

在以下使用场景中,后端虚拟机是在多个 VPC 网络中具有 NIC 的虚拟设备实例(例如数据包检查、路由或网关虚拟机)。这些虚拟设备实例可以是第三方提供的商业解决方案,也可以是您自行构建的解决方案。虚拟设备是具有多个 NIC 的 Compute Engine 虚拟机。

此示例显示了托管虚拟机实例组中的一组后端虚拟设备。

在名为 testing 的 VPC 网络中,内部 TCP/UDP 负载均衡器具有一个名为 fr-ilb1 的转发规则。在此示例中,此负载均衡器会将流量分配到 nic0 接口。

在名为 production 的 VPC 网络中,不同的内部 TCP/UDP 负载平衡器具有一个名为 fr-ilb2 的转发规则。此负载平衡器会将流量分配到不同的接口(本例中为 nic1)。

流量进行了多 NIC 负载平衡(点击可放大)
流量进行了多 NIC 负载平衡(点击可放大)

如需了解详细的配置设置,请参阅将负载平衡到多个后端 NIC

对称哈希

上面的示例不使用来源网络地址转换 (SNAT)。Google Cloud 使用对称哈希技术,因此无需使用 SNAT。这意味着当数据包属于同一流时,Google Cloud 会计算相同的哈希。换句话说,当来源 IP 地址:端口与目标 IP 地址:端口交换时,哈希不会更改。

注意:

  • 您在 2021 年 6 月 22 日当天或之后创建内部 TCP/UDP 负载均衡器转发规则时,系统会自动启用对称哈希。

  • 如需在现有内部 TCP/UDP 负载均衡器上启用对称哈希,您必须重新创建转发规则和下一个跃点路由,如启用对称哈希中所述。

  • 只有内部 TCP/UDP 负载均衡支持对称哈希。

  • 协议 TCP 和 UDP 的以下会话亲和性类型支持对称哈希:

    • 客户端 IP(2 元组)
    • 客户端 IP 和协议(3 元组)
    • 客户端 IP、协议和端口(5 元组)
  • 如果您的使用场景由于某种原因需要 SNAT,您可以选择使用 SNAT。

后续步骤