本文档介绍了配置 Google Cloud 外部 HTTP(S) 负载均衡时需要了解的概念。
外部 HTTP(S) 负载均衡是一种基于代理的第 7 层负载均衡器,可让您在单个外部 IP 地址后面运行和扩缩服务。外部 HTTP(S) 负载均衡将 HTTP 和 HTTPS 流量分配到各个 Google Cloud 平台(例如 Compute Engine、Google Kubernetes Engine (GKE)、Cloud Storage 等)上托管的后端,以及通过互联网或混合连接连接的外部后端。如需了解详情,请参阅用例。
操作模式
您可以使用以下模式配置外部 HTTP(S) 负载均衡:
- 全球外部 HTTP(S) 负载均衡器 这是一个全球负载均衡器,在 Google Front End (GFE) 上作为代管式服务实现。它使用开源 Envoy 代理来支持高级流量管理功能,例如流量镜像、基于权重的流量分配、基于请求/响应的标头转换等。
- 全球外部 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) 负载均衡器(经典版)的许多功能,以及一些高级流量管理功能。 如果您只想传送来自一个地理位置的内容(例如,出于满足合规性规定的目的),或者更希望使用标准网络服务层级,则可使用此负载均衡器。 |
|
识别模式
Cloud 控制台
- 在 Google Cloud Console 中,转到负载均衡页面。
转到“负载均衡” - 负载均衡器标签页中将显示负载均衡器类型、协议和区域。如果区域为空,则负载均衡器为适用于全球。下表总结了如何识别负载均衡器的模式。
负载均衡器模式 负载均衡类型 区域 网络层级 全球外部 HTTP(S) 负载均衡器 HTTP(S) 高级 全球外部 HTTP(S) 负载均衡器(经典版) HTTP(S)(经典版) 标准或高级 区域级外部 HTTP(S) 负载均衡器 HTTP(S) 指定一个区域 标准
gcloud
如需确定负载均衡器的模式,请运行以下命令:
gcloud compute forwarding-rules describe FORWARDING_RULE_NAME
在命令输出中,检查负载均衡方案、区域和网络层级。下表总结了如何识别负载均衡器的模式。
负载均衡器模式 负载均衡方案 转发规则 网络层级 全球外部 HTTP(S) 负载均衡器 EXTERNAL_MANAGED 全球 高级 全球外部 HTTP(S) 负载均衡器(经典版) 外部 全球 标准或高级 区域级外部 HTTP(S) 负载均衡器 EXTERNAL_MANAGED 指定一个区域 标准
架构
HTTP(S) 负载均衡部署需要以下资源:
(仅适用于区域级外部 HTTP(S) 负载均衡器)代理专用子网用于将来自负载均衡器的连接发送到后端。
外部转发规则指定外部 IP 地址、端口和目标 HTTP(S) 代理。客户端使用 IP 地址和端口连接到负载均衡器。
目标 HTTP(S) 代理接收来自客户端的请求。HTTP(S) 代理使用网址映射评估请求,从而做出流量路由决策。该代理还可以使用 SSL 证书对通信进行身份验证。
HTTP(S) 代理使用网址映射根据 HTTP 特性(例如请求路径、Cookie 或标头)确定路由。根据确定的路由,代理会将客户端请求转发到特定的后端服务或后端存储分区。网址映射可以指定其他操作,例如向客户端发送重定向。
后端服务将请求分配到健康状况良好的后端。全球外部 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 网络中的所有基于 Envoy 的区域负载均衡器共用来自同一代理专用子网的 Envoy 代理池。此外:
- 代理专用子网仅用于 Envoy 代理,不可用于您的后端。
- 一个区域和 VPC 网络中的所有区域级外部 HTTP(S) 负载均衡器的后端虚拟机或端点都会收到来自代理专用子网的连接。
- 区域级外部 HTTP(S) 负载均衡器的 IP 地址不位于代理专用子网中。该负载均衡器的 IP 地址由其外部代管式转发规则定义,如下所述。
如果您之前使用 --purpose=INTERNAL_HTTPS_LOAD_BALANCER
创建了代理专用子网,则需要先将子网的用途迁移到 REGIONAL_MANAGED_PROXY
,然后才能在 VPC 网络的同一区域中创建其他基于 Envoy 的负载均衡器。
转发规则和地址
转发规则会按照 IP 地址、端口和协议将流量路由到由目标代理、网址映射和一个或多个后端服务组成的负载均衡配置。
每条转发规则都会提供一个 IP 地址,可用于应用的 DNS 记录。不需要基于 DNS 的负载均衡。 您可以指定要使用的 IP 地址,也可以让 Cloud Load Balancing 为您分配一个。
- HTTP 负载均衡器的转发规则只能引用 TCP 端口 80 和 8080。
- HTTPS 负载均衡器的转发规则只能引用 TCP 端口 443。
外部 HTTP(S) 负载均衡器使用的转发规则类型、IP 地址和负载均衡方案取决于负载均衡器的模式以及负载均衡器所属的网络服务层级。
负载均衡器模式 | 网络服务层级 | 转发规则、IP 地址和负载均衡方案 | 从互联网到负载均衡器前端的路由 |
---|---|---|---|
全球外部 HTTP(S) 负载均衡器 | 高级层级 |
负载均衡方案: |
请求路由到互联网中最靠近客户端的 GFE。 |
全球外部 HTTP(S) 负载均衡器(经典版) | 高级层级 |
负载均衡方案: |
请求路由到互联网中最靠近客户端的 GFE。 |
标准层级 |
负载均衡方案: |
请求路由到负载均衡器所在区域中的 GFE。 | |
区域级外部 HTTP(S) 负载均衡器 | 标准层级 |
负载均衡方案: |
请求路由到与负载均衡器位于同一区域的 Envoy 代理。 |
如需查看每种模式下 HTTP(S) 负载均衡转发规则所支持的协议的完整列表,请参阅负载均衡器功能。
目标代理
目标代理会终结来自客户端的 HTTP(S) 连接。一条或多条转发规则会将流量定向到目标代理,目标代理会查询网址映射以确定如何将流量路由到后端。
请勿依赖代理来保留请求或响应标头名称的大小写。例如,Server: Apache/1.0
响应标头可能会在客户端显示为 server: Apache/1.0
。
下表指定了每种模式下 HTTP(S) 负载均衡所需的目标代理类型。
负载均衡器模式 | 目标代理类型 | 代理添加的标头 | 支持自定义标头 | 支持 Cloud Trace |
---|---|---|---|---|
全球外部 HTTP(S) 负载均衡器 | 全局 HTTP、 全局 HTTPS |
代理将 HTTP 请求/响应标头设置为如下内容:
|
在后端服务或后端存储桶上配置
Cloud CDN 不支持 |
|
全球外部 HTTP(S) 负载均衡器(经典版) | 全局 HTTP、 全局 HTTPS |
代理将 HTTP 请求/响应标头设置为如下内容:
|
在后端服务或后端存储桶上配置 | |
区域级外部 HTTP(S) 负载均衡器 | 区域级 HTTP、 区域级 HTTPS |
|
主机标头
当负载均衡器发出 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/22
和35.191.0.0/16
范围内。后端系统本身的 IP 地址。
因此,在负载均衡器后端之后,上游进程可能会收到如下形式的 X-Forwarded-For
标头:
<existing-values>,<client-ip>,<load-balancer-ip><GFE-IP><backend-IP>
网址映射
网址映射定义了匹配模式,以便根据网址将请求路由到相应的后端服务。定义默认服务是为了处理所有与指定的主机规则或路径匹配规则不相符的请求。在某些情况(例如多区域负载均衡示例)下,您可能不会定义任何网址规则,仅依赖于默认服务。对于请求路由,网址映射可让您通过检查网址的各部分来分流您的流量,从而将请求发送到不同组的后端。
与全球外部 HTTP(S) 负载均衡器和区域外部 HTTP(S) 负载均衡器搭配使用的网址映射支持多项高级流量管理功能,例如基于标头的流量导向、基于权重的流量分配和请求镜像。 详情请参阅以下内容:
下表指定了每种模式下 HTTP(S) 负载均衡所需的网址映射类型。
负载均衡器模式 | 网址映射类型 |
---|---|
全球外部 HTTP(S) 负载均衡器 | 全球 |
全球外部 HTTP(S) 负载均衡器(经典版) | 全球级(仅具有部分受支持的功能) |
区域级外部 HTTP(S) 负载均衡器 | 区域 |
SSL 证书
使用目标 HTTPS 代理的外部 HTTP(S) 负载均衡器需要私钥和 SSL 证书作为负载均衡器配置的一部分:Google Cloud 提供了两种为目标 HTTPS 代理分配私钥和 SSL 证书的配置方法:Compute Engine SSL 证书和 Certificate Manager。如需了解每个配置的说明,请参阅 SSL 证书概览中的证书配置方法。
Google Cloud 提供两种证书类型:自行管理的证书和 Google 管理的证书。如需了解每种类型的说明,请参阅 SSL 证书概览中的证书类型。
外部 HTTP(S) 负载均衡器模式决定了支持的配置方法和证书类型。如需了解详情,请参阅 SSL 证书概览中的证书和 Google Cloud 负载均衡器。
SSL 政策
SSL 政策指定 Google Cloud 负载均衡器在与客户端协商 SSL 时使用的一组 SSL 功能。
默认情况下,HTTPS 负载均衡所用的一组 SSL 功能具有良好的安全性和广泛的兼容性,但某些应用需要更好地控制用于其 HTTPS 或 SSL 连接的 SSL 版本和加密方式。您可以定义 SSL 政策来指定负载均衡器在与客户端协商 SSL 时使用的一组 SSL 功能。此外,您还可以将该 SSL 政策应用于目标 HTTPS 代理。
下表指定了针对每种模式下的负载均衡器的 SSL 政策支持。
负载均衡器模式 | 支持的 SSL 政策 |
---|---|
全球外部 HTTP(S) 负载均衡器 | |
全球外部 HTTP(S) 负载均衡器(经典版) | |
区域级外部 HTTP(S) 负载均衡器 |
后端服务和存储分区
后端服务向负载均衡器提供配置信息。负载均衡器使用后端服务中的信息将传入的流量定向到一个或多个挂接的后端。 如需查看显示如何使用后端服务和 Compute Engine 后端设置负载均衡器的示例,请参阅使用 Compute Engine 后端设置外部 HTTP(S) 负载均衡器。
后端存储分区将传入的流量定向到 Cloud Storage 存储分区。如需查看展示如何将存储桶添加到外部 HTTP(S) 负载均衡器的示例,请参阅设置使用后端存储桶的负载均衡器。
下表说明了每种模式下 HTTP(S) 负载均衡支持的后端功能。
负载均衡器模式 |
后端服务上支持的后端 | 支持后端存储分区 | 支持 Google Cloud Armor | 支持 Cloud CDN | 支持 IAP | |||||
---|---|---|---|---|---|---|---|---|---|---|
实例组 | 可用区级 NEG | 互联网 NEG | 无服务器 NEG | 混合 NEG | Private Service Connect NEG | |||||
全球外部 HTTP(S) 负载均衡器 | ||||||||||
全球外部 HTTP(S) 负载均衡器(经典版) |
使用高级层级时 |
|
||||||||
区域级外部 HTTP(S) 负载均衡器 |
详情请参阅以下内容:
后端和 VPC 网络
后端位置的限制取决于负载均衡器的类型。
- 对于全球外部 HTTP(S) 负载均衡器和全球外部 HTTP(S) 负载均衡器(经典版),所有后端必须位于同一项目中,但可以位于不同的 VPC 网络中。不同的 VPC 网络不需要使用 VPC 网络对等互连连接,因为 GFE 代理系统直接与各自的 VPC 网络中的后端进行通信。
- 对于区域级外部 HTTP(S) 负载均衡器,所有后端都必须位于同一 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 连接的超时时间取决于负载均衡器的可配置后端服务超时,默认为 30 秒。该超时适用于 WebSocket 连接,无论其是否正在使用。
WebSocket 的会话亲和性与其他任何请求的运作方式相同。如需了解详情,请参阅会话亲和性。
将 gRPC 与您的 Google Cloud 应用搭配使用
gRPC 是远程过程调用的开源框架。它基于 HTTP/2 标准运行。适合使用 gRPC 的场景如下:
- 延迟时间短、扩缩能力强的分布式系统
- 开发与云服务器通信的移动客户端
- 设计必须准确、高效并且独立于语言的新协议
- 支持扩展、身份验证和日志记录的分层设计
如需将 gRPC 与您的 Google Cloud 应用搭配使用,您必须通过 HTTP/2 以端到端方式对请求进行代理。为此,请按以下说明操作:
- 配置 HTTPS 负载均衡器。
- 启用 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(S) 负载均衡器,请参阅 HTTP/2 与 Ingress 搭配使用实现负载均衡。
如需了解如何排查 HTTP/2 问题,请参阅排查后端 HTTP/2 问题。
如需了解 HTTP/2 限制,请参阅 HTTP/2 限制。
健康检查
每项后端服务都会指定健康检查,用于定期监控后端是否已准备好从负载均衡器接收连接。这样可以降低向无法处理请求的后端发送请求的风险。健康检查不会检查应用本身是否正常运行。
对于健康检查探测,您必须创建入站流量允许防火墙规则,以允许健康检查探测到达您的后端实例。通常,健康检查探测源自 Google 的集中式健康检查机制。
使用混合 NEG 后端的区域外部 HTTP(S) 负载均衡器是此规则的一个例外,因为其健康检查源自代理专用子网。如需了解详情,请参阅混合 NEG 概览。
健康检查协议
最佳实践是使用其协议与后端服务的协议相匹配的健康检查,不过这并非强制性要求,而且也不一定可行。例如,HTTP/2 健康检查能够最准确地测试后端的 HTTP/2 连接性。相比之下,使用混合 NEG 后端的区域外部 HTTP(S) 负载均衡器不支持 gRPC 健康检查。如需查看受支持的健康检查协议的列表,请参阅负载均衡功能。
下表指定了每种模式下 HTTP(S) 负载均衡支持的健康检查范围。
负载均衡器模式 | 健康检查类型 |
---|---|
全球外部 HTTP(S) 负载均衡器 | 全球 |
全球外部 HTTP(S) 负载均衡器(经典版) | 全球 |
区域级外部 HTTP(S) 负载均衡器 | 区域 |
如需详细了解健康检查,请参阅以下内容:
防火墙规则
HTTP(S) 负载均衡需要以下防火墙规则:
- 对于全球外部 HTTP(S) 负载均衡器,入站流量允许规则允许来自 Google Front End (GFE) 前端的流量到达您的后端。
用于允许来自代理专用子网的流量到达您的后端的入站流量允许规则(对于区域级外部 HTTP(S) 负载均衡器)。 - 允许来自健康检查探测范围的流量的入站允许规则。如需详细了解健康检查探测以及必须允许来自它们的流量的原因,请参阅探测 IP 范围和防火墙规则。
防火墙规则在虚拟机实例级层(而不是在 GFE 代理上)实现。您无法使用 Google Cloud 防火墙规则来阻止流量到达负载均衡器。对于全球外部 HTTP(S) 负载均衡器和全球外部 HTTP(S) 负载均衡器(经典版),您可以使用 Google Cloud Armor 来实现此目的。
这些防火墙规则的端口必须如下配置:
允许发送到每个后端服务的健康检查的目的地端口的流量。
对于实例组后端:通过后端服务的已命名端口与每个实例组上与该已命名端口关联的端口号之间的映射来确定要配置的端口。分配给同一后端服务的各实例组的端口号可能各不相同。
对于
GCE_VM_IP_PORT
NEG 后端:允许发送到端点的端口号的流量。
下表汇总了防火墙规则所需的来源 IP 地址范围:
负载均衡器模式 | 健康检查来源范围 | 请求来源范围 |
---|---|---|
全球外部 HTTP(S) 负载均衡器 |
|
GFE 流量来源取决于后端类型:
|
全球外部 HTTP(S) 负载均衡器(经典版) |
|
GFE 流量来源取决于后端类型:
|
区域级外部 HTTP(S) 负载均衡器 |
目前,混合 NEG 的健康检查探测源自 Google 的集中式健康检查机制。如果您不允许源自 Google 健康检查范围的流量到达您的混合端点,并且希望健康检查探测源自专用 IP 地址,请与您的 Google 客户代表联系,让您的项目列入分布式 Envoy 健康检查的许可名单。 |
您配置的代理专用子网。 |
共享 VPC 架构
HTTP(S) 负载均衡支持使用共享 VPC 的网络。共享 VPC 可让组织将多个项目中的资源连接到一个公用 VPC 网络,让它们能够使用该网络中的内部 IP 地址安全高效地相互通信。如果您还不熟悉共享 VPC,请阅读共享 VPC 概览文档。
在共享 VPC 网络中配置外部 HTTP(S) 负载均衡有多种方法。无论部署类型如何,负载均衡器的所有组件都必须位于同一组织中。
负载均衡器 | 前端组件 | 后端组件 |
---|---|---|
全球外部 HTTP(S) 负载均衡器、 全球外部 HTTP(S) 负载均衡器(经典版) |
全球外部 IP 地址、转发规则、目标 HTTP(S) 代理和关联的网址映射必须在后端所在的宿主项目或服务项目中定义。 | 全球后端服务必须在后端(实例组或 NEG)所在的宿主项目或服务项目中定义。与后端服务相关的健康检查也必须在后端服务所在的项目中定义。 |
区域级外部 HTTP(S) 负载均衡器 | 在共享 VPC 宿主项目中创建所需的网络和代理专用子网。 区域外部 IP 地址、转发规则、目标 HTTP(S) 代理和关联的网址映射必须在同一项目中定义。此项目可以是宿主项目,也可以是服务项目。 |
您可以执行下列任一操作:
每个后端服务都必须在其引用的后端所在的项目中定义。与后端服务相关的健康检查也必须在后端服务所在的项目中定义。 |
虽然您可以在共享 VPC 宿主项目中创建所有负载均衡组件和后端,但此模型不会分隔网络管理和服务开发职责。
共享 VPC 环境中的无服务器后端
对于使用无服务器 NEG 后端的负载均衡器,后端 Cloud Run、Cloud Functions 或 App Engine 服务必须与无服务器 NEG 位于同一项目中。
此外,对于支持跨项目服务引用的区域外部 HTTP(S) 负载均衡器,后端服务、无服务器 NEG 和 Cloud Run 服务必须始终位于同一服务项目中。
跨项目服务引用
在此模型中,负载均衡器的前端和网址映射位于宿主项目或服务项目中。负载均衡器的后端服务和后端可以在共享 VPC 环境中跨项目分布。系统可以在单个网址映射中引用跨项目后端服务。这称为跨项目服务引用。
跨项目服务引用使组织可以配置一个中央负载均衡器并将流量路由到跨多个不同项目分布的数百个服务。您可以在一个网址映射中集中管理所有流量路由规则和政策。您还可以将负载均衡器与一组主机名和 SSL 证书相关联。这样,您就可以优化部署应用所需的负载均衡器数量,并降低可管理性、运营费用和配额要求。
通过为每个职能团队设置不同的项目,您还可以实现组织中的角色分离。服务所有者可以专注于在服务项目中构建服务,而网络团队可以在另一个项目中预配和维护负载均衡器,这两个角色都可以使用跨项目服务引用进行连接。
服务所有者可以维护其服务公开的自主性,并控制哪些用户可以通过使用负载均衡器访问其服务。这是通过名为 Compute Load Balancer Services User 角色 (roles/compute.loadBalancerServiceUser
) 的特殊 IAM 角色实现的。
跨项目服务引用可用于实例组、无服务器 NEG 或任何其他受支持的后端类型。如果您使用的是无服务器 NEG,则需要在您打算创建负载均衡器的前端的 VPC 网络中创建虚拟机。如需了解如何创建虚拟机,请参阅使用 Cloud Run 设置区域外部 HTTP(S) 负载均衡器。
全球外部 HTTP(S) 负载均衡器和全球外部 HTTP(S) 负载均衡器(经典版)不支持跨项目服务引用。
示例 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。
服务项目中的所有负载均衡器组件和后端
在此模型中,所有负载均衡器组件和后端都位于服务项目中。所有 HTTP(S) 负载均衡器都支持此部署模型。
负载均衡器组件和后端必须使用相同的 VPC 网络。连接在 HTTP(S) 负载均衡中的工作原理
全球外部 HTTP(S) 负载均衡器连接
全球外部 HTTP(S) 负载均衡器由许多称为 Google Front End (GFE) 的代理实现。不只一个代理。在高级层级中,系统会从各个接入点通告相同的全球级外部 IP 地址,并将客户端请求定向到离客户端最近的 GFE。
根据您的客户端位置,多个 GFE 可以启动与后端的 HTTP(S) 连接。从 GFE 发送的数据包的来源 IP 地址,来自健康检查探测器所用的同一范围:35.191.0.0/16
和 130.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
。特定网络和区域中的所有基于 Envoy 的区域负载均衡器共享此子网。
客户端使用负载均衡器的 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 地址。
连接 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 只会针对已配置转发规则的端口以及针对端口 80 和 443 发送对 SYN 探测作出响应的 SYN-ACK 数据包。此外,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 的负载均衡器,当连接升级到 QUIC (HTTP/3) 时,系统将使用 UDP 端口 443。
安全审核者应检查适用于后端虚拟机的防火墙规则配置。您设置的防火墙规则会阻止从 GFE 流向后端虚拟机的流量,但不会阻止流向 GFE 的传入流量。如需了解最佳做法,请参阅防火墙规则部分。
TLS 终结
下表总结了每种模式下外部 HTTP(S) 负载均衡器如何处理 TLS 终结。
负载均衡器模式 | TLS 终结 |
---|---|
全球外部 HTTP(S) 负载均衡器 | TLS 在 GFE 上终结,这个 GFE 可能位于全球任何位置。 |
全球外部 HTTP(S) 负载均衡器(经典版) | TLS 在 GFE 上终结,可能位于全球任何地方。 |
区域级外部 HTTP(S) 负载均衡器 | TLS 在位于用户所选区域中的代理专用子网的 Envoy 代理上终结。如果您需要对 TLS 终结所在的区域进行地理位置控制,请使用此负载均衡器模式。 |
超时和重试
外部 HTTP(S) 负载均衡具有以下超时:可配置的 HTTP 后端服务超时:表示负载均衡器等待您的后端返回完整 HTTP 响应的时间。后端服务超时的默认值为 30 秒。允许的超时值的完整范围介于 1 到 2,147,483,647 秒之间。
例如,如果您要下载一个 500 MB 的文件,并且后端服务超时值是默认值 30 秒,则负载均衡器期望后端在 30 秒内传送整个 500 MB 文件。有时,配置的后端服务超时值可能会不够长,使得后端无法发送其完整的 HTTP 响应。在这种情况下,如果负载均衡器至少收到 HTTP 响应标头,则负载均衡器会返回完整响应标头以及尽可能在后端服务超时内获取的响应正文部分。
对于代理(GFE 或代管式 Envoy)和后端之间的交互,后端服务超时应设置为从请求的第一个字节到响应的最后一个字节的最长可能时间。如果您使用的是 WebSocket,则后端服务超时应设置为 WebSocket 空闲或活跃的时长上限。
在以下任一情况下,请考虑延长此超时:
- 您预计后端需要更长时间才能返回 HTTP 响应。
- 您会看到带有
jsonPayload.statusDetail
client_timed_out
的 HTTP408
响应。 - 连接升级到 WebSocket。
您设置的后端服务超时是尽力而为的目标。我们无法保证底层 TCP 连接会在该超时期间保持打开状态。
您可以将后端服务超时设置为所需的任何值;但是,将其设置为超过 1 天(86400 秒)的值并不意味着负载均衡器会保持 TCP 连接运行那么长时间。 Google 会定期重启 GFE 和 Envoy 软件任务以进行软件更新和例行维护,并且后端服务超时不会覆盖该任务。您后端服务超时设置的时间越长,Google 终止 TCP 连接以进行维护的可能性就越大。我们建议您实现重试逻辑,以降低此类事件的影响。
后端服务超时不是 HTTP 空闲 (keepalive) 超时。由于客户端较慢(例如浏览器连接速度较慢),系统可能会阻止后端的输入和输出 (IO)。这种情况下的等待时间不会计入后端服务超时。
如需配置后端服务超时,请使用以下方法之一:
- Google Cloud 控制台:修改负载均衡器后端服务的超时字段。
- Google Cloud CLI:使用
gcloud compute backend-services update
命令修改后端服务资源的--timeout
参数。 - API:修改全球或区域后端服务资源的
timeoutSec
参数。
对于区域级外部 HTTP(S) 负载均衡器,网址映射的
routeActions.timeout
参数可以替换后端服务超时。将后端服务超时用作routeActions.timeout
的默认值。
- 将后端存储桶与全球外部 HTTP(S) 负载均衡器和全球外部 HTTP(S) 负载均衡器(经典版)搭配使用时,存在两种超时:
- 固定为 6 分钟的空闲超时。这意味着没有活动 6 分钟后,后端存储桶 HTTP 数据流将被视为空闲状态。
- 另一种超时,其中包括负载均衡器和 Cloud Storage 所花费的完整响应处理时间。此超时固定为 24 小时。
- HTTP keepalive 超时的值固定为 10 分钟(600 秒)。
无法通过修改后端服务配置此值。您必须配置后端使用的网络服务器软件,以使其 keepalive 超时时间大于 600 秒,以防止后端过早关闭连接。此超时不适用于 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 正文的失败请求(例如 GET 请求)会导致 HTTP 502、503 或 504 响应 ( 重试请求仅会为最终响应生成一个日志条目。 |
全球外部 HTTP(S) 负载均衡器(经典版) |
对于连接重试,无法更改重试政策。 系统不会重试 HTTP POST 请求。 只要 80% 或更多的后端健康状况良好,HTTP GET 请求就会始终重试一次。如果实例组中只有一个后端实例,并且与该后端实例之间的连接失败,则健康状况不佳的后端实例的百分比为 100%,因此 GFE 不会重试请求。 负载均衡器在特定情况下(例如达到后端服务超时时间时)会重试失败的 GET 请求。请求重试次数上限为 请求失败会导致负载均衡器合成 HTTP 502 响应。 |
区域级外部 HTTP(S) 负载均衡器 |
可以使用网址映射中的重试政策进行配置。默认重试次数 ( 如果没有重试政策,则没有 HTTP 正文的失败请求(例如 GET 请求)会导致 HTTP 502、503 或 504 响应重试。系统不会重试 HTTP POST 请求。 重试请求仅会为最终响应生成一个日志条目。 |
GKE 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) 负载均衡器
在 Google Front End (GFE) 向后端实例发送请求之前,GFE 会估算哪些后端实例的容量可用于接收请求。系统会主动进行此容量估算,而不是在收到请求的同时进行估算。GFE 会定期接收有关可用容量的信息,并相应地分配传入请求。
容量的含义部分取决于均衡模式。对于 RATE
模式,它相对简单:GFE 精确地确定它每秒可以分配的请求数。基于 UTILIZATION
的负载均衡更复杂:负载均衡器检查实例的当前利用率,然后估算每个实例可以处理的查询负载。此估算值会随着时间的推移随实例利用率和流量模式的变化而变化。
这两个因素(容量估算和主动分配)都会影响各个实例之间的分布。因此,Cloud Load Balancing 的行为与简单的轮询负载均衡器不同,后者在两个实例之间精确地 (50:50) 分布请求。相反,Google Cloud 负载均衡会尝试针对每个请求优化后端实例选择。
对于全球外部 HTTP(S) 负载均衡器(经典版),均衡模式用于选择最首选的后端(实例组或 NEG)。然后,流量通过轮循方式在后端的实例或端点之间分配。
对于全球外部 HTTP(S) 负载均衡器,负载均衡分为两个层级。均衡模式决定了应发送到每个后端(实例组或 NEG)的流量的权重或比例。然后,负载均衡政策 (LocalityLbPolicy
) 会确定流量如何分配到组中的实例或端点。如需了解详情,请参阅负载均衡位置政策(后端服务 API 文档)。
区域级外部 HTTP(S) 负载均衡器
对于区域级外部 HTTP(S) 负载均衡器,流量分配取决于负载均衡模式和负载均衡位置政策。
均衡模式决定了应发送到每个组(实例组或 NEG)的流量的权重和比例。负载均衡位置政策 (LocalityLbPolicy
) 决定了组中后端的负载均衡方式。
当后端服务收到流量时,它首先会根据后端的均衡模式将流量定向到后端(实例组或 NEG)。选择后端后,系统会根据负载均衡位置政策在后端组中的实例或端点之间分配流量。
详情请参阅以下内容:
请求的分配方式
流量是在区域范围还是全球范围分配取决于所使用的负载均衡器模式和网络服务层级。
对于高级层级:
- Google 会从全球所有入网点通告您的负载均衡器的 IP 地址。每个负载均衡器 IP 地址都是全球任播。
- 如果您使用多个区域中的后端来配置后端服务,则 Google Front End (GFE) 会尝试将请求定向到离用户最近的区域中运行状况良好的后端实例组或 NEG。本页面记录了此过程的详细信息。
对于标准层级:
Google 会从与转发规则的区域关联的接入点通告负载均衡器的 IP 地址。负载均衡器使用区域级外部 IP 地址。
您可以在转发规则所在的区域中配置后端。此处记录的过程仍然适用,但负载均衡器仅将请求定向到该区域中健康状况良好的后端。
请求分配过程:
从每个可用区级GCE_VM_IP_PORT
NEG、可用区级实例组或区域级实例组的可用区的角度看,均衡模式和目标选择定义了后端完整性。可用区内的分布通过全球外部 HTTP(S) 负载均衡器(经典版)的一致性哈希完成,并可通过全球外部 HTTP(S) 负载均衡器和区域级外部 HTTP(S) 负载均衡器的负载均衡位置政策进行配置。
基于 GFE 的全球外部 HTTP(S) 负载均衡器使用以下过程分发传入请求:
- 转发规则的外部 IP 地址由 Google 网络边界上的边缘路由器通告。每个通告都会列出第 3/4 层负载均衡系统 (Maglev) 的下一个跃点。
- Maglev 系统将流量路由到第一层 Google 前端 (GFE)。第一层 GFE 会根据需要终止传输层安全协议 (TLS),然后按照此过程将流量路由到第二层 GFE:
- 网址映射选择后端服务。
- 如果后端服务使用实例组或
GCE_VM_IP_PORT
NEG 后端,则第一层 GFE 更倾向于位于包含实例组或 NEG 的区域内或附近的第二层 GFE。 - 对于具有混合 NEG、无服务器 NEG 和互联网 NEG 的后端存储分区和后端服务,第一层 GFE 选择的区域子集中的第二层 GFE 会使得两个 GFE 之间的往返时间最短。
第二层 GFE 偏好选择不能保证,并且可能根据 Google 的网络状况和维护动态变化。
第二层 GFE 可识别健康检查状态和实际后端容量使用情况。
- 第二层 GFE 将请求定向到其所在区域内的可用区中的后端。
- 对于高级层级,有时第二层 GFE 会将请求发送到不同区域的可用区中的后端。这种行为称为溢出。
- 当第二层 GFE 知道的所有后端达到容量或运行状况不佳时,可能会发生溢出。
- 第二层 GFE 含有其他区域的可用区中运行状况良好的所有后端的信息。
将请求分配到后端时,GFE 会在可用区级运行。
如果每秒请求数较少,则第二层 GFE 有时偏好选择某个区域中的一个可用区,而不是其他可用区。这种偏好属于正常现象,并且符合预期。在负载均衡器每秒接收更多请求之前,区域内的可用区之间的分布不会变得均匀。
溢出受两个原则约束:
第二层 GFE 通常配置为提供部分后端位置。
溢出行为不会耗尽所有可能的 Google Cloud 可用区。如果您需要将流量引导离开特定可用区或整个区域中的后端,则必须将容量扩缩程序设置为零。将后端配置为无法通过健康检查并不能保证第二层 GFE 会溢出到其他区域的可用区中的后端。
会话亲和性
只要后端运行状况良好且有可用容量,会话亲和性就会根据配置的均衡模式,尽力尝试将来自特定客户端的请求发送到同一个后端。
使用会话亲和性时,我们建议您使用 RATE
均衡模式,而不是 UTILIZATION
。如果您将均衡模式设置为每秒请求次数 (RPS),则会话亲和性的效果最佳。
HTTP(S) 负载均衡提供以下类型的会话亲和性:
- 无。没有为负载均衡器设置会话亲和性。
- 客户端 IP 亲和性
- 生成的 Cookie 亲和性
- 标头字段亲和性
- HTTP Cookie 亲和性
下表总结了 HTTP(S) 负载均衡的每种模式支持的会话亲和性选项:
负载均衡器模式 | 会话亲和性选项 | ||||
---|---|---|---|---|---|
无 | 客户端 IP | 生成的 Cookie | 标头字段 | HTTP Cookie | |
全球外部 HTTP(S) 负载均衡器 | |||||
全球外部 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/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 和 Google QUIC 支持
HTTP/3 是新一代互联网协议。它在根据原始 Google QUIC 协议开发的 IETF 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/3 可以缩短网页加载时间、减少视频重新缓冲,以及提高延迟时间较长的连接的吞吐量。
下表指定了每种模式下 HTTP(S) 负载均衡的 HTTP/3 支持。
负载均衡器模式 | HTTP/3 支持 |
---|---|
全球外部 HTTP(S) 负载均衡器(始终在优质层级中) | |
优质层级中的全球外部 HTTP(S) 负载均衡器(经典版) | |
标准层级中的全球外部 HTTP(S) 负载均衡器(经典版) | |
区域级外部 HTTP(S) 负载均衡器(始终在标准层级中) |
如何协商 HTTP/3
启用 HTTP/3 后,负载均衡器会向客户端通告此支持,让支持 HTTP/3 的客户端尝试与 HTTPS 负载均衡器建立 HTTP/3 连接。
- 实施得当的客户端在无法建立 HTTP/3 连接时始终回退为使用 HTTPS 或 HTTP/2。
- 支持 HTTP/3 的客户端使用它们缓存的关于 HTTP/3 支持的先前知识,以节省未来不必要的往返。
- 因此,在负载均衡器中启用或停用 HTTP/3 不会影响负载均衡器连接到客户端的能力。
在 Alt-Svc
HTTP 响应标头中通告支持。在外部 HTTP(S) 负载均衡器的 targetHttpsProxy
资源上将 HTTP/3 配置为 ENABLE
时,来自负载均衡器的响应包括以下 alt-svc
标头值:
alt-svc: h3=":443"; ma=2592000,h3-29=":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 负载均衡器上启用 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
您可以通过将 quicOverride
设置为 ENABLE
,明确为负载均衡器启用 HTTP/3 支持。
启用 HTTP/3 后,负载均衡器会将其通告给客户端,以便支持它的客户端与负载均衡器协商 HTTP/3 版本。不支持 HTTP/3 的客户端不会协商 HTTP/3 连接。除非您已确定存在损坏的客户端实现,否则无需明确停用 HTTP/3。
HTTP(S) 负载均衡提供了三种配置 HTTP/3 的方法,如下表所示。
quicOverride 值 | 行为 |
---|---|
NONE |
向客户端通告 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
在 Google Cloud Console 中,转到负载均衡页面。
选择要修改的负载均衡器。
点击前端配置。
选择要修改的前端 IP 地址和端口。如需修改 HTTP/3 配置,IP 地址和端口必须是 HTTPS(端口 443)。
启用 HTTP/3
- 选择 QUIC 协商下拉列表。
- 如需为此前端明确启用 HTTP/3,请选择已启用。
- 如果有多个表示 IPv4 和 IPv6 的前端规则,请务必为每个规则启用 HTTP/3。
停用 HTTP/3
- 选择 QUIC 协商下拉列表。
- 如需为此前端明确停用 HTTP/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 和 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 控制通告 HTTP/3 的时间。目前,当您选择
NONE
时,系统会向客户端通告 HTTP/3,但不会通告 Google QUIC。在 Google Cloud 控制台中,此选项称为自动(默认)。
ENABLE
:向客户端通告 HTTP/3 和 Google QUIC。DISABLE
:不向客户端通告 HTTP/3 或 Google QUIC。
限制
- HTTPS 负载均衡器不支持基于客户端证书的身份验证(也称为双向 TLS 身份验证)。
- 终止 SSL 连接时,HTTPS 负载均衡器不会发送
close_notify
关闭提醒。也就是说,负载均衡器会关闭 TCP 连接,而不是执行 SSL 关停。 - HTTPS 负载均衡器仅支持在证书的通用名称 (
CN
) 特性或主题备用名称 (SAN
) 特性中网域包含小写字符。只有在目标代理中设置为主证书时,系统才会返回网域中包含大写字符的证书。 - 除了连接到互联网 NEG 后端的负载均衡器之外,HTTPS 负载均衡器在连接到后端时不会使用服务器名称指示 (SNI) 扩展程序。如需了解详情,请参阅从负载均衡器到后端的加密。
- 在共享 VPC 环境中将区域外部 HTTP(S) 负载均衡器与 Cloud Run 搭配使用时,服务项目中的独立 VPC 网络可以将流量发送到在同一共享 VPC 环境中的其他任何项目中部署的任何其他 Cloud Run 服务。这是一个已知问题,未来将阻止这种形式的访问。
- 只有全球外部 HTTP(S) 负载均衡器(经典版)支持包含 Google Cloud Armor 的 reCAPTCHA Enterprise for WAF。但是,具有高级流量管理功能的全球外部 HTTP(S) 负载均衡器对此不提供支持。
后续步骤
- 如需了解如何部署全球级外部 HTTP(S) 负载均衡器,请参阅使用 Compute Engine 后端设置外部 HTTP(S) 负载均衡器。
- 如需了解如何部署区域级外部 HTTP(S) 负载均衡器,请参阅使用 Compute Engine 后端设置区域级外部 HTTP(S) 负载均衡器。
- 如果您是全球外部 HTTP(S) 负载均衡器(经典版)的现有用户,则在规划使用全球外部 HTTP(S) 负载均衡器的新部署时,请确保查看规划向全球外部 HTTP(S) 负载均衡器的迁移。
- 如需了解如何使用 Terraform 自动执行外部 HTTP(S) 负载均衡设置,请参阅外部 HTTP(S) 负载均衡器的 Terraform 模块示例。
- 如需了解如何配置适用于全球外部 HTTP(S) 负载均衡器的高级流量管理功能,请参阅全球外部 HTTP(S) 负载均衡器流量管理概览。
- 如需了解如何配置适用于区域级外部 HTTP(S) 负载均衡器的高级流量管理功能,请参阅区域级外部 HTTP(S) 负载均衡器流量管理概览。
- 如需查找 Google PoP 的位置,请参阅 GFE 位置。
- 如需了解容量管理,请参阅《教程:使用负载均衡进行容量管理》和使用全局负载均衡进行应用容量优化。
- 如需了解如何托管和服务网站,请参阅托管和服务网站。
- 如需了解如何使用 Certificate Manager 预配和管理 SSL 证书,请参阅 Certificate Manager 概览。