外部 TCP 代理负载均衡概览

使用集合让一切井井有条 根据您的偏好保存内容并对其进行分类。

外部 TCP 代理负载均衡是一种反向代理负载均衡器,它将来自互联网的 TCP 流量分配到您的 Google Cloud VPC 网络中的虚拟机实例。使用外部 TCP 代理负载均衡时,经由 TCP 连接传输的流量会在负载均衡层终结,然后使用 TCP 或 SSL 转发到最近的可用后端。

外部 TCP 代理负载均衡允许您为全球所有用户使用一个 IP 地址。外部 TCP 代理负载均衡器可以自动将流量路由到离用户最近的后端。

如果使用高级层级,外部 TCP 代理负载均衡可以配置为全球负载均衡服务。如果使用标准层级,外部 TCP 代理负载均衡器会在区域范围处理负载均衡。

在此示例中,来自首尔用户和波士顿用户的流量的连接会在负载均衡层终结。这些连接在图中标为 1a2a。系统建立了从负载均衡器到选定后端实例的单独连接。这些连接在图中标为 1b2b

具有 TCP 终结功能的 Cloud Load Balancing(点击可放大)
具有 TCP 终结功能的 Cloud Load Balancing(点击可放大)

外部 TCP 代理负载均衡用于处理常见特定端口(例如用于简单邮件传输协议 [SMTP] 的端口 25)上的 TCP 流量。如需了解详情,请参阅端口规范。对于在这些端口上加密的客户端流量,请使用 外部 SSL 代理负载均衡

如需了解各种 Google Cloud 负载均衡器之间的具体区别,请参阅以下文档:

优势

外部 TCP 代理负载均衡器的优势包括:

  • IPv6 终结。外部 TCP 代理负载均衡同时支持使用 IPv4 和 IPv6 地址来路由客户端流量。客户端 IPv6 请求会在负载均衡层终结,然后通过 IPv4 代理到您的后端。
  • 智能路由。负载均衡器可以将请求路由到有容量可用的后端位置。相比之下,L3/L4 负载均衡器必须将请求路由到区域后端,但不考虑容量。使用更智能的路由可以按 N+1 或 N+2(而不是 x*N)模式进行预配。
  • 安全修补。如果 TCP 堆栈中出现漏洞,Cloud Load Balancing 会在负载均衡器上自动应用补丁程序,以确保后端安全。
  • 支持所有端口。外部 TCP 代理负载均衡允许 1-65535 之间的任何有效端口。
  • Google Cloud Armor 集成。您可以使用 Google Cloud Armor 安全政策保护您的基础架构免受分布式拒绝服务 (DDoS) 攻击和其他定向攻击。

架构

下面介绍了外部 TCP 代理负载均衡器的组件。

转发规则和 IP 地址

转发规则会按照 IP 地址、端口和协议将流量路由到由目标代理和后端服务组成的负载均衡配置。

每条转发规则都会提供一个 IP 地址,可用于应用的 DNS 记录。因此无需基于 DNS 的负载均衡。您可以预留可用的静态 IP 地址,也可以让 Cloud Load Balancing 为您分配一个 IP 地址。我们建议您预留静态 IP 地址;否则,每当您删除转发规则并创建新的转发规则时,都必须使用新分配的临时 IP 地址更新 DNS 记录。

外部 TCP 代理负载均衡器定义中使用的外部转发规则都只能引用转发规则的端口规范中列出的端口之一。

外部 TCP 代理负载均衡器支持端口范围(连续)内的单个端口。如需支持多个连续端口,您必须配置多个转发规则。由于系统允许使用相同的虚拟 IP 地址和不同的端口来配置多个转发规则,因此,您可以将具有不同自定义端口的多个应用通过代理连接到同一 TCP 代理虚拟 IP 地址。

目标代理

外部 TCP 代理负载均衡会终结来自客户端的 TCP 连接并创建与后端的新连接。目标代理会将这些新连接路由到后端服务。

默认情况下,系统不会保留原始客户端 IP 地址和端口信息。您可以使用 PROXY 协议来保留此信息。

后端服务

后端服务将传入的流量定向到一个或多个关联后端。每个后端均由一个实例组网络端点组,以及有关后端服务容量的信息组成。后端服务容量可以基于 CPU 或每秒请求次数 (RPS) 计算。

每个外部 TCP 代理负载均衡器都有一个后端服务资源。对后端服务的更改不是即时的。更改可能需要几分钟才能传播到 Google Front End (GFE)。

每项后端服务都会指定要为可用后端执行的健康检查

为了尽量减少用户遭遇的中断,您可以在后端服务上启用连接排空功能。在终止后端、手动移除后端或通过自动扩缩程序移除后端时可能会发生此类中断。如需详细了解如何使用连接排空功能来最大限度地减少服务中断,请参阅启用连接排空功能

后端和 VPC 网络

所有后端都必须位于同一项目中,但可以位于不同的 VPC 网络中。不同的 VPC 网络不需要使用 VPC 网络对等互连连接,因为 GFE 代理系统直接与各自的 VPC 网络中的后端进行通信。

