外部 HTTP(S) 负载平衡概览

本文档介绍了配置 Google Cloud 外部 HTTP(S) 负载平衡时需要了解的概念。

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

本页面介绍独立外部 HTTP(S) 负载平衡器的架构。如果您要将 GKE 中的应用公开给互联网,我们建议您使用适用于外部 HTTP(S) 负载均衡的内置 GKE Ingress

外部 HTTP(S) 负载均衡器的模式

您可以使用以下模式配置外部 HTTP(S) 负载均衡:

  • 外部 HTTP(S) 负载均衡器这是在标准层级中为区域级且在优质层级中为全球级的外部 HTTP(S) 负载均衡器。外部 HTTP(S) 负载均衡器在 Google Front End (GFE) 上实现。这些 GFE 分布于全球各地,可通过 Google 的全球网络和控制平面协同运作。
  • 区域级外部 HTTP(S) 负载均衡器(预览版)。这是一个区域级负载均衡器,它作为开源 Envoy 代理上的代管式服务实现。该均衡器具有高级流量管理功能,例如流量镜像、基于权重的流量拆分、基于请求/响应的标头转换等。
负载均衡器模式 推荐的用例 技能
外部 HTTP(S) 负载平衡器

这是在标准层级中为区域级且在优质层级中为全球级的外部 HTTP(S) 负载均衡器。

优质网络服务层级中,外部 HTTP(S) 负载均衡器可提供多区域负载均衡功能,进而将流量定向到健康状况良好、有充足容量的最近后端,并尽可能接近您的用户的位置终止 HTTP(S) 流量。

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

