外部应用负载均衡器概览

本文档介绍了解如何配置外部应用负载均衡器所需了解的概念。

外部应用负载均衡器是一种基于代理的第 7 层负载均衡器,可让您在单个外部 IP 地址后面运行和扩缩服务。外部应用负载均衡器将 HTTP 和 HTTPS 流量分配到各个 Google Cloud 平台(例如 Compute Engine、Google Kubernetes Engine (GKE)、Cloud Storage 等)上托管的后端,以及通过互联网或混合连接连接的外部后端。如需了解详情,请参阅应用负载均衡器概览:使用场景

操作模式

您可以使用以下模式配置外部应用负载均衡器:

  • 全球外部应用负载均衡器。这是一个全球负载均衡器,在 Google Front End (GFE) 上作为托管式服务实现。它使用开源 Envoy 代理来支持高级流量管理功能,例如流量镜像、基于权重的流量分配、基于请求/响应的标头转换等。
  • 传统应用负载均衡器。这在高级层级中是全球范围内的传统外部应用负载均衡器,但在标准层级中可以配置为区域级负载均衡器。此负载均衡器在 Google Front End (GFE) 上实现。这些 GFE 分布于全球各地,可通过 Google 的全球网络和控制平面协同运作。
  • 区域级外部应用负载均衡器。这是一个区域级负载均衡器,它作为开源 Envoy 代理上的托管式服务实现。该均衡器具有高级流量管理功能,例如流量镜像、基于权重的流量分配、基于请求/响应的标头转换等。
负载均衡器模式 推荐的用例 功能
全球外部应用负载均衡器 如果用户分布在世界各地或者后端服务位于多个区域,则可使用适用于外部 HTTP(S) 工作负载的这种负载均衡器。
传统应用负载均衡器

此负载均衡器在高级层级中面向全球,但在标准层级中可配置为区域级负载均衡器。

高级网络服务层级中,此负载均衡器可提供多区域负载均衡功能,尝试将流量定向到健康状况良好、有充足容量的最近后端,并尽可能接近您的用户的位置终止 HTTP(S) 流量。如需详细了解请求分配过程,请参阅流量分配

标准网络服务层级中,负载均衡会在区域范围内进行处理。

  • 与使用网关(完全编排)、Ingress(完全编排)或独立 NEG(手动编排)的 GKE 兼容
  • 支持 Google Cloud Armor
  • 提供较少的流量路由功能
如需查看功能的完整列表,请参阅负载均衡功能页面。
区域级外部应用负载均衡器

此负载均衡器具有现有传统应用负载均衡器的许多功能,以及一些高级流量管理功能。

如果您只想传送来自一个地理位置的内容(例如,出于满足合规性规定的目的),请使用此负载均衡器。

此负载均衡器可以在高级层级或标准层级中配置。

如需查看完整列表,请参阅负载均衡功能

识别模式

Cloud 控制台

  1. 在 Google Cloud 控制台中,转到负载均衡页面。
    转到“负载均衡”
  2. 负载均衡器标签页中将显示负载均衡器类型、协议和区域。如果区域为空,则负载均衡器为适用于全球。下表总结了如何识别负载均衡器的模式。

    负载均衡器模式 负载均衡器类型 权限类型 区域
    全球外部应用负载均衡器 应用 外部
    传统应用负载均衡器 应用(传统) 外部
    区域级外部应用负载均衡器 应用 外部 指定一个区域

gcloud

  1. 如需确定负载均衡器的模式,请运行以下命令:

    gcloud compute forwarding-rules describe FORWARDING_RULE_NAME
    

    在命令输出中,检查负载均衡方案、地区和网络层级。下表总结了如何识别负载均衡器的模式。

    负载均衡器模式 负载均衡方案 转发规则 网络层级
    全球外部应用负载均衡器 EXTERNAL_MANAGED Global 优质
    传统应用负载均衡器 外部 Global 标准或优质
    区域级外部应用负载均衡器 EXTERNAL_MANAGED 指定一个区域 标准或优质

架构

外部应用负载均衡器部署需要以下资源:

  • (仅适用于区域级外部应用负载均衡器)代理专用子网用于将来自负载均衡器的连接发送到后端。

  • 外部转发规则指定外部 IP 地址、端口和目标 HTTP(S) 代理。客户端使用 IP 地址和端口连接到负载均衡器。

  • 目标 HTTP(S) 代理接收来自客户端的请求。HTTP(S) 代理使用网址映射评估请求,从而做出流量路由决策。该代理还可以使用 SSL 证书对通信进行身份验证。

    • 对于 HTTPS 负载均衡,目标 HTTPS 代理会使用 SSL 证书向客户端证明其身份。目标 HTTPS 代理最多支持规定数量的 SSL 证书。
  • HTTP(S) 代理使用网址映射根据 HTTP 特性(例如请求路径、Cookie 或标头)确定路由。根据确定的路由,代理会将客户端请求转发到特定的后端服务或后端存储桶。网址映射可以指定其他操作,例如向客户端发送重定向。

  • 后端服务将请求分配到健康状况良好的后端。全球外部应用负载均衡器还支持后端存储桶

    • 必须将一个或多个后端连接到后端服务或后端存储桶。
  • 健康检查会定期监控您的后端的就绪情况。这样可以降低向无法处理请求的后端发送请求的风险。

  • 防火墙规则,可让您的后端接受健康检查探测。区域级外部应用负载均衡器需要额外的防火墙规则,以允许来自代理专用子网的流量到达后端。

全球

下图展示了全球外部应用负载均衡器部署的组件。此架构适用于全球外部应用负载均衡器和高级层级中的传统应用负载均衡器。

全球外部应用负载均衡器组件
全球外部应用负载均衡器组件

区域

下图展示了区域级外部应用负载均衡器部署的组件。

区域级外部应用负载均衡器组件
区域级外部应用负载均衡器组件

代理专用子网

仅区域级外部应用负载均衡器需要代理专用子网

代理专用子网提供了一组 IP 地址,供 Google 用于代表您运行 Envoy 代理。您必须在 VPC 网络内所有使用外部应用负载均衡器的区域中创建一个代理专用子网。此代理专用子网的 --purpose 标志设置为 REGIONAL_MANAGED_PROXY。同一区域和 VPC 网络中的所有基于 Envoy 的区域负载均衡器共用来自同一代理专用子网的 Envoy 代理池。此外:

  • 代理专用子网仅用于 Envoy 代理,不可用于您的后端。
  • 一个区域和 VPC 网络中的所有区域级外部应用负载均衡器的后端虚拟机或端点都会收到来自代理专用子网的连接。
  • 区域级外部应用负载均衡器的 IP 地址不位于代理专用子网中。该负载均衡器的 IP 地址由其外部托管式转发规则定义,如下所述。

如果您之前使用 --purpose=INTERNAL_HTTPS_LOAD_BALANCER 创建了代理专用子网,则需要先将子网的用途迁移REGIONAL_MANAGED_PROXY,然后才能在 VPC 网络的同一区域中创建其他基于 Envoy 的负载均衡器。

转发规则和地址

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

每条转发规则都会提供一个 IP 地址,可用于应用的 DNS 记录。不需要基于 DNS 的负载均衡。 您可以指定要使用的 IP 地址,也可以让 Cloud Load Balancing 为您分配一个。

应用负载均衡器的每个转发规则可以引用 1-65535 中的单个端口。如需支持多个端口,您必须配置多个转发规则。您可以将多个转发规则配置为使用相同的外部 IP 地址 (VIP) 并引用相同的目标 HTTP(S) 代理,只要每条转发规则的 IP 地址、端口和协议的整体组合是唯一的即可。这样,您就可以使用具有共享网址映射的单个负载均衡器作为多个应用的代理。

外部应用负载均衡器使用的转发规则类型、IP 地址和负载均衡方案取决于负载均衡器的模式以及负载均衡器所属的网络服务层级

负载均衡器模式 网络服务层级 转发规则、IP 地址和负载均衡方案 从互联网到负载均衡器前端的路由
全球外部应用负载均衡器 高级层级

全球级外部转发规则

全球外部 IP 地址

负载均衡方案:
EXTERNAL_MANAGED

请求路由到互联网中最靠近客户端的 GFE。
传统应用负载均衡器 高级层级

全球级外部转发规则

全球外部 IP 地址

负载均衡方案:
EXTERNAL

请求路由到互联网中最靠近客户端的 GFE。
标准层级

区域级外部转发规则

区域级外部 IP 地址

负载均衡方案:
EXTERNAL

请求路由到负载均衡器所在区域中的 GFE。
区域级外部应用负载均衡器 高级层级或标准层级

区域级外部转发规则

区域级外部 IP 地址

负载均衡方案:
EXTERNAL_MANAGED

请求路由到与负载均衡器位于同一区域的 Envoy 代理。