与后端通信的协议

为外部 TCP 代理负载均衡器配置后端服务时,您需要设置后端服务用来与后端通信的协议。您可以选择 SSLTCP。负载均衡器仅使用您指定的协议,不会尝试通过其他协议协商连接。

防火墙规则

外部 TCP 代理负载均衡和外部 SSL 代理负载均衡需要以下防火墙规则:

  • 入站流量允许防火墙规则,用于允许来自 Google Front End (GFE) 前端的流量到达您的后端。

  • 入站流量允许防火墙规则,用于允许来自健康检查探测范围的流量到达您的后端。如需详细了解健康检查探测以及必须允许来自这些探测的流量的原因,请参阅探测 IP 地址范围和防火墙规则

防火墙规则在虚拟机实例级层(而不是在 GFE 代理上)实现。您无法使用 Google Cloud 防火墙规则来阻止流量到达负载均衡器。

这些防火墙规则的端口必须如下配置:

  • 允许发送到每个后端服务的健康检查的目的地端口的流量。

  • 对于实例组后端:通过后端服务的已命名端口与每个实例组上与该已命名端口关联的端口号之间的映射来确定要配置的端口。分配给同一后端服务的各实例组的端口号可能各不相同。

  • 对于 GCE_VM_IP_PORT NEG 后端:允许发送到端点的端口号的流量。

需要允许的来源 IP 地址范围如下所示:

  • 130.211.0.0/22
  • 35.191.0.0/16

这些范围适用于 GFE 中的健康检查和请求。

来源 IP 地址

后端所识别的数据包的来源 IP 地址是负载均衡器的 Google Cloud 外部 IP 地址。换句话说,存在两个 TCP 连接。

  • 连接 1,即从原始客户端到负载均衡器 (GFE) 的连接:

    • 来源 IP 地址:原始客户端(如果客户端位于 NAT 或转发代理后面,则为外部 IP 地址)。
    • 目标 IP 地址:您的负载均衡器的 IP 地址。
  • 连接 2,即从负载均衡器 (GFE) 到后端虚拟机或端点的连接:

    • 来源 IP 地址防火墙规则中指定的某个范围中的一个 IP 地址。

    • 目的地 IP 地址:VPC 网络中的后端虚拟机或容器的内部 IP 地址。

开放端口

外部 TCP 代理负载均衡器是反向代理负载均衡器。负载均衡器终结传入的连接,然后打开从负载均衡器通向后端的新连接。这些负载均衡器是使用全球 Google Front End (GFE) 代理实现的。

GFE 具有多个开放端口,用于支持在同一架构上运行的其他 Google 服务。如需查看可能会在 GFE 上打开的一些端口的列表,请参阅“转发规则:端口规范”。GFE 上运行的其他 Google 服务可能有其他开放端口。

从审核角度对基于 GFE 的负载均衡器的 IP 地址运行端口扫描没有用,原因如下:

  • 执行 TCP SYN 探测时,端口扫描(例如使用 nmap)通常不需要响应数据包或 TCP RST 数据包。如果您的负载均衡器使用高级层级 IP 地址,则 GFE 只会针对已配置转发规则的端口以及针对端口 80 和 443 发送对 SYN 探测作出响应的 SYN-ACK 数据包。此外,GFE 仅会将数据包发送到您的后端,以响应发送到负载均衡器的 IP 地址以及在其转发规则上配置的目的地端口的数据包。如果数据包发送到转发规则中未配置的端口上的不同负载均衡器 IP 地址或您的负载均衡器的 IP 地址,则系统不会将数据包发送到您的负载均衡器的后端。

  • 发送到负载均衡器的 IP 地址的数据包可以由 Google 舰队中的任何 GFE 进行响应;但是,扫描负载均衡器 IP 地址和目的地端口组合只会查询每个 TCP 连接的单个 GFE。负载均衡器的 IP 地址未分配给单个设备或系统。因此,扫描基于 GFE 的负载均衡器的 IP 地址不会扫描 Google 舰队中的所有 GFE。

考虑到这一点,您可以通过以下几种更有效的方法审核后端实例的安全性:

  • 安全审核者应检查负载均衡器配置的转发规则配置。转发规则定义负载均衡器接受数据包并将其转发到后端的目的地端口。对于基于 GFE 的负载均衡器,每条外部转发规则只能引用单个目的地 TCP 端口

  • 安全审核者应检查适用于后端虚拟机的防火墙规则配置。您设置的防火墙规则会阻止从 GFE 流向后端虚拟机的流量,但不会阻止流向 GFE 的传入流量。如需了解最佳做法,请参阅防火墙规则部分

共享 VPC 架构

外部 TCP 代理负载均衡支持使用共享 VPC 的网络。借助共享 VPC,您可以明确划分网络管理员和服务开发者的职责。开发团队可以专注于在服务项目中构建服务,网络基础架构团队则负责预配和管理负载均衡。如果您还不熟悉共享 VPC,请阅读共享 VPC 概览文档