如需查看功能的完整列表,请参阅负载均衡功能页面。
具有高级流量管理功能的区域级外部 HTTP(S) 负载均衡器(预览版

此负载均衡器具有现有外部 HTTP(S) 负载均衡器的许多功能,以及其他高级流量管理功能。

这是推荐的外部 HTTP(S) 负载均衡器,用于仅从一个地理位置传送内容(例如,为符合合规性规定)。

当仅需要区域级后端服务或需要标准网络服务层级时,请使用此负载均衡器。

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

架构

部署外部 HTTP(S) 负载均衡器需要以下资源:

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

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

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

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

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

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

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

全球模式

下图展示了外部 HTTP(S) 负载均衡器部署的组件。

外部 HTTP(S) 负载均衡器组件
外部 HTTP(S) 负载均衡器组件

区域模式

下图展示了区域级外部 HTTP(S) 负载均衡器部署的组件。

区域级外部 HTTP(S) 负载均衡器组件
区域级外部 HTTP(S) 负载均衡器组件

代理专用子网

仅区域级外部 HTTP(S) 负载均衡器需要代理专用子网

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

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

转发规则和地址

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

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

  • HTTP 负载平衡器的转发规则只能引用 TCP 端口 80 和 8080。
  • HTTPS 负载平衡器的转发规则只能引用 TCP 端口 443。

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

负载均衡器模式 网络服务层级 转发规则、IP 地址和负载均衡方案 从互联网到负载均衡器前端的路由
外部 HTTP(S) 负载平衡器 优质层级

全球级外部转发规则

全局外部 IP 地址

负载均衡方案:
EXTERNAL

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

区域级外部转发规则

区域级外部 IP 地址

负载均衡方案:
EXTERNAL

请求路由到负载均衡器所在区域中的 GFE。
区域级外部 HTTP(S) 负载均衡器 标准层级

区域级外部转发规则

区域级外部 IP 地址

负载均衡方案:
EXTERNAL_MANAGED

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

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

目标代理

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

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

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

负载均衡器模式 目标代理类型 代理添加的标头 支持自定义标头 支持 Cloud Trace
外部 HTTP(S) 负载平衡器 全局 HTTP
全局 HTTPS
代理将 HTTP 请求/响应标头设置为如下内容:
  • Via: 1.1 google(请求和响应)
  • X-Forwarded-Proto:[http | https](仅限请求)
  • X-Cloud-Trace-Context:<trace-id>/<span-id>;<trace-options>(仅限请求)
    包含 Cloud Trace 的参数。
  • X-Forwarded-For:[<supplied-value>,]<client-ip>,<load-balancer-ip>(请参阅 X-Forwarded-For 标头)(仅限请求)
在后端服务或后端存储桶上配置
区域级外部 HTTP(S) 负载均衡器 区域级 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 请求时,负载平衡器会保留原始请求的主机标头。

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 前端 (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>

HTTP/3 和 QUIC 协议支持

HTTP/3 是新一代互联网协议。它基于原始 Google QUIC (gQUIC) 协议开发的 QUIC 协议构建。外部 HTTP(S) 负载平衡器、Cloud CDN 和客户端之间支持 HTTP/3。

具体而言:

  • IETF QUIC 为传输层协议,可提供与 TCP 类似的拥塞控制和与用于 HTTP/2 的 SSL/TLS 相当的安全性,同时具有更高的性能。
  • HTTP/3 是以 IETF QUIC 为基础构建的应用层,它依赖 QUIC 处理多路复用、拥塞控制和重试。
  • HTTP/3 可以更快地启动客户端连接,消除了多路复用流中的队头阻塞,并且支持客户端 IP 地址更改时的连接迁移。
  • HTTP/3 会影响客户端与负载平衡器之间的连接,但不会影响负载平衡器与其后端之间的连接。
  • HTTP/3 连接使用 BBR 拥塞控制协议。

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

配置 HTTP/3

您可以通过将 quicOverride 设置为 ENABLE,明确为外部 HTTP(S) 负载平衡器启用 HTTP/3 支持。将来,将为所有外部 HTTP(S) 负载平衡器客户端默认启用 HTTP/3。

不支持 HTTP/3 或 gQUIC 的客户端不会协商 HTTP/3 连接。除非您已识别损坏或过时的客户端实现,否则无需明确停用 HTTP/3。

外部 HTTP(S) 负载平衡器提供了三种用于配置 HTTP/3 的模式,如下表所示。

quicOverride 值 行为
NONE

不向客户端通告 HTTP/3 和 Google QUIC。

注意:这在将来可能会发生变化,并且默认情况下将会向客户端通告 HTTP/3。

ENABLE

向客户端通告 HTTP/3 和 Google QUIC 的支持。优先通告 HTTP/3。支持这两种协议的客户端应首选 HTTP/3 而不是 Google QUIC。

注意:客户端协商 Google QUIC 时,TLS 0-RTT(也称为 TLS 早期数据)可以受到隐式支持,但当前在使用 HTTP/3 时则不受支持。

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

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

控制台:HTTPS

  1. 在 Google Cloud Console 中,转到负载平衡页面。

    转到“负载平衡”

  2. 选择要修改的外部 HTTP(S) 负载平衡器。

  3. 点击前端配置

  4. 选择要修改的前端 IP 地址和端口。如需修改 HTTP/3 配置,IP 地址和端口必须是 HTTPS(端口 443)。

启用 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 控制 QUIC 的协商时间。

    目前,当您选择 NONE 时,QUIC 处于停用状态。选择此选项,即表示您允许 Google 以后自动为此负载平衡器启用 QUIC 协商和 HTTP/3。在 Cloud Console 中,此选项称为自动(默认)

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

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

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 控制 QUIC 的协商时间。

    目前,当您选择 NONE 时,QUIC 处于停用状态。选择此选项,即表示您允许 Google 以后自动为此负载平衡器启用 QUIC 协商和 HTTP/3。在 Cloud Console 中,此选项称为自动(默认)

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

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

如何协商 HTTP/3

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

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

Alt-Svc HTTP 响应标头中通告支持。在外部 HTTP(S) 负载平衡器的 targetHttpsProxy 资源上将 HTTP/3 配置为 ENABLE 时,来自外部 HTTP(S) 负载平衡器的响应包括以下 alt-svc 标头值:

alt-svc: h3=":443"; ma=2592000,h3-29=":443"; ma=2592000,h3-T051=":443"; ma=2592000,
h3-Q050=":443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000,
quic=":443"; ma=2592000; v="46,43"

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

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

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

如果连接由于这些情况而回退为使用 HTTPS 或 HTTP/2,则我们不会将此视为负载平衡器故障。

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

网址映射

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

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

负载均衡器模式 网址映射类型
外部 HTTP(S) 负载平衡器 全球级(仅具有部分受支持的功能
区域级外部 HTTP(S) 负载均衡器 区域

SSL 证书

传输层安全协议 (TLS) 是 SSL 证书中用于保护网络通信的加密协议。

Google Cloud 使用 SSL 证书为客户端到负载平衡器提供隐私保护和安全性。如果您使用的是基于 HTTPS 的负载平衡,则必须在目标 HTTPS 代理上安装一个或多个 SSL 证书。

下表指定了每种模式下外部 HTTP(S) 负载均衡器所需的 SSL 证书的范围:

负载均衡器模式 SSL 证书范围
外部 HTTP(S) 负载平衡器 全球
区域级外部 HTTP(S) 负载均衡器 区域

如需详细了解 SSL 证书,请参阅以下内容:

SSL 政策

利用 SSL 政策,您可以控制 HTTPS 负载平衡器与 HTTPS 客户端协商的 SSL 的功能。

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

后端服务和存储分区

外部 HTTP(S) 负载均衡器可以包含后端服务和后端存储桶。区域级外部 HTTP(S) 负载均衡器不支持后端存储桶。

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

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

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

下表列出了 HTTP(S) 负载平衡支持的后端功能。


负载均衡器模式
后端服务上支持的后端 支持后端存储分区 支持 Google Cloud Armor 支持 Cloud CDN 支持 IAP
实例组 区域 NEG 互联网 NEG 无服务器 NEG 混合 NEG
外部 HTTP(S) 负载平衡器
使用优质层级时

区域级外部 HTTP(S) 负载均衡器

详情请参阅以下内容:

后端协议

为外部 HTTP(S) 负载平衡器配置后端服务时,您需要设置后端服务用来与后端通信的协议。您可以选择 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 连接的超时时间取决于负载平衡器的可配置后端服务超时,默认为 30 秒。该超时适用于 WebSocket 连接,无论其是否正在使用。

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

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

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

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

如需将 gRPC 与您的 Google Cloud 应用搭配使用,您必须通过 HTTP/2 以端到端方式对请求进行代理。如需使用外部 HTTP(S) 负载平衡器实现此目的,请执行以下操作:

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

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

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

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

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

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

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

健康检查

每项后端服务都会为后端实例指定运行状况检查。

对于健康检查探测,您必须创建入站允许防火墙规则,以允许流量到达您的后端实例。防火墙规则必须允许以下来源范围:

  • 130.211.0.0/22
  • 35.191.0.0/16

最佳做法是使用其协议与后端服务的协议相匹配的健康检查,不过这并非强制性要求。例如,HTTP/2 健康检查能够最准确地测试后端的 HTTP/2 连接性。如需查看受支持的健康检查协议的列表,请参阅负载均衡功能

下表指定了每种模式下外部 HTTP(S) 负载均衡器所支持的健康检查的范围。

负载均衡器模式 健康检查类型
外部 HTTP(S) 负载平衡器 全球
区域级外部 HTTP(S) 负载均衡器 区域

如需详细了解运行状况检查,请参阅以下内容:

防火墙规则

外部 HTTP(S) 负载均衡器需要以下防火墙规则:

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

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

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

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

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

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

对于外部 HTTP(S) 负载均衡器,下表总结了防火墙规则所需的 IP 地址范围:

负载均衡器模式 运行状况检查来源范围 请求来源范围
外部 HTTP(S) 负载平衡器
  • 130.211.0.0/22
  • 35.191.0.0/16
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 的生产网络会处理数据包路由。
区域级外部 HTTP(S) 负载均衡器
  • 130.211.0.0/22
  • 35.191.0.0/16
您配置的代理专用子网

连接在 HTTP(S) 负载平衡中的工作原理

外部 HTTP(S) 负载均衡器连接

外部 HTTP(S) 负载均衡器是一种服务,由许多称为 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 使用 keepalive 超时 600 秒,您无法配置此项。但是,您可以通过设置后端服务超时来配置请求/响应超时。虽然密切相关,但 HTTP keepalive 和 TCP 空闲超时并不相同。如需了解详情,请参阅超时和重试

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

如需了解详情,请参阅解决方案指南中的 HTTP(S) 负载平衡的工作原理:使用全局负载平衡进行应用容量优化。

区域级外部 HTTP(S) 负载均衡器连接

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

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

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

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

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

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

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

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

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

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

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

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

对于区域级外部 HTTP(S) 负载均衡器

  • 连接 1,从原始客户端到负载均衡器(代理专用子网):

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

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

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

返回路径

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

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

开放端口

本部分仅适用于使用 GFE 实现的外部 HTTP(S) 负载均衡器。

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

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

  • 执行 TCP SYN 探测时,端口扫描(例如使用 nmap)通常不需要响应数据包或 TCP RST 数据包。如果您的负载均衡器使用高级层级 IP 地址,则 GFE 将发送 SYN-ACK 数据包以响应各种端口的 SYN 探测。但是,GFE 仅会将数据包发送到您的后端,以响应发送到负载均衡器的 IP 地址以及在其转发规则上配置的目的地端口的数据包。如果数据包发送到转发规则中未配置的端口上的不同负载均衡器 IP 地址或您的负载均衡器的 IP 地址,则系统不会将数据包发送到您的负载均衡器的后端。 GFE 可实现 Google Cloud Armor 等安全功能。即使没有 Google Cloud Armor 配置,Google 基础架构和 GFE 也可以深度防御 DDoS 攻击和 SYN 洪水。

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

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

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

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

TLS 终结

下表总结了每种模式下外部 HTTP(S) 负载均衡器如何处理 TLS 终结。

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

超时和重试

HTTP(S) 负载平衡有两种截然不同的超时:
  • 可配置的 HTTP 后端服务超时,表示负载平衡器等待您的后端返回完整 HTTP 响应的时间。后端服务超时的默认值为 30 秒。允许的超时值的完整范围介于 1 到 2,147,483,647 秒之间。

    对于 HTTP 流量,此超时是 HTTP 请求和响应的时长上限。

    对于 WebSocket 流量,此超时是 WebSocket 连接可以保持打开状态(无论是空闲还是活跃)的最长时间。

    在以下任一情况下,请考虑延长此超时:

    • 您预计后端需要更长时间才能返回 HTTP 响应。
    • 您会看到带有 jsonPayload.statusDetail client_timed_out 的 HTTP 408 响应。
    • 连接升级到 WebSocket。

    例如,外部 HTTP(S) 负载平衡器的实际超时值为 1 天(86400 秒)。请注意,GFE 重启等事件可能会导致会话在此超时前终止。

    后端服务超时不是 HTTP 空闲 (keepalive) 超时。由于客户端较慢(例如浏览器连接速度较慢),系统可能会阻止后端的输入和输出 (IO)。这种情况下的等待时间不会计入后端服务超时。

    对于区域级外部 HTTP(S) 负载均衡器,网址映射的 routeActions.timeout 参数可以替换后端服务超时。将后端服务超时用作 routeActions.timeout 的默认值。

  • HTTP keepalive 超时的值固定为 10 分钟(600 秒)。 无法通过修改后端服务配置此值。为了防止后端过早关闭连接,您必须配置后端使用的 Web 服务器软件,设置大于 600 秒的 keepalive 超时。此超时不适用于 WebSocket

    下表说明了修改常用 Web 服务器软件的 keepalive 超时需要进行的更改:

    Web 服务器软件 参数 默认设置 推荐设置
    Apache KeepAliveTimeout KeepAliveTimeout 5 KeepAliveTimeout 620
    nginx keepalive_timeout keepalive_timeout 75s; keepalive_timeout 620s;
HTTP(S) 负载均衡对重试逻辑的支持取决于外部 HTTP(S) 负载均衡器的模式。

负载均衡器模式 重试逻辑
外部 HTTP(S) 负载平衡器

重试政策无法更改。

系统不会重试 HTTP POST 请求。

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

负载均衡器在特定情况下(例如达到后端服务超时时间时)会重试失败的 GET 请求。重试次数以两次为限。重试请求仅会为最终响应生成一个日志条目。如需了解详情,请参阅 HTTP(S) 负载均衡日志记录和监控

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

区域级外部 HTTP(S) 负载均衡器

可以使用网址映射中的重试政策进行配置。

如果没有重试政策,则没有 HTTP 正文的请求(例如 GET 请求)将重试一次。

Ingress 支持 WebSocket 协议。

非法的请求和响应处理

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

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

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

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

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

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

  • 响应标头的总大小超过外部 HTTP(S) 负载平衡的响应标头大小上限。
  • HTTP 版本未知。

流量分配

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

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

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

流量在后端之间的分配方式取决于外部 HTTP(S) 负载均衡器的模式。

外部 HTTP(S) 负载均衡器流量分配

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

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

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

如需了解详情,请参阅流量分配

区域级外部 HTTP(S) 负载均衡器流量分配

对于区域级外部 HTTP(S) 负载均衡器,流量分配依据负载均衡模式和负载均衡位置政策。

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

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

有关详情,请参阅:

请求的分配方式

流量是在区域范围还是全球范围分配取决于所使用的负载均衡器模式和网络服务层级。

对于优质层级(仅适用于外部 HTTP(S) 负载均衡器)

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

对于标准层级

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

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

请求分配过程

从每个可用区级 GCE_VM_IP_PORT NEG、可用区级实例组或区域级实例组的可用区的角度看,均衡模式和目标选择定义了后端完整性。可用区内的分配随后将通过一致的哈希处理完成。

负载平衡器使用以下过程:

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

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

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

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

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

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

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

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

    如果每秒请求数较少,则第二层 GFE 有时偏好选择某个区域中的一个可用区,而不是其他可用区。这种偏好属于正常现象,并且符合预期。在负载平衡器每秒接收更多请求之前,区域内的可用区之间的分布不会变得均匀。

会话亲和性

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

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

Google Cloud HTTP(S) 负载均衡提供以下类型的会话亲和性:

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

负载均衡器模式 会话粘性选项
  客户端 IP 生成的 Cookie 标头字段 HTTP Cookie
外部 HTTP(S) 负载平衡器
区域级外部 HTTP(S) 负载均衡器

HTTP/2 支持

HTTP/2 并发流数量上限

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

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

HTTP/2 限制

  • 对于外部 HTTP(S) 负载均衡器,在负载均衡器和实例之间使用 HTTP/2 时,需要与实例之间建立的 TCP 连接数量要比使用 HTTP(S) 时多得多。目前,HTTP/2 不支持连接池;连接池是一项优化功能,可通过 HTTP(S) 减少这些连接的数量。
  • 在负载平衡器和后端之间使用 HTTP/2 时,不支持通过单个 HTTP/2 连接流 (WebSocket) 协议 (RFC 8441) 运行 WebSocket 协议。
  • 负载平衡器和后端之间的 HTTP/2 不支持服务器推送。
  • Google Cloud API 或 Cloud Console 中不显示 gRPC 错误率和请求量。如果 gRPC 端点返回错误,则负载平衡器日志和监控数据会报告“OK 200”HTTP 响应代码。

后续步骤