如需查看每种模式下外部应用负载均衡器转发规则所支持的协议的完整列表,请参阅负载均衡器功能

目标代理

目标代理会终结来自客户端的 HTTP(S) 连接。一条或多条转发规则会将流量定向到目标代理,目标代理会查询网址映射以确定如何将流量路由到后端。

请勿依赖代理来保留请求或响应标头名称的大小写。例如,Server: Apache/1.0 响应标头可能会在客户端显示为 server: Apache/1.0

下表指定了每种模式下外部应用负载均衡器所需的目标代理类型。

负载均衡器模式 目标代理类型 代理添加的标头 支持自定义标头 支持 Cloud Trace
全球外部应用负载均衡器 全局 HTTP
全局 HTTPS
代理将 HTTP 请求/响应标头设置为如下内容:
  • Via: 1.1 google(请求和响应)
  • X-Forwarded-Proto:[http | https](仅限请求)
  • X-Forwarded-For:[<supplied-value>,]<client-ip>,<load-balancer-ip>(请参阅 X-Forwarded-For 标头)(仅限请求)

代理还可以设置 X-Cloud-Trace-Context 标头。

在后端服务或后端存储桶上配置

Cloud CDN 不支持

传统应用负载均衡器 全局 HTTP
全局 HTTPS
代理将 HTTP 请求/响应标头设置为如下内容:
  • Via: 1.1 google(请求和响应)
  • X-Forwarded-Proto:[http | https](仅限请求)
  • X-Forwarded-For:[<supplied-value>,]<client-ip>,<load-balancer-ip>(请参阅 X-Forwarded-For 标头)(仅限请求)

代理还可以设置 X-Cloud-Trace-Context 标头。

在后端服务或后端存储桶上配置
区域级外部应用负载均衡器 区域级 HTTP
区域级 HTTPS
  • X-Forwarded-Proto:[http | https](仅限请求)
  • Via: 1.1 google(请求和响应)
  • X-Forwarded-For:[<supplied-value>,]<client-ip>,<load-balancer-ip>(请参阅 X-Forwarded-For 标头)(仅限请求)

除了目标代理添加的标头之外,负载均衡器还会通过以下方式调整其他 HTTP 标头:

  • 对于全球外部应用负载均衡器,请求和响应标头始终都会转换为小写。例如,Host 将更改为 hostKeep-ALIVE 将更改为 keep-alive

    唯一的例外是将全球互联网 NEG 后端与 HTTP/1.1 搭配使用。如需详细了解如何使用全球互联网 NEG 处理 HTTP/1.1 标头,请参阅互联网 NEG 概览

  • 对于传统应用负载均衡器,请求和响应标头会转换为小写,除非您使用 HTTP/1.1。使用 HTTP/1.1 时,标头会采用正确的大小写形式。标头键的第一个字母以及连字符 (-) 后面的所有字母均为大写,以保持与 HTTP/1.1 客户端兼容。例如,user-agent 会更改为 User-Agent,而 content-encoding 会更改为 Content-Encoding

  • 某些标头会合并。如果同一标头键(例如 Via)具有多个实例,则负载均衡器会将它们的值组合成单个标头键的单一英文逗号分隔列表。只有其值可以用英文逗号分隔列表来表示的标头会合并。Set-Cookie 之类的其他标头永远不会合并。

主机标头

当负载均衡器发出 HTTP 请求时,负载均衡器会保留原始请求的主机标头。

X-Forwarded-For 标头

负载均衡器按以下顺序将两个 IP 地址(用英文逗号分隔)附加到 X-Forwarded-For 标头:

  • 连接到负载均衡器的客户端的 IP 地址
  • 负载均衡器转发规则的 IP 地址

如果传入请求中没有 X-Forwarded-For 标头,则这两个 IP 地址为整个标头值:

X-Forwarded-For: <client-ip>,<load-balancer-ip>

如果请求包含 X-Forwarded-For 标头,则负载均衡器会保留在 <client-ip>,<load-balancer-ip> 之前提供的值:

X-Forwarded-For: <supplied-value>,<client-ip>,<load-balancer-ip>

在负载均衡器的后端上运行 HTTP 反向代理软件时,该软件可能会将以下一个或全部两个 IP 地址附加到 X-Forwarded-For 标头的末尾:

  • 连接到后端的 Google Front End (GFE) 的 IP 地址。这些 IP 地址在 130.211.0.0/2235.191.0.0/16 范围内。

  • 后端系统本身的 IP 地址。

因此,在负载均衡器后端之后,上游进程可能会收到如下形式的 X-Forwarded-For 标头:

<existing-values>,<client-ip>,<load-balancer-ip><GFE-IP><backend-IP>

网址映射

网址映射定义了匹配模式,以便根据网址将请求路由到相应的后端服务。定义默认服务是为了处理所有与指定的主机规则或路径匹配规则不相符的请求。在某些情况(例如多区域负载均衡示例)下,您可能不会定义任何网址规则,仅依赖于默认服务。对于请求路由,网址映射可让您通过检查网址的各部分来分流您的流量,从而将请求发送到不同组的后端。

与全球外部应用负载均衡器和区域级外部应用负载均衡器搭配使用的网址映射支持多项高级流量管理功能,例如基于标头的流量导向、基于权重的流量分配和请求镜像。 详情请参阅以下内容:

下表指定了每种模式下外部应用负载均衡器所需的网址映射类型。

负载均衡器模式 网址映射类型
全球外部应用负载均衡器 Global
传统应用负载均衡器 全球级(仅具有部分受支持的功能
区域级外部应用负载均衡器 区域

SSL 证书

使用目标 HTTPS 代理的外部应用负载均衡器需要私钥和 SSL 证书作为负载均衡器配置的一部分:

  • Google Cloud 提供了两种为目标 HTTPS 代理分配私钥和 SSL 证书的配置方法:Compute Engine SSL 证书和 Certificate Manager。如需了解每个配置的说明,请参阅 SSL 证书概览中的证书配置方法

  • Google Cloud 提供两种证书类型:自行管理的证书和 Google 管理的证书。如需了解每种类型的说明,请参阅 SSL 证书概览中的证书类型

  • 外部应用负载均衡器的类型(全球、区域或传统)决定了支持的配置方法和证书类型。如需了解详情,请参阅 SSL 证书概览中的证书和 Google Cloud 负载均衡器

双向 TLS

通常,在与 HTTPS 通信时,身份验证仅使用一种方式:客户端验证服务器的身份。如果应用要求负载均衡器对连接到应用的客户端身份进行验证,则全球外部应用负载均衡器和传统应用负载均衡器都支持双向 TLS (mTLS)。

如果使用 mTLS,负载均衡器会请求客户端在与负载均衡器进行 TLS 握手期间发送证书以进行身份验证。您可以配置负载均衡器用来验证客户端证书信任链的信任库。

Google Cloud 使用 Certificate Manager 中的 TrustConfig 资源来存储服务器用来验证客户端提供的证书的证书。如果您在高级网络服务层级使用传统应用负载均衡器,或者使用全球外部应用负载均衡器,则可以使用 Certificate Manager 在负载均衡器的多个实例上大规模预配和管理您的 SSL 证书或 TrustConfig。如需了解详情,请参阅 Certificate Manager 概览

如需详细了解 mTLS,请参阅双向 TLS 身份验证

SSL 政策

SSL 政策指定 Google Cloud 负载均衡器在与客户端协商 SSL 时使用的一组 SSL 功能。

默认情况下,HTTPS 负载均衡所用的一组 SSL 功能具有良好的安全性和广泛的兼容性,但某些应用需要更好地控制用于其 HTTPS 或 SSL 连接的 SSL 版本和加密方式。您可以定义 SSL 政策来指定负载均衡器在与客户端协商 SSL 时使用的一组 SSL 功能。此外,您还可以将该 SSL 政策应用于目标 HTTPS 代理。

下表指定了针对每种模式下的负载均衡器的 SSL 政策支持。

负载均衡器模式 支持的 SSL 政策
全球外部应用负载均衡器
传统应用负载均衡器
区域级外部应用负载均衡器

后端服务和存储桶

后端服务向负载均衡器提供配置信息。负载均衡器使用后端服务中的信息将传入的流量定向到一个或多个挂接的后端。 如需查看显示如何使用后端服务和 Compute Engine 后端设置负载均衡器的示例,请参阅使用 Compute Engine 后端设置外部应用负载均衡器

后端存储桶将传入的流量定向到 Cloud Storage 存储桶。如需查看展示如何将存储桶添加到外部应用负载均衡器的示例,请参阅设置使用后端存储桶的负载均衡器

下表指定了每种模式下外部应用负载均衡器支持的后端功能。


负载均衡器模式
后端服务上支持的后端 支持后端存储桶 支持 Google Cloud Armor 支持 Cloud CDN4 支持 IAP4 支持 Service Extensions
实例组 可用区级 NEG 互联网 NEG 无服务器 NEG 混合 NEG Private Service Connect NEG
全球外部应用负载均衡器 2
传统应用负载均衡器 1
使用高级层级时

区域级外部应用负载均衡器 1

1GCE_VM_IP_PORT 类型端点用于 GKE:使用独立可用区级 NEG使用 Ingress

2GCE_VM_IP_PORT 类型端点用于 GKE:使用独立可用区级 NEG

3 仅受 GKE Gateway 控制器支持

4 IAP 和 Cloud CDN 彼此不兼容。不能在同一后端服务上启用它们。

详情请参阅以下内容:

后端和 VPC 网络

后端位置的限制取决于负载均衡器的类型。

  • 对于全球外部应用负载均衡器和传统应用负载均衡器,来自实例组后端的所有后端实例和来自 NEG 后端的所有后端端点必须位于同一项目中。但是,实例组后端或 NEG 可以使用该项目中的其他 VPC 网络。不同的 VPC 网络不需要使用 VPC 网络对等互连连接,因为 GFE 直接与各自的 VPC 网络中的后端进行通信。
  • 对于区域级外部应用负载均衡器,所有后端都必须位于同一 VPC 网络和区域中。

后端协议

为负载均衡器配置后端服务时,您需要设置后端服务用来与后端通信的协议。您可以选择 HTTP、HTTPS 或 HTTP/2。负载均衡器仅使用您指定的协议。如果负载均衡器无法使用指定的协议与后端协商连接,将不会回退为使用其他两种协议之一。

如果您使用 HTTP/2,则必须使用 TLS。系统不支持未加密的 HTTP/2。

如需查看受支持的协议的完整列表,请参阅负载均衡功能:从负载均衡器到后端的协议

WebSocket 支持

当您使用 HTTP 或 HTTPS 作为后端协议时,基于 Google Cloud HTTP(S) 的负载均衡器可以为 WebSocket 协议提供内置支持。负载均衡器无需进行任何配置即可代理 WebSocket 连接。

WebSocket 协议提供客户端和服务器之间的全双工通信通道。该通道由 HTTP(S) 请求发起。如需详细了解该协议,请参阅 RFC 6455

如果负载均衡器识别到来自 HTTP(S) 客户端的 WebSocket Upgrade 请求,并且后端实例为该请求返回了成功的 Upgrade 响应,则负载均衡器会在当前连接期间代理双向流量。如果后端实例未返回成功的 Upgrade 响应,则负载均衡器会关闭连接。

WebSocket 连接超时取决于负载均衡器的类型(全球、区域或传统)。如需了解详情,请参阅后端服务超时

WebSocket 的会话亲和性与其他任何请求的运作方式相同。如需了解详情,请参阅会话亲和性

将 gRPC 与您的 Google Cloud 应用搭配使用

gRPC 是远程过程调用的开源框架。它基于 HTTP/2 标准运行。适合使用 gRPC 的场景如下:

  • 延迟时间短、扩缩能力强的分布式系统
  • 开发与云服务器通信的移动客户端
  • 设计必须准确、高效并且独立于语言的新协议
  • 支持扩展、身份验证和日志记录的分层设计

如需将 gRPC 与您的 Google Cloud 应用搭配使用,您必须通过 HTTP/2 以端到端方式对请求进行代理。为此,请按以下说明操作:

  1. 配置 HTTPS 负载均衡器。
  2. 启用 HTTP/2 作为从负载均衡器到后端的协议。

在进行 SSL 握手过程中,负载均衡器会通过使用 ALPN TLS 扩展程序与客户端协商 HTTP/2。

负载均衡器仍然可以与某些客户端协商 HTTPS,或接受配置为在负载均衡器和后端实例之间使用 HTTP/2 的负载均衡器上的不安全 HTTP 请求。这些 HTTP 或 HTTPS 请求由负载均衡器进行转换,以便通过 HTTP/2 将请求代理到后端实例。

您必须在后端上启用 TLS。如需了解详情,请参阅从负载均衡器到后端的加密

如果要将 HTTP/2 与 Google Kubernetes Engine Ingress 搭配使用或者将 gRPC 和 HTTP/2 与 Ingress 搭配使用来配置外部应用负载均衡器,请参阅 HTTP/2 与 Ingress 搭配使用实现负载均衡

如需了解如何排查 HTTP/2 问题,请参阅排查后端 HTTP/2 问题

如需了解 HTTP/2 限制,请参阅 HTTP/2 限制

健康检查

每项后端服务都会指定健康检查,用于定期监控后端是否已准备好从负载均衡器接收连接。这样可以降低向无法处理请求的后端发送请求的风险。健康检查不会检查应用本身是否正常运行。

对于健康检查探测,您必须创建入站流量允许防火墙规则,以允许健康检查探测到达您的后端实例。通常,健康检查探测源自 Google 的集中式健康检查机制。

使用混合 NEG 后端的区域外部应用负载均衡器是此规则的一个例外,因为其健康检查源自代理专用子网。如需了解详情,请参阅混合 NEG 概览

健康检查协议

最佳实践是使用其协议与后端服务的协议相匹配的健康检查,不过这并非强制性要求,而且也不一定可行。例如,HTTP/2 健康检查能够最准确地测试后端的 HTTP/2 连接性。相比之下,使用混合 NEG 后端的区域级外部应用负载均衡器不支持 gRPC 健康检查。如需查看受支持的健康检查协议的列表,请参阅负载均衡功能

下表指定了每种模式下外部应用负载均衡器支持的健康检查范围。

负载均衡器模式 健康检查类型
全球外部应用负载均衡器 Global
传统应用负载均衡器 Global
区域级外部应用负载均衡器 区域

如需详细了解健康检查,请参阅以下内容:

防火墙规则

负载均衡器需要以下防火墙规则:

  • 对于全球外部应用负载均衡器,入站流量允许规则允许来自 Google Front End (GFE) 前端的流量到达您的后端。
    用于允许来自代理专用子网的流量到达您的后端的入站流量允许规则(对于区域级外部应用负载均衡器)。
  • 允许来自健康检查探测范围的流量的入站允许规则。如需详细了解健康检查探测以及必须允许来自它们的流量的原因,请参阅探测 IP 范围和防火墙规则

防火墙规则在虚拟机实例级层(而不是在 GFE 代理上)实现。您无法使用 Google Cloud 防火墙规则来阻止流量到达负载均衡器。对于全球外部应用负载均衡器和传统应用负载均衡器,您可以使用 Google Cloud Armor 来实现此目的。

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

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

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

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

下表汇总了防火墙规则所需的来源 IP 地址范围:

负载均衡器模式 健康检查来源范围 请求来源范围
全球外部应用负载均衡器
  • 35.191.0.0/16
  • 130.211.0.0/22
GFE 流量来源取决于后端类型:
  • 实例组、可用区 NEG (GCE_VM_IP_PORT) 和混合连接 NEG (NON_GCP_PRIVATE_IP_PORT):
    • 130.211.0.0/22
    • 35.191.0.0/16
  • 互联网 NEG(INTERNET_FQDN_PORTINTERNET_IP_PORT):
    • 34.96.0.0/20
    • 34.127.192.0/18
  • SERVERLESS NEG 和后端存储桶:Google 的生产网络会处理数据包路由
传统应用负载均衡器
  • 35.191.0.0/16
  • 130.211.0.0/22
GFE 流量来源取决于后端类型:
  • 实例组、可用区 NEG (GCE_VM_IP_PORT) 和混合连接 NEG (NON_GCP_PRIVATE_IP_PORT):
    • 35.191.0.0/16
    • 130.211.0.0/22
  • 互联网 NEG(INTERNET_FQDN_PORTINTERNET_IP_PORT):
    • 34.96.0.0/20
    • 34.127.192.0/18
  • SERVERLESS NEG 和后端存储桶:Google 的生产网络会处理数据包路由。
区域级外部应用负载均衡器
  • 35.191.0.0/16
  • 130.211.0.0/22

对于混合 NEG,无需将 Google 的健康检查探测范围列入许可名单。但是,如果您在单个后端服务中结合使用混合和可用区级 NEG,则需要将可用区级 NEG 的 Google 健康检查探测范围列入许可名单。
您配置的代理专用子网

共享 VPC 架构

外部应用负载均衡器支持使用共享 VPC 的网络。共享 VPC 可让组织将多个项目中的资源连接到一个公用 VPC 网络,让它们能够通过使用该网络中的内部 IP 地址安全高效地相互通信。如果您还不熟悉共享 VPC,请阅读共享 VPC 概览

在共享 VPC 网络中配置外部应用负载均衡器有多种方法。无论部署类型如何,负载均衡器的所有组件都必须位于同一组织中。

负载均衡器 前端组件 后端组件
全球外部应用负载均衡器

全球外部 IP 地址、转发规则、目标 HTTP(S) 代理和关联的网址映射必须在同一项目中定义。此项目可以是宿主项目,也可以是服务项目。

全球后端服务必须在后端(实例组或 NEG)所在的宿主项目或服务项目中定义。与后端服务相关的健康检查也必须在后端服务所在的项目中定义。

传统应用负载均衡器 全球外部 IP 地址、转发规则、目标 HTTP(S) 代理和关联的网址映射必须在后端所在的宿主项目或服务项目中定义。 全球后端服务必须在后端(实例组或 NEG)所在的宿主项目或服务项目中定义。与后端服务相关的健康检查也必须在后端服务所在的项目中定义。
区域级外部应用负载均衡器

在共享 VPC 宿主项目中创建所需的网络和代理专用子网。

区域外部 IP 地址、转发规则、目标 HTTP(S) 代理和关联的网址映射必须在同一项目中定义。此项目可以是宿主项目,也可以是服务项目。

您可以执行下列任一操作:
  • 在与前端组件相同的服务项目中创建后端服务和后端(实例组、无服务器 NEG 或任何其他受支持的后端类型)。
  • 根据需要在任意数量的服务项目中创建后端服务和后端(实例组、无服务器 NEG 或任何其他受支持的后端类型)。单个网址映射可以引用不同项目中的后端服务。这种类型的部署称为跨项目服务引用

每个后端服务都必须在其引用的后端所在的项目中定义。与后端服务相关的健康检查也必须在后端服务所在的项目中定义。

虽然您可以在共享 VPC 宿主项目中创建所有负载均衡组件和后端,但此部署类型不会划分网络管理和服务开发责任。

服务项目中的所有负载均衡器组件和后端

以下架构图展示了标准共享 VPC 部署,其中所有负载均衡器组件和后端都位于服务项目中。所有应用负载均衡器都支持此部署类型。

负载均衡器组件和后端必须使用相同的 VPC 网络。

共享 VPC 网络上的区域级外部应用负载均衡器
共享 VPC 网络上的区域级外部应用负载均衡器

共享 VPC 环境中的无服务器后端

对于使用无服务器 NEG 后端的负载均衡器,后端 Cloud Run 或 Cloud Functions 服务必须与无服务器 NEG 位于同一项目中。

此外,对于支持跨项目服务引用的区域外部应用负载均衡器,后端服务、无服务器 NEG 和 Cloud Run 服务必须始终位于同一服务项目中。

跨项目服务引用

在此模型中,负载均衡器的前端和网址映射位于宿主项目或服务项目中。负载均衡器的后端服务和后端可以在共享 VPC 环境中跨项目分布。系统可以在单个网址映射中引用跨项目后端服务。这称为跨项目服务引用

跨项目服务引用使组织可以配置一个中央负载均衡器并将流量路由到跨多个不同项目分布的数百个服务。您可以在一个网址映射中集中管理所有流量路由规则和政策。您还可以将负载均衡器与一组主机名和 SSL 证书相关联。这样,您就可以优化部署应用所需的负载均衡器数量,并降低可管理性、运营费用和配额要求。

通过为每个职能团队设置不同的项目,您还可以实现组织中的角色分离。服务所有者可以专注于在服务项目中构建服务,而网络团队可以在另一个项目中预配和维护负载均衡器,这两个角色都可以使用跨项目服务引用进行连接。

服务所有者可以维护其服务公开的自主性,并控制哪些用户可以通过使用负载均衡器访问其服务。这是通过名为 Compute Load Balancer Services User 角色 (roles/compute.loadBalancerServiceUser) 的特殊 IAM 角色实现的。

如需了解如何为区域级外部应用负载均衡器配置共享 VPC(无论是否使用跨项目服务引用),请参阅设置使用共享 VPC 的区域级外部应用负载均衡器

跨项目服务引用的已知限制

  • 跨项目服务引用可用于实例组、无服务器 NEG 或大部分其他受支持的后端类型。但是,存在以下限制:

    • 使用区域级外部应用负载均衡器时,如果后端服务具有区域级互联网 NEG 后端,则您无法引用跨项目后端服务。
  • 全球外部应用负载均衡器和传统应用负载均衡器不支持跨项目服务引用。
  • Google Cloud 不会区分多个项目中使用同一名称的资源(例如,后端服务)。因此,当您使用跨项目服务引用时,我们建议您在组织内的项目中使用唯一的后端服务名称。

示例 1:不同服务项目中的负载均衡器前端和后端

以下部署示例是在服务项目 A 中创建负载均衡器的前端和网址映射,并且网址映射引用服务项目 B 中的后端服务。

在这种情况下,服务项目 A 中的 Network Admin 或 Load Balancer Admin 将需要访问服务项目 B 中的后端服务。服务项目 B 的管理员将 compute.loadBalancerServiceUser IAM 角色授予服务项目 A 中希望引用服务项目 B 中的后端服务的 Load Balancer Admin。

服务项目中的负载均衡器前端和网址映射
不同服务项目中的负载均衡器前端和后端

示例 2:宿主项目中的负载均衡器前端和服务项目中的后端

在此类部署中,负载均衡器的前端和网址映射在宿主项目中创建,后端服务(和后端)在服务项目中创建。

在这种情况下,宿主项目中的 Network Admin 或 Load Balancer Admin 将需要访问服务项目中的后端服务。服务项目管理员将 compute.loadBalancerServiceUser IAM 角色授予宿主项目 A 中希望引用该服务项目中的后端服务的 Load Balancer Admin。

宿主项目中的负载均衡器前端和网址映射
宿主项目中的负载均衡器前端和网址映射

连接的工作原理

全球外部应用负载均衡器连接

全球外部应用负载均衡器由许多称为 Google Front End (GFE) 的代理实现。不只一个代理。在高级层级中,系统会从各个接入点通告相同的全球级外部 IP 地址,并将客户端请求定向到离客户端最近的 GFE。

根据您的客户端位置,多个 GFE 可以启动与后端的 HTTP(S) 连接。从 GFE 发送的数据包的来源 IP 地址,来自健康检查探测器所用的同一范围:35.191.0.0/16130.211.0.0/22

根据后端服务配置,每个 GFE 用于连接到后端的协议可以是 HTTP、HTTPS 或 HTTP/2。对于 HTTP 或 HTTPS 连接,使用的 HTTP 版本为 HTTP 1.1。

根据 HTTP 1.1 规范的规定,HTTP keepalive 默认处于启用状态。HTTP keepalive 会尝试高效使用相同的 TCP 会话;但无法保证。GFE 使用的客户端 HTTP keepalive 超时为 610 秒,默认后端 keepalive 超时为 600 秒。您可以更新客户端 HTTP keepalive 超时,但后端 keepalive 超时值是固定的。您可以通过设置后端服务超时来配置请求/响应超时。虽然密切相关,但 HTTP keepalive 和 TCP 空闲超时并不相同。如需了解详情,请参阅超时和重试

为了确保流量负载均衡,负载均衡器可能会在完成包含 Connection: close 标头的响应后发送 FIN ACK 数据包,从而彻底关闭 TCP 连接,或者也可能会在完成响应后发出 HTTP/2 GOAWAY 帧。此行为不会干扰任何活跃请求或响应。

HTTP 连接和 TCP 会话的数量因连接的 GFE 数量、连接到 GFE 的客户端数量、后端协议以及后端部署位置而异。

如需了解详情,请参阅解决方案指南《使用全局负载均衡进行应用容量优化》中的 外部应用负载均衡器的工作原理

区域级外部应用负载均衡器连接

区域级外部应用负载均衡器是在 Envoy 代理上实现的托管式服务。区域级外部应用负载均衡器使用名为代理专用子网的共享子网预配一组 IP 地址,供 Google 用于代表您运行 Envoy 代理。此代理专用子网的 --purpose 标志设置为 REGIONAL_MANAGED_PROXY。特定网络和区域中的所有基于 Envoy 的区域负载均衡器共享此子网。

客户端使用负载均衡器的 IP 地址和端口连接到负载均衡器。客户端请求会定向到与客户端位于同一区域的代理专用子网。负载均衡器终止客户端请求,然后打开从代理专用子网到您的后端的新连接。因此,从负载均衡器发送的数据包具有来自代理专用子网的来源 IP 地址。

根据后端服务配置,Envoy 代理用于连接到后端的协议可以是 HTTP、HTTPS 或 HTTP/2。如果是 HTTP 或 HTTPS,则 HTTP 版本为 HTTP 1.1。根据 HTTP 1.1 规范的规定,HTTP keepalive 默认处于启用状态。Envoy 代理将客户端 HTTP keepalive 超时和后端 keepalive 超时设置为默认值 600 秒。您可以更新客户端 HTTP keepalive 超时,但后端 keepalive 超时值是固定的。您可以通过设置后端服务超时来配置请求/响应超时。如需了解详情,请参阅超时和重试

客户端与负载均衡器的通信

  • 客户端可以使用 HTTP 1.1 或 HTTP/2 协议与负载均衡器进行通信。
  • 使用 HTTPS 时,新型客户端默认使用 HTTP/2。此配置是在客户端而非 HTTPS 负载均衡器上控制的。
  • 您无法通过更改负载均衡器的配置来停用 HTTP/2。不过,您可以将某些客户端配置为使用 HTTP 1.1 而不是 HTTP/2。例如,在 curl 中,请使用 --http1.1 参数。
  • 外部应用负载均衡器支持 HTTP/1.1 100 Continue 响应。

如需查看每种模式下外部应用负载均衡器转发规则所支持的协议的完整列表,请参阅负载均衡器功能

客户端数据包的来源 IP 地址

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

对于全球外部应用负载均衡器:
  • 连接 1,即从原始客户端到负载均衡器 (GFE) 的连接:

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

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

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

对于区域级外部应用负载均衡器:
  • 连接 1,从原始客户端到负载均衡器(代理专用子网):

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

    • 来源 IP 地址代理专用子网中的 IP 地址,该 IP 地址在与负载均衡器部署在同一区域和网络的所有基于 Envoy 的负载均衡器之间共享。

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

返回路径

对于全球外部应用负载均衡器,Google Cloud 使用未在您的 VPC 网络中定义的特殊路由来执行健康检查。如需了解详情,请参阅负载均衡器返回路径

对于区域级外部应用负载均衡器,Google Cloud 使用开源 Envoy 代理来终止发送到负载均衡器的客户端请求。负载均衡器会终止 TCP 会话并打开从区域的代理专用子网到后端的新 TCP 会话。在您的 VPC 网络中定义的路由可以实现从 Envoy 代理到后端以及从后端到 Envoy 代理的通信。

开放端口

GFE 具有多个开放端口,用于支持在同一架构上运行的其他 Google 服务。运行端口扫描时,您可能会看到 GFE 上运行的其他 Google 服务的其他开放端口。

基于 GFE 的负载均衡器(全球外部应用负载均衡器和传统应用负载均衡器)始终将端口 80 和 443 显示为开放状态(连同您在负载均衡器的转发规则中配置的任何其他端口)。但是,如果您尚未为端口 80 或端口 443 配置转发规则,则发送到这些端口的任何连接都会被拒绝。相反,区域级外部应用负载均衡器是使用 Envoy 代理实现的,并且不会在扫描期间显示额外的开放端口。

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

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

    GFE 可实现 Google Cloud Armor 等安全功能。借助 Google Cloud Armor 标准版,GFE 可提供始终有效的保护,以防范耗尽容量的 DDoS 攻击和基于协议的 DDoS 攻击以及泛洪攻击。即使您未明确配置 Google Cloud Armor,也可以使用此保护。您仅需在配置安全政策或注册 Managed Protection Plus 时支付费用。

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

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

  • 安全审核者应检查负载均衡器配置的转发规则配置。转发规则定义负载均衡器接受数据包并将其转发到后端的目标端口。对于基于 GFE 的负载均衡器,每条外部转发规则只能引用单个目的地 TCP 端口。对于使用 TCP 端口 443 的负载均衡器,当连接升级到 QUIC (HTTP/3) 时,系统将使用 UDP 端口 443。

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

TLS 终结

下表总结了每种模式下外部应用负载均衡器如何处理 TLS 终结。

负载均衡器模式 TLS 终结
全球外部应用负载均衡器 TLS 在 GFE 上终结,这个 GFE 可能位于全球任何位置。
传统应用负载均衡器 TLS 在 GFE 上终结,可能位于全球任何地方。
区域级外部应用负载均衡器 TLS 在位于用户所选区域中的代理专用子网的 Envoy 代理上终结。如果您需要对 TLS 终结所在的区域进行地理位置控制,请使用此负载均衡器模式。

超时和重试

外部应用负载均衡器支持以下类型的超时:

超时类型和说明 默认值 支持自定义值
Global 经典版 区域
后端服务超时1

请求和响应超时。表示从负载均衡器将 HTTP 请求的第一个字节发送到后端,到后端返回 HTTP 响应的最后一个字节时可能经过的最长时间。如果未在请求或响应超时的时间内将整个 HTTP 响应返回到负载均衡器,则剩余响应数据会被丢弃。

对于与传统应用负载均衡器搭配使用的 WebSocket,这是 WebSocket 的最长持续时间,无论是空闲还是活跃状态。

  • 对于后端服务上的无服务器 NEG:60 分钟
  • 对于后端服务上的所有其他后端类型:30 秒
  • 对于后端存储桶:24 小时(86,400 秒)
2 2
客户端 HTTP keepalive 超时
客户端与负载均衡器的代理之间的 TCP 连接的最大空闲时间。(同一 TCP 连接可用于多个 HTTP 请求)。
  • 对于全球外部应用负载均衡器和传统应用负载均衡器,负载均衡器的代理是第一层 GFE。
  • 对于区域级外部应用负载均衡器,负载均衡器的代理是 Envoy 软件。
  • 对于全球外部应用负载均衡器和传统应用负载均衡器:610 秒
  • 对于区域级外部应用负载均衡器:600 秒
后端 HTTP keepalive 超时
负载均衡器的代理与后端之间的 TCP 连接的最大空闲时间。(同一 TCP 连接可用于多个 HTTP 请求)。
  • 对于全球外部应用负载均衡器和传统应用负载均衡器,负载均衡器的代理是第二层 GFE。
  • 对于区域级外部应用负载均衡器,负载均衡器的代理是 Envoy 软件。
  • 对于后端服务:10 分钟(600 秒)
  • 对于后端存储桶:6 分钟(360 秒)
QUIC 会话空闲超时
QUIC 会话在(下游)客户端和全球外部应用负载均衡器或传统应用负载均衡器的 GFE 之间可以空闲的最长时间。

对于全球外部应用负载均衡器和传统应用负载均衡器:

QUIC 会话空闲超时是客户端空闲超时或 GFE 空闲超时(300 秒)中的最小值。

GFE 空闲超时固定为 300 秒。您可以配置客户端空闲超时。

1对于无服务器 NEG 后端不可配置。对于后端存储桶不可配置。

2配置支持不适用于 WebSocket。

后端服务超时

可配置的后端服务超时表示负载均衡器等待后端处理 HTTP 请求并返回相应的 HTTP 响应的最长时间。除无服务器 NEG 外,后端服务超时的默认值为 30 秒。

例如,如果您要下载一个 500 MB 的文件,并且后端服务超时值为 90 秒,则负载均衡器期望后端在 90 秒内传送整个 500 MB 的文件。有时,配置的后端服务超时值可能会不够长,使得后端无法发送其完整的 HTTP 响应。在这种情况下,如果负载均衡器至少收到来自后端的 HTTP 响应标头,则负载均衡器会返回完整响应标头以及在后端服务超时内尽可能获取的响应正文部分。

您应将后端服务超时设置为您希望后端处理 HTTP 响应所需的最长时间。如果后端上运行的软件需要更多时间来处理 HTTP 请求并返回完整响应,则您应增加后端服务超时值。例如,如果您看到带有 jsonPayload.statusDetail client_timed_out 的 HTTP 408 响应,则应增加超时。

后端服务超时接受 12,147,483,647 秒之间的值,但过大的值不是切实可行的配置选项。Google Cloud 不保证底层 TCP 连接在后端服务超时的整个期间保持打开状态。客户端系统必须实现重试逻辑,而不是依赖 TCP 连接长时间保持打开状态。

补充说明:

  • WebSocket 连接超时取决于负载均衡器的类型:

    • 对于传统应用负载均衡器,WebSocket 连接的超时时间取决于负载均衡器的可配置后端服务超时,默认为 30 秒。该超时适用于 WebSocket 连接,无论其是否正在使用。
    • 对于全球外部应用负载均衡器和区域级外部应用负载均衡器,活跃的 WebSocket 连接不遵循后端服务超时。空闲 WebSocket 连接会在后端服务超时后关闭。
    • 此外,全球外部应用负载均衡器和传统版应用负载均衡器使用的 WebSocket 连接会在 24 小时后自动关闭。此 24 小时限制不可自定义,无论连接是否正在使用,或者后端服务超时值是否设置为大于 86,400 秒(24 小时)的值,都会出现此限制。
  • 对于全球外部应用负载均衡器或传统应用负载均衡器,不建议使用超过一天(86400 秒)的后端服务超时值,因为 Google Cloud 会定期重启 Google Front End,以便获取软件更新和其他日常维护。 后端服务超时值不会使 Google 维护活动延迟。后端服务超时值越大,Google 终止 TCP 连接以进行维护的可能性就越大。

  • 对于区域级外部应用负载均衡器,Google Cloud 会定期重启或更改响应 Envoy 软件任务的数量。后端服务超时值越大,Envoy 任务重启或替换终止 TCP 连接的可能性就越大。

区域级外部应用负载均衡器支持网址映射 routeActions.timeout 参数,该参数可替换后端服务超时。如果省略 routeActions.timeout,则会使用后端服务超时的值。如果提供了 routeActions.timeout,后端服务超时会被忽略,并且 routeActions.timeout 会被用作请求和响应超时。

如需配置后端服务超时,请使用以下方法之一:

客户端 HTTP keepalive 超时

客户端 HTTP keepalive 超时表示(下行)客户端与以下代理类型之间的 TCP 连接最大空闲时间:

  • 对于全球外部应用负载均衡器或传统应用负载均衡器:第一层 Google Front End
  • 对于区域级外部应用负载均衡器:Envoy 代理

HTTP keepalive 超时表示底层 TCP 连接的 TCP 空闲超时。 客户端 HTTP keepalive 超时不适用于 WebSocket。

  • 对于全球外部应用负载均衡器,默认值为 610 秒。您可以将客户端 HTTP keepalive 超时配置为 5 到 1200 秒之间的值。
  • 对于传统应用负载均衡器,客户端 HTTP keepalive 超时固定为 610 秒。
  • 对于区域级外部应用负载均衡器,客户端 HTTP keepalive 超时固定为 600 秒。

如需配置 keepalive 超时参数,请使用以下方法之一:

负载均衡器的客户端 HTTP keepalive 超时应大于下行客户端或代理使用的 HTTP keepalive(TCP 空闲)超时。如果下行客户端的 HTTP keepalive(TCP 空闲)超时大于负载均衡器的客户端 HTTP keepalive 超时,则可能会出现竞态条件。从下行客户端的角度来看,已建立的 TCP 连接可以空闲的时间超过负载均衡器允许的时长。这意味着,在负载均衡器认为 TCP 连接已关闭后,下行客户端可以发送数据包。发生这种情况时,负载均衡器会以 TCP 重置 (RST) 数据包进行响应。

后端 HTTP keepalive 超时

外部应用负载均衡器是至少使用两个 TCP 连接的代理:

  • 对于全球外部应用负载均衡器或传统应用负载均衡器,下游(客户端)和第一层 GFE 之间存在第一个 TCP 连接。第一层 GFE 连接到第二层 GFE,然后第二层 GFE 打开与后端的第二个 TCP 连接。

  • 对于区域级外部应用负载均衡器,第一个 TCP 连接存在于(下行)客户端和 Envoy 代理之间。然后,Envoy 代理会打开与后端的第二个 TCP 连接。

负载均衡器的第二个 TCP 连接可能不会在每次请求后关闭;它们可以保持打开状态,以处理多个 HTTP 请求和响应。后端 HTTP keepalive 超时定义了负载均衡器与后端之间的 TCP 空闲超时。后端 HTTP keepalive 超时不适用于 WebSocket。

后端 keepalive 超时固定为 10 分钟(600 秒),无法更改。负载均衡器的后端 keepalive 超时应小于后端上运行的软件使用的 keepalive 超时。这样可以避免出现竞态条件,在竞态条件下,后端的操作系统可能通过 TCP 重置 (RST) 关闭 TCP 连接。由于负载均衡器的后端 keepalive 超时不可配置,因此您必须配置后端软件,以使其 HTTP keepalive(TCP 空闲)超时值大于 600 秒。

下表列出了修改常用 Web 服务器软件的 keepalive 超时值需要进行的更改。

Web 服务器软件 参数 默认设置 推荐设置
Apache KeepAliveTimeout KeepAliveTimeout 5 KeepAliveTimeout 620
nginx keepalive_timeout keepalive_timeout 75s; keepalive_timeout 620s;

QUIC 会话空闲超时

QUIC 会话空闲超时表示 QUIC 会话在客户端与全球外部应用负载均衡器或传统应用负载均衡器的 GFE 之间可以空闲的最长时间。

QUIC 会话空闲超时值定义为客户端空闲超时或 GFE 空闲超时(300 秒)中的最小值。GFE 空闲超时固定为 300 秒。您可以配置客户端空闲超时。

重试

对重试逻辑的支持取决于外部应用负载均衡器的模式。

负载均衡器模式 重试逻辑
全球外部应用负载均衡器

可以使用网址映射中的重试政策进行配置。默认重试次数 (numRetries) 为 1。可以使用重试政策配置的重试次数上限为 25。每次尝试的默认超时 (perTryTimeout) 为 30 秒,perTryTimeout 最多可配置为 24 小时。

如果没有重试政策,则没有 HTTP 正文(例如,GET 请求)并导致 HTTP 502503504 响应 (retryConditions=["gateway-error"]) 的失败请求会重试一次。

HTTP POST 请求不会重试。

重试请求仅会为最终响应生成一个日志条目。

传统应用负载均衡器

对于连接重试,重试政策无法更改。

HTTP POST 请求不会重试。

只要至少 80% 的后端健康状况良好,HTTP GET 请求就会始终重试一次。如果实例组中只有一个后端实例,并且与该后端实例之间的连接失败,则不健康后端实例的百分比为 100%,因此 GFE 不会重试请求。

如果第一个请求在从后端实例接收响应标头之前失败,则负载均衡器会重试失败的 GET 请求。

重试请求仅会为最终响应生成一个日志条目。如需了解详情,请参阅外部应用负载均衡器日志记录和监控

请求失败会导致负载均衡器合成 HTTP 502 响应。

区域级外部应用负载均衡器

可以使用网址映射中的重试政策进行配置。默认重试次数 (numRetries) 为 1。可以使用重试政策配置的重试次数上限为 25。每次尝试的默认超时 (perTryTimeout) 为 30 秒,perTryTimeout 最多可配置为 24 小时。

如果没有重试政策,则没有 HTTP 正文(例如,GET 请求)并导致 HTTP 502503504 响应的失败请求会重试一次。

HTTP POST 请求不会重试。

重试请求仅会为最终响应生成一个日志条目。

GKE Ingress 支持 WebSocket 协议。

非法的请求和响应处理

HTTP(S) 负载均衡器会因为许多原因阻止客户端请求和后端响应到达后端或客户端。有些是为了严格遵循 HTTP/1.1 合规要求,有些则是为了避免数据意外传入或传出后端。您无法停用这些检查。

为了满足 HTTP/1.1 合规要求,负载均衡器会阻止具有以下特征的请求和/或响应:

  • 它无法解析请求的第一行。
  • 标头缺少 : 分隔符。
  • 标头或第一行包含无效字符。
  • 内容长度不是有效数字,或者有多个内容长度标头。
  • 存在多个传输编码密钥,或者存在无法识别的传输编码值。
  • 存在非数据块正文且没有指定内容长度。
  • 正文数据块无法解析。这是某些数据到达后端的唯一情况。负载均衡器会在收到无法解析的数据块时关闭与客户端和后端的连接。

如果存在以下任一情况,负载均衡器便会阻止请求:

  • 请求标头和请求网址的总大小超过外部应用负载均衡器的请求标头大小上限。
  • 请求方法不允许有正文,但请求有正文。
  • 请求包含 Upgrade 标头,但 Upgrade 标头并没有用来启用 WebSocket 连接。
  • HTTP 版本未知。

如果存在以下任一情况,负载均衡器便会阻止后端的响应:

  • 响应标头的总大小超过外部应用负载均衡器的响应标头大小上限。
  • HTTP 版本未知。

流量分配

将后端实例组或 NEG 添加到后端服务时,您可指定一种均衡模式,用于定义衡量后端负载和目标容量的方法。外部应用负载均衡器支持两种平衡模式:

  • 对于实例组或 NEG,RATE 是每秒的目标最大请求次数 (RPS) 或查询次数 (QPS)。如果所有后端都达到或超过容量,则实际 RPS/QPS 可以超过目标最大 RPS/QPS。

  • UTILIZATION 是实例组中虚拟机的后端利用率。

流量在后端之间的分配方式取决于负载均衡器的模式。

全球外部应用负载均衡器

在 Google Front End (GFE) 向后端实例发送请求之前,GFE 会估算哪些后端实例的容量可用于接收请求。系统会主动进行此容量估算,而不是在收到请求的同时进行估算。GFE 会定期接收有关可用容量的信息,并相应地分配传入请求。

容量的含义部分取决于均衡模式。对于 RATE 模式,它相对简单:GFE 精确地确定它每秒可以分配的请求数。基于 UTILIZATION 的负载均衡更复杂:负载均衡器检查实例的当前利用率,然后估算每个实例可以处理的查询负载。此估算值会随着时间的推移随实例利用率和流量模式的变化而变化。

这两个因素(容量估算和主动分配)都会影响各个实例之间的分布。因此,Cloud Load Balancing 的行为与简单的轮询负载均衡器不同,后者在两个实例之间精确地 (50:50) 分布请求。相反,Google Cloud 负载均衡会尝试针对每个请求优化后端实例选择。

对于全球外部应用负载均衡器,负载均衡分为两个层级。均衡模式决定了应发送到每个后端(实例组或 NEG)的流量的权重或比例。然后,负载均衡政策 (LocalityLbPolicy) 会确定流量如何分配到组中的实例或端点。如需了解详情,请参阅负载均衡位置政策(后端服务 API 文档)

对于传统应用负载均衡器,均衡模式用于选择最合适的后端(实例组或 NEG)。然后,流量通过轮循方式在后端的实例或端点之间分配。

请求的分配方式

基于 GFE 的外部应用负载均衡器使用以下过程分发传入请求:

  1. 从客户端到第一层 GFE。边缘路由器会在 Google 网络的边界上通告转发规则的外部 IP 地址。每个通告都会列出第 3/4 层负载均衡系统 (Maglev) 的下一个跃点。Maglev 系统将流量路由到第一层 Google Front End (GFE)。
    • 使用高级层级时,Google 会从全球所有入网点通告您的负载均衡器的 IP 地址。每个负载均衡器 IP 地址都是全球任播。
    • 使用标准层级时,Google 会从与转发规则的区域关联的入网点通告您负载均衡器的 IP 地址。负载均衡器使用区域级外部 IP 地址。使用标准层级转发规则会将实例组和区域 NEG 后端限制为与负载均衡器的转发规则位于同一区域。
  2. 从第一层 GFE 到第二层 GFE。第一层 GFE 会根据需要终止传输层安全协议 (TLS),然后按照以下过程将流量路由到第二层 GFE:
    • 第一层 GFE 会解析网址映射,并选择后端服务或后端存储桶。
    • 对于具有互联网 NEG 的后端服务,第一层 GFE 会选择与之所在位置相同的第二层外部转发网关。转发网关向互联网 NEG 端点发送请求。互联网 NEG 的请求分配过程到此结束。
    • 对于具有无服务器 NEGPrivate Service Connect (PSC) NEG 和后端存储桶的后端服务,第一层 GFE 会选择与 NEG 或存储桶所在区域相匹配区域中的第二层 GFE。对于多区域 Cloud Storage 存储桶,第一层 GFE 会选择尽可能接近第一层 GFE(按网络往返时间确定)的区域中的第二层 GFE。
    • 对于具有实例组、包含 GCE_VM_IP_PORT 端点的可用区级 NEG混合 NEG 的后端服务,Google 的容量管理系统会告知第一层 GFE 每个后端的已用和已配置容量。为后端配置的容量由均衡模式、均衡模式的目标容量以及容量扩缩器定义。
      • 标准层级:第一层 GFE 选择包含后端的区域中的第二层 GFE。
      • 高级层级:第一层 GFE 从一组适用区域中选择第二层 GFE。适用区域是已配置后端的所有区域,不包括将后端容量配置为零的区域。第一层 GFE 选择适用区域中最接近的第二层 GFE(按网络往返时间确定)。如果后端在两个或更多区域中进行配置,则如果首次选择的区域已满,第一层 GFE 可能会将请求溢出到其他适用区域。当首次所选区域中所有后端的容量均已用尽时,可能会溢出到其他区域。
  3. 第二层 GFE 选择后端。第二层 GFE 位于区域的可用区中。他们使用以下流程选择后端:
    • 对于具有无服务器 NEG、Private Service Connect NEG 和后端存储桶的后端服务,第二层 GFE 将请求转发到 Google 的生产系统。这些后端的请求分配过程到此结束。
    • 对于具有实例组、包含 GCE_VM_IP_PORT 端点的可用区级 NEG 和混合 NEG 的后端服务,Google 的健康检查探测系统会告知第二层 GFE 后端实例或端点的健康检查状态。

      仅限高级层级:如果第二层 GFE 的区域内没有健康状况良好的后端实例或端点,则可能会向已配置后端的其他适用区域中的另一个第二层 GFE 发送请求。不同区域中第二层 GFE 之间的溢出不会耗尽所有可能的区域到区域组合。如果您需要引导流量离开特定区域内的后端,不要将后端配置为无法通过健康检查,而是应将后端的容量扩缩器设置为零,这样,第一层 GFE 会排除上一步中的区域。

    然后,第二层 GFE 会将请求定向到其所在区域内可用区中的后端实例或端点,如下一步中所讨论。

  4. 第二层 GFE 选择可用区。默认情况下,第二层 GFE 使用 WATERFALL_BY_REGION 算法,其中每个第二层 GFE 更倾向于选择包含第二层 GFE 的同一可用区中的后端实例或端点。由于 WATERFALL_BY_REGION 可最大限度减少可用区之间的流量,因此在低请求速率下,每个第二层 GFE 可能只向第二层 GFE 本身所在可用区中的后端发送请求。

    仅对于全球外部应用负载均衡器,可使用 serviceLbPolicy 将第二层 GFE 配置为使用以下替代算法之一:

    • SPRAY_TO_REGION:第二层 GFE 不建议选择与之位于同一可用区的后端实例或端点。第二层 GFE 尝试将流量分配到区域的所有可用区中的所有后端实例或端点。这样可以实现更均匀的负载分配,但代价是可用区之间的流量会增加。
    • WATERFALL_BY_ZONE:第二层 GFE 强烈建议选择与之位于同一可用区的后端实例或端点。只有在当前可用区中的所有后端达到其配置的容量之后,第二层 GFE 才会将请求定向到其他可用区中的后端。
  5. 第二层 GFE 选择该可用区内的实例或端点。 默认情况下,第二层 GFE 以轮循方式在后端之间分配请求。对于全球外部应用负载均衡器,您可以使用负载均衡位置政策 (localityLbPolicy) 来更改此设置。负载均衡位置政策仅适用于上一步中讨论的所选可用区内的后端。

区域级外部应用负载均衡器

对于区域级外部应用负载均衡器,流量分配取决于负载均衡模式和负载均衡位置政策。

均衡模式决定了应发送到每个组(实例组或 NEG)的流量的权重和比例。负载均衡位置政策 (LocalityLbPolicy) 决定了组中后端的负载均衡方式。

当后端服务收到流量时,它首先会根据后端的均衡模式将流量定向到后端(实例组或 NEG)。选择后端后,系统会根据负载均衡位置政策在后端组中的实例或端点之间分配流量。

详情请参阅以下内容:

会话亲和性

只要后端运行状况良好且有可用容量,会话亲和性就会根据配置的均衡模式,尽力尝试将来自特定客户端的请求发送到同一个后端。

使用会话亲和性时,我们建议您使用 RATE 均衡模式,而不是 UTILIZATION。如果您将均衡模式设置为每秒请求次数 (RPS),则会话亲和性的效果最佳。

外部应用负载均衡器提供以下类型的会话亲和性:

下表总结了每种模式下外部应用负载均衡器支持的会话亲和性选项:

负载均衡器模式 会话亲和性选项
  客户端 IP 生成的 Cookie 标头字段 HTTP Cookie
全球外部应用负载均衡器
传统应用负载均衡器
区域级外部应用负载均衡器

HTTP/2 支持

HTTP/2 是 HTTP/1 协议的主要修订版本。客户端与外部应用负载均衡器之间的连接以及负载均衡器与其后端之间的连接支持 HTTP/2。

在进行 TLS 握手过程中,负载均衡器会通过使用 ALPN TLS 扩展程序与客户端自动协商 HTTP/2。即使负载均衡器配置为使用 HTTPS,新型客户端也会默认使用 HTTP/2。此配置是在客户端而非负载均衡器上控制的。

如果客户端不支持 HTTP/2,并且负载均衡器配置为在负载均衡器和后端实例之间使用 HTTP/2,则负载均衡器可能仍会协商 HTTPS 连接或接受不安全的 HTTP 请求。 然后,负载均衡器会转换这些 HTTPS 或 HTTP 请求,以便通过 HTTP/2 将请求代理到后端实例。

如需使用 HTTP/2,您必须在后端上启用 TLS。如需了解详情,请参阅从负载均衡器到后端的加密

HTTP/2 并发流数量上限

HTTP/2 SETTINGS_MAX_CONCURRENT_STREAMS 设置说明了由对等方发起并由端点接受的最大流数。HTTP/2 客户端向 Google Cloud 负载均衡器通告的值实际上毫无意义,因为负载均衡器不会向客户端发起流。

如果负载均衡器使用 HTTP/2 与在虚拟机上运行的服务器通信,则负载均衡器遵循服务器所通告的 SETTINGS_MAX_CONCURRENT_STREAMS 值。如果通告零值,则负载均衡器无法将请求转发给服务器,这可能会导致错误。

HTTP/2 限制

  • 在负载均衡器和实例之间使用 HTTP/2 时,需要与实例之间建立的 TCP 连接数量要比使用 HTTP(S) 时多得多。目前,HTTP/2 不支持连接池;连接池是一项优化功能,可通过 HTTP(S) 减少这些连接的数量。 因此,您可能会看到后端延迟时间较长,因为系统会进行更频繁的后端连接。
  • 在负载均衡器和后端之间使用 HTTP/2 时,不支持通过单个 HTTP/2 连接流 (WebSocket) 协议 (RFC 8441) 运行 WebSocket 协议。
  • 负载均衡器和后端之间的 HTTP/2 不支持服务器推送。
  • Google Cloud API 或 Google Cloud 控制台中不会显示 gRPC 错误率和请求量。因此,即便 gRPC 端点返回错误,负载均衡器日志和监控数据仍会报告 OK 200 HTTP 响应代码。

HTTP/3 支持

HTTP/3 是新一代互联网协议。它在根据原始 Google QUIC 协议开发的 IETF QUIC 协议的基础上构建。外部应用负载均衡器、Cloud CDN 和客户端之间支持 HTTP/3。

具体而言:

  • IETF QUIC 为传输层协议,可提供与 TCP 类似的拥塞控制和可靠性,它使用 TLS 1.3 实现安全性并提升性能。
  • HTTP/3 是以 IETF QUIC 为基础构建的应用层,它依赖 QUIC 来处理多路复用、拥塞控制、损失检测和重新传输。
  • HTTP/3 可以更快地启动客户端连接,消除了多路复用流中的队头阻塞,并且支持客户端 IP 地址更改时的连接迁移。
  • 客户端和负载均衡器之间的连接支持 HTTP/3,负载均衡器和后端之间的连接不支持 HTTP/3。
  • HTTP/3 连接使用 BBR 拥塞控制算法。

在负载均衡器上启用 HTTP/3 可以缩短网页加载时间、减少视频重新缓冲,以及提高延迟时间较长的连接的吞吐量。

下表指定了每种模式下外部应用负载均衡器的 HTTP/3 支持。

负载均衡器模式 HTTP/3 支持
全球外部应用负载均衡器(始终使用高级层级)
高级层级中的传统应用负载均衡器
标准层级中的传统应用负载均衡器
区域级外部应用负载均衡器(高级层级或标准层级)

如何协商 HTTP/3

启用 HTTP/3 后,负载均衡器会向客户端通告此支持,让支持 HTTP/3 的客户端尝试与 HTTPS 负载均衡器建立 HTTP/3 连接。

  • 实施得当的客户端在无法建立 HTTP/3 连接时始终回退为使用 HTTPS 或 HTTP/2。
  • 支持 HTTP/3 的客户端使用它们缓存的关于 HTTP/3 支持的先前知识,以节省未来不必要的往返。
  • 因此,在负载均衡器中启用或停用 HTTP/3 不会影响负载均衡器连接到客户端的能力。

Alt-Svc HTTP 响应标头中通告支持。启用 HTTP/3 时,来自负载均衡器的响应包括以下 alt-svc 标头值:

alt-svc: h3=":443"; ma=2592000,h3-29=":443"; ma=2592000"

如果 HTTP/3 已明确设置为 DISABLE,则响应不包含 alt-svc 响应标头。

当您在 HTTPS 负载均衡器上启用 HTTP/3 时,某些情况会导致您的客户端回退为使用 HTTPS 或 HTTP/2 而不是协商 HTTP/3。其中包括:

  • 客户端支持的 HTTP/3 版本与 HTTPS 负载均衡器支持的 HTTP/3 版本不兼容。
  • 负载均衡器检测到 UDP 流量阻塞或速率受限以致 HTTP/3 无法工作。
  • 客户端完全不支持 HTTP/3,因此不尝试协商 HTTP/3 连接。

如果连接回退为使用 HTTPS 或 HTTP/2,则我们不会将此视为负载均衡器故障。

启用 HTTP/3 之前,请确保您的工作负载可接受上述行为。

配置 HTTP/3

NONE(默认)和 ENABLE 均为您的负载均衡器启用 HTTP/3 支持。

启用 HTTP/3 后,负载均衡器会将其通告给客户端,以便支持它的客户端与负载均衡器协商 HTTP/3 版本。不支持 HTTP/3 的客户端不会协商 HTTP/3 连接。除非您已确定存在损坏的客户端实现,否则无需明确停用 HTTP/3。

外部应用负载均衡器提供了三种配置 HTTP/3 的方法,如下表所示。

quicOverride 值 行为
NONE

向客户端通告 HTTP/3 的支持。

ENABLE

向客户端通告 HTTP/3 的支持。

注意:HTTP/3 尚不支持 TLS 0-RTT(也称为 TLS 早期数据)。

DISABLE 明确停用向客户端通告 HTTP/3 和 Google QUIC。

如需明确启用(或停用)HTTP/3,请按照以下步骤操作。

控制台:HTTPS

  1. 在 Google Cloud 控制台中,转到负载均衡页面。

    转到“负载均衡”

  2. 选择要修改的负载均衡器。

  3. 点击前端配置

  4. 选择要修改的前端 IP 地址和端口。如需修改 HTTP/3 配置,协议必须为 HTTPS。

启用 HTTP/3

  1. 选择 QUIC 协商下拉列表。
  2. 如需为此前端明确启用 HTTP/3,请选择已启用
  3. 如果有多个表示 IPv4 和 IPv6 的前端规则,请务必为每个规则启用 HTTP/3。

停用 HTTP/3

  1. 选择 QUIC 协商下拉列表。
  2. 如需为此前端明确停用 HTTP/3,请选择已停用
  3. 如果有多个表示 IPv4 和 IPv6 的前端规则,请务必为每个规则停用 HTTP/3。

gcloud:HTTPS

在运行此命令之前,您必须为每个证书创建一个 SSL 证书资源。

gcloud compute target-https-proxies create HTTPS_PROXY_NAME \
    --global \
    --quic-override=QUIC_SETTING

QUIC_SETTING 替换为以下项之一:

  • NONE(默认值):允许 Google 控制通告 HTTP/3 的时间。

    当您选择 NONE 时,系统会向客户端通告 HTTP/3,但不会通告 Google QUIC。在 Google Cloud 控制台中,此选项称为自动(默认)

  • ENABLE:向客户端通告 HTTP/3。

  • DISABLE:不向客户端通告 HTTP/3。

API:HTTPS

POST https://www.googleapis.com/v1/compute/projects/PROJECT_ID/global/targetHttpsProxies/TARGET_PROXY_NAME/setQuicOverride

{
  "quicOverride": QUIC_SETTING
}

QUIC_SETTING 替换为以下项之一:

  • NONE(默认值):允许 Google 控制通告 HTTP/3 的时间。

    目前,当您选择 NONE 时,系统会向客户端通告 HTTP/3,但不会通告 Google QUIC。

    在 Google Cloud 控制台中,此选项称为自动(默认)

  • ENABLE:向客户端通告 HTTP/3 和 Google QUIC。

  • DISABLE:不向客户端通告 HTTP/3 或 Google QUIC。

限制

  • 终止 SSL 连接时,HTTPS 负载均衡器不会发送 close_notify 关闭提醒。也就是说,负载均衡器会关闭 TCP 连接,而不是执行 SSL 关停。
  • HTTPS 负载均衡器仅支持在证书的通用名称 (CN) 特性或主题备用名称 (SAN) 特性中网域包含小写字符。只有在目标代理中设置为主证书时,系统才会返回网域中包含大写字符的证书。
  • 除了连接到互联网 NEG 后端的负载均衡器之外,HTTPS 负载均衡器在连接到后端时不会使用服务器名称指示 (SNI) 扩展程序。如需了解详情,请参阅从负载均衡器到后端的加密
  • 在共享 VPC 环境中将区域外部应用负载均衡器与 Cloud Run 搭配使用时,服务项目中的独立 VPC 网络可以将流量发送到在同一共享 VPC 环境中的其他任何项目中部署的任何其他 Cloud Run 服务。这是一个已知问题,未来将阻止这种形式的访问。
  • Google Cloud 不保证底层 TCP 连接在后端服务超时的整个期间保持打开状态。客户端系统必须实现重试逻辑,而不是依赖 TCP 连接长时间保持打开状态。
  • 您无法使用 Google Cloud 控制台在高级层级创建区域级外部应用负载均衡器。请改用 gcloud CLI 或 API。

后续步骤