IP 地址 转发规则 目标代理和网址映射 后端组件
外部 IP 地址必须在负载均衡器所在的项目中定义。 外部转发规则必须在后端实例所在的项目(服务项目)中定义。 目标 TCP 代理和网址映射必须在后端实例所在的项目中定义。 全局后端服务必须在与后端实例相同的项目中定义。这些实例必须位于作为后端连接到后端服务的实例组中。与后端服务相关的健康检查也必须在与后端服务相同的项目中定义。

流量分配

外部 TCP 代理负载均衡器将流量分配给后端的方式取决于均衡模式以及所选的用于选择后端的哈希方法(会话亲和性)。

连接的分配方式

外部 TCP 代理负载均衡可以配置为优质层级中的全球性负载均衡服务,以及标准层级中的区域性服务。

对于优质层级

  • Google 会从全球所有入网点通告您的负载均衡器的 IP 地址。每个负载均衡器 IP 地址都是全球任播。
  • 如果您使用多个区域中的后端来配置后端服务,则 Google Front End (GFE) 会尝试将请求定向到离用户最近的区域中运行状况良好的后端实例组或 NEG。本页面记录了此过程的详细信息。

对于标准层级

  • Google 会从与转发规则的区域关联的接入点通告负载均衡器的 IP 地址。负载均衡器使用区域级外部 IP 地址。

  • 您可以在转发规则所在的区域中配置后端。此处记录的过程仍然适用,但负载均衡器仅将请求定向到该区域中健康状况良好的后端。

请求分配过程

  1. 转发规则的外部 IP 地址由 Google 网络边界上的边缘路由器通告。每个通告都会列出第 3/4 层负载均衡系统 (Maglev) 的下一个跃点。
  2. Maglev 系统将流量路由到第一层 Google 前端 (GFE)。第一层 GFE 会根据需要终结传输层安全协议 (TLS),然后按照此过程将流量路由到第二层 GFE:
    1. 如果后端服务使用实例组或 GCE_VM_IP_PORT NEG 后端,则第一层 GFE 更倾向于位于包含实例组或 NEG 的区域内或附近的第二层 GFE。
    2. 对于具有混合 NEG、无服务器 NEG 和互联网 NEG 的后端存储分区和后端服务,第一层 GFE 选择的区域子集中的第二层 GFE 会使得两个 GFE 之间的往返时间最短。

      第二层 GFE 偏好选择不能保证,并且可能根据 Google 的网络状况和维护动态变化。

      第二层 GFE 可识别健康检查状态和实际后端容量使用情况。

  3. 第二层 GFE 将请求定向到其所在区域内的可用区中的后端。
  4. 对于优质层级,有时第二层 GFE 会将请求发送到不同区域的可用区中的后端。这种行为称为溢出
  5. 溢出受两个原则约束:

    • 当第二层 GFE 知道的所有后端达到容量或运行状况不佳时,可能会发生溢出。
    • 第二层 GFE 含有其他区域的可用区中运行状况良好的所有后端的信息。

    第二层 GFE 通常配置为提供部分后端位置。

    溢出行为不会耗尽所有可能的 Google Cloud 可用区。如果您需要将流量引导离开特定可用区或整个区域中的后端,则必须将容量扩缩程序设置为零。将后端配置为无法通过健康检查并不能保证第二层 GFE 会溢出到其他区域的可用区中的后端。

  6. 将请求分配到后端时,GFE 会在可用区级运行。

均衡模式

当您向后端服务添加后端时,可以设置负载均衡模式

对于外部 TCP 代理负载均衡,均衡模式可以为 CONNECTIONUTILIZATION

如果负载均衡模式为 CONNECTION,则系统会根据后端可以处理的并发连接数来分配负载。您还必须准确指定以下参数之一:maxConnections(区域级代管式实例组除外)、maxConnectionsPerInstancemaxConnectionsPerEndpoint

如果负载均衡模式为 UTILIZATION,则系统会根据实例组中的实例利用率来分配负载。

如需了解如何比较负载均衡器类型和支持的均衡模式,请参阅负载均衡方法

会话亲和性

会话亲和性会将来自同一客户端的所有请求发送到同一个后端(前提是该后端运行状况良好且有可用容量)。

外部 TCP 代理负载均衡提供客户端 IP 亲和性,它将来自同一客户端 IP 地址的所有请求转发到同一个后端。

故障切换

如果后端运行状况不佳,流量会被自动重定向到同一区域内的运行状况良好的后端。如果一个区域内的所有后端运行状况不佳,则流量将分配到其他区域内运行状况良好的后端(仅限优质层级)。如果所有后端运行状况不佳,则负载均衡器会丢弃流量。

GKE 应用的负载均衡

如果您在 Google Kubernetes Engine 中构建应用,则可以使用独立 NEG 将流量的负载直接均衡到容器。使用独立 NEG 时,您需要创建用于创建 NEG 的 Service 对象,然后将 NEG 与后端服务相关联,以便负载均衡器可以连接到 Pod。

相关 GKE 文档:

后续步骤