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

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

HTTP(S) 负载平衡是一种全球性的基于代理的第 7 层负载平衡器,可让您在单个外部 IP 地址后面在全球范围内运行和扩缩服务。外部 HTTP(S) 负载平衡将 HTTP 和 HTTPS 流量分发到托管在 Compute Engine 和 Google Kubernetes Engine (GKE) 上的后端。

外部 HTTP(S) 负载平衡是在 Google Front Ends (GFEs) 上实现的。这些 GFE 分布于全球各地,可通过 Google 的全球网络和控制层面协同运作。在优质层级中,GFE 可提供多区域负载平衡,进而将流量定向至运行状况良好、有充足容量的最近后端,并尽可能在离用户最近的位置终止 HTTP(S) 流量。对于标准层级,系统将在区域范围内处理负载平衡。

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

架构

外部 HTTP(S) 负载平衡器由以下资源定义:

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

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

  • 对于 HTTPS 负载平衡,目标 HTTPS 代理会使用 SSL 证书向客户端证明其身份。目标 HTTPS 代理支持最多一个记录在案的 SSL 证书编号

  • HTTP(S) 代理使用网址映射根据 HTTP 特性(例如请求路径、Cookie 或标头)确定路由。根据确定的路由,代理会将客户端请求转发到特定的后端服务或后端存储分区。网址映射可以指定其他操作,例如向客户端发送重定向。

  • 后端服务后端存储分区将请求分配到运行状况良好的后端

  • 必须有一个或多个后端连接到后端服务或后端存储分区。

  • 运行状况检查会定期监控您的后端的就绪情况。这样可以降低向无法处理请求的后端发送请求的风险。

  • 防火墙,可让您的后端接受运行状况检查探测。

转发规则和地址

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

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

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

外部 HTTP(S) 负载均衡器所需的转发规则和 IP 地址类型取决于负载均衡器所属的网络服务层级

如需查看 HTTP(S) 负载平衡转发规则支持的协议的完整列表,请参阅负载平衡器功能

目标代理

目标代理会终结来自客户端的 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-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 请求时,负载平衡器会保留原始请求的主机标头。

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 之前,请确保您的工作负载可接受上述行为。

网址映射

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

SSL 证书

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

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

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

SSL 政策

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

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

后端服务和存储分区

外部 HTTP(S) 负载平衡器可以包含后端服务和后端存储分区。

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

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

如果要将 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

使用优质层级时

详情请参阅以下内容:

健康检查

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

对于运行状况检查探测,您必须创建允许流量到达实例的防火墙规则。防火墙规则必须允许以下来源范围:

  • 130.211.0.0/22
  • 35.191.0.0/16

外部 HTTP(S) 负载均衡器使用全球运行状况检查

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

后端协议

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

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

您最好使用协议与后端服务的协议相匹配的运行状况检查,不过这并非强制性要求。例如,HTTP/2 运行状况检查能够最准确地测试后端的 HTTP/2 连接性。

将 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 限制

防火墙规则

后端实例必须允许来自以下来源的连接:

  • 负载均衡器,即发送到后端的所有请求的 Google Front End (GFE)
  • 运行状况检查探测

如需允许此流量,您必须创建入站防火墙规则。这些防火墙规则的端口必须允许如下流量:

  • 发送到每个后端服务的运行状况检查的目标端口的流量。

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

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

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

如需详细了解运行状况检查探测以及必须允许来自它们的流量的原因,请参阅探测 IP 地址范围和防火墙规则

对于外部 HTTP(S) 负载均衡器,下表指定了其运行状况检查和请求来源范围:

运行状况检查来源范围 GFE 请求来源范围
  • 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 的生产网络会处理数据包路由。

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

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

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

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

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

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

返回路径

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

连接在 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 默认处于启用状态。GFE 使用 keepalive 超时 600 秒,您无法配置此项。但是,您可以通过设置后端服务超时来配置请求/响应超时。如需了解详情,请参阅超时和重试

HTTP keepalive 会尝试高效使用相同的 TCP 会话;但无法保证。虽然密切相关,但 HTTP keepalive 和 TCP 空闲超时并不相同。

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

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

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

  • 客户端可以使用 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) 负载平衡转发规则支持的协议的完整列表,请参阅负载平衡器功能

开放端口

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

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 终结

HTTPS 负载平衡器可在全球各处的地理位置终结 TLS,从而最大程度减少客户端与负载平衡器之间的延迟时间。如果您需要控制 TLS 终结的地理位置,应改用 Google Cloud 网络负载平衡,并在位于所需地区的后端上终结 TLS。

超时和重试

HTTP(S) 负载平衡有两种截然不同的超时:

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

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

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

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

对于通过负载平衡器发送的 WebSocket 流量,后端服务超时被解释为 WebSocket 连接可以保持打开状态(无论是否空闲)的最长时间。如需了解详情,请参阅后端服务设置

  • TCP 会话超时:其值固定为 10 分钟(600 秒)。此会话超时有时称为 keepalive 或空闲超时,并且其值无法通过修改后端服务进行配置。为了防止后端过早关闭连接,您必须配置后端使用的 Web 服务器软件,设置大于 600 秒的 keepalive 超时。此超时不适用于 WebSocket

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

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

负载平衡器在特定情况(例如达到后端服务超时时间时)下会重试失败的 GET 请求。它不会重试失败的 POST 请求。重试次数以两次为限。重试请求仅会为最终响应生成一个日志条目。

如果超过 80% 的后端实例运行状况不佳,则 GFE 不会重试。如果实例组中只有一个后端实例,并且与该后端实例之间的连接失败,则运行状况不佳的后端实例的百分比为 100%,因此 GFE 不会重试请求。如需了解详情,请参阅 HTTP(S) 负载平衡日志记录和监控

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 是实例组中虚拟机的后端利用率。

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

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

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

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

如需详细了解平衡模式,请参阅平衡模式

请求的分配方式

流量分配是区域性还是全球性,取决于正在使用的网络服务层级。

对于优质层级

  • 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 有时偏好选择某个区域中的一个可用区,而不是其他可用区。这种偏好属于正常现象,并且符合预期。在负载平衡器每秒接收更多请求之前,区域内的可用区之间的分布不会变得均匀。

会话亲和性

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

Google Cloud HTTP(S) 负载平衡提供三种类型的会话亲和性:

  • 无。没有为负载平衡器设置会话亲和性。
  • 客户端 IP 亲和性将来自同一客户端 IP 地址的请求发送到同一个后端。
  • 生成的 Cookie 亲和性会在发出第一个请求时设置客户端 Cookie,然后将带有该 Cookie 的请求发送到同一后端。

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

WebSocket 支持

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

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

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

WebSocket 连接的超时时间取决于负载平衡器的可配置后端服务超时,默认为 30 秒。该超时适用于 WebSocket 连接,无论其是否正在使用。

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

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 或 Cloud Console 中不显示 gRPC 错误率和请求量。如果 gRPC 端点返回错误,则负载平衡器日志和监控数据会报告“OK 200”HTTP 响应代码。

后续步骤