本文档介绍了解如何配置外部应用负载均衡器所需了解的概念。
外部应用负载均衡器是一种基于代理的第 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) 流量。如需详细了解请求分配过程,请参阅流量分配。 在标准网络服务层级中,此负载均衡器只能将流量分配到单个区域内的后端。 | 如需查看功能的完整列表,请参阅负载均衡功能页面。 | 
| 区域级外部应用负载均衡器 | 此负载均衡器具有现有传统应用负载均衡器的许多功能,以及一些高级流量管理功能。 如果您只想传送来自一个地理位置的内容(例如,出于满足合规性规定的目的),请使用此负载均衡器。 此负载均衡器可以在高级层级或标准层级中配置。 | 
 | 
识别模式
控制台
- 在 Google Cloud 控制台中,前往负载均衡页面。 
- 负载均衡器标签页中将显示负载均衡器类型、协议和区域。如果区域为空,则负载均衡器为适用于全球。下表总结了如何识别负载均衡器的模式。 
| 负载均衡器模式 | 负载均衡器类型 | 访问权限类型 | 区域 | 
|---|---|---|---|
| 全球外部应用负载均衡器 | 应用 | 外部 | |
| 传统应用负载均衡器 | 应用(传统) | 外部 | |
| 区域级外部应用负载均衡器 | 应用 | 外部 | 指定一个区域 | 
gcloud
如需确定负载均衡器的模式,请运行以下命令:
gcloud compute forwarding-rules describe FORWARDING_RULE_NAME
在命令输出中,检查负载均衡方案、区域和网络层级。下表总结了如何识别负载均衡器的模式。
| 负载均衡器模式 | 负载均衡方案 | 转发规则 | 网络层级 | 
|---|---|---|---|
| 全球外部应用负载均衡器 | EXTERNAL_MANAGED | 全局 | 高级 | 
| 传统应用负载均衡器 | 外部 | 全局 | 标准或优质 | 
| 区域级外部应用负载均衡器 | EXTERNAL_MANAGED | 指定一个区域 | 标准或优质 | 
架构
外部应用负载均衡器部署需要以下资源:
- (仅适用于区域级外部应用负载均衡器)代理专用子网用于将来自负载均衡器的连接发送到后端。 
- 外部转发规则指定外部 IP 地址、端口和目标 HTTP(S) 代理。客户端使用 IP 地址和端口连接到负载均衡器。 
- 目标 HTTP(S) 代理接收来自客户端的请求。HTTP(S) 代理使用网址映射评估请求,从而做出流量路由决策。该代理还可以使用 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 地址、端口和协议将流量路由到由目标代理、网址映射和一个或多个后端服务组成的负载均衡配置。
IP 地址规范。每条转发规则都会提供一个 IP 地址,可用于应用的 DNS 记录。不需要基于 DNS 的负载均衡。 您可以指定要使用的 IP 地址,也可以让 Cloud Load Balancing 为您分配一个。
端口指定。应用负载均衡器的每条转发规则可以引用 1-65535 中的单个端口。如需支持多个端口,您必须配置多个转发规则。您可以将多个转发规则配置为使用相同的外部 IP 地址 (VIP) 并引用相同的目标 HTTP(S) 代理,只要每条转发规则的 IP 地址、端口和协议的整体组合是唯一的即可。这样,您就可以使用具有共享网址映射的单个负载均衡器作为多个应用的代理。
外部应用负载均衡器使用的转发规则类型、IP 地址和负载均衡方案取决于负载均衡器的模式以及负载均衡器所属的网络服务层级。
| 负载均衡器模式 | 网络服务层级 | 转发规则、IP 地址和负载均衡方案 | 从互联网到负载均衡器前端的路由 | 
|---|---|---|---|
| 全球外部应用负载均衡器 | 优质层级 | 负载均衡方案: | 请求路由到互联网中最靠近客户端的 GFE。 | 
| 传统应用负载均衡器 | 优质层级 | 负载均衡方案: | 请求路由到互联网中最靠近客户端的 GFE。 | 
| 标准层级 | 负载均衡方案: | 请求路由到负载均衡器所在区域中的 GFE。 | |
| 区域级外部应用负载均衡器 | 高级层级 或标准层级 | 负载均衡方案: | 请求到达距离客户端最近的 Google Cloud PoP。然后,请求会通过 Google Cloud的高级骨干网络路由,直到到达与负载均衡器位于同一区域的 Envoy 代理。 | 
EXTERNAL_MANAGED 后端服务附加到 EXTERNAL 转发规则。不过,EXTERNAL 后端服务无法附加到 EXTERNAL_MANAGED 转发规则。为了充分利用仅在全球外部应用负载均衡器中提供的新功能,我们建议您使用将资源从传统外部应用负载均衡器迁移到全球外部应用负载均衡器中所述的迁移流程,将现有的 EXTERNAL 资源迁移到 EXTERNAL_MANAGED。
如需查看每种模式下外部应用负载均衡器转发规则所支持的协议的完整列表,请参阅负载均衡器功能。
转发规则和 VPC 网络
本部分介绍了外部应用负载均衡器使用的转发规则如何与 VPC 网络相关联。
| 负载均衡器模式 | VPC 网络关联 | 
|---|---|
| 全球外部应用负载均衡器、 传统应用负载均衡器 | 没有关联的 VPC 网络。 转发规则始终使用 VPC 网络外部的 IP 地址。因此,转发规则没有关联的 VPC 网络。 | 
| 区域级外部应用负载均衡器 | 转发规则的 VPC 网络是创建代理专用子网所在的网络。您可以在创建转发规则时指定网络。 转发规则始终会与显式或隐式 VPC 网络相关联,具体取决于您使用的是 IPv4 地址还是 IPv6 地址范围。 
 | 
目标代理
目标代理会终结来自客户端的 HTTP(S) 连接。一条或多条转发规则会将流量定向到目标代理,目标代理会查询网址映射以确定如何将流量路由到后端。
请勿依赖代理来保留请求或响应标头名称的大小写。例如,Server: Apache/1.0 响应标头可能会在客户端显示为 server: Apache/1.0。
下表指定了外部应用负载均衡器所需的目标代理类型。
| 负载均衡器模式 | 目标代理类型 | 代理添加的标头 | 支持自定义标头 | 
|---|---|---|---|
| 全球外部应用负载均衡器 | 全局 HTTP、 全局 HTTPS | 代理将 HTTP 请求/响应标头设置为如下内容: 
 代理还会设置  | 在后端服务或后端存储桶上配置 Cloud CDN 不支持 | 
| 传统应用负载均衡器 | 全局 HTTP、 全局 HTTPS | 代理将 HTTP 请求/响应标头设置为如下内容: 
 代理还会设置  | 在后端服务或后端存储桶上配置 | 
| 区域级外部应用负载均衡器 | 区域级 HTTP、 区域级 HTTPS | 
 | 在网址映射中配置 | 
除了目标代理添加的标头之外,负载均衡器还会通过以下方式调整其他 HTTP 标头:
- 对于全球外部应用负载均衡器,请求和响应标头可能会转换为小写。 - 唯一的例外是将全球互联网 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 标头,则生成的标头如下所示:
X-Forwarded-For: <client-ip>,<load-balancer-ip>
如果传入的请求已包含 X-Forwarded-For 标头,则负载均衡器会将其值附加到现有标头:
X-Forwarded-For: <existing-value>,<client-ip>,<load-balancer-ip>
使用自定义请求标头移除现有标头值
您可以使用后端服务上的自定义请求标头来移除现有标头值。以下示例使用 --custom-request-header 标志,通过使用变量 client_ip_address 和 server_ip_address 重新创建 X-Forwarded-For 标头。此配置会将传入的 X-Forwarded-For 标头替换为仅包含客户端和负载均衡器 IP 地址的标头。
--custom-request-header=x-forwarded-for:{client_ip_address},{server_ip_address}
后端反向代理软件如何修改 X-Forwarded-For 标头
如果负载均衡器的后端运行 HTTP 反向代理软件,该软件可能会将以下一个或两个 IP 地址附加到 X-Forwarded-For 标头的末尾:
- 连接到后端的 GFE 的 IP 地址。 GFE IP 地址在 - 130.211.0.0/22和- 35.191.0.0/16范围内。
- 后端系统本身的 IP 地址。 
因此,上游系统可能会看到结构如下所示的 X-Forwarded-For 标头:
<existing-value>,<client-ip>,<load-balancer-ip>,<GFE-ip>,<backend-ip>
Cloud Trace 支持
应用负载均衡器不支持跟踪。全球和传统应用负载均衡器会添加 X-Cloud-Trace-Context 标头(如果不存在)。区域级外部应用负载均衡器不会添加此标头。如果 X-Cloud-Trace-Context 标头已存在,则会在未经修改的情况下通过负载均衡器。不过,负载均衡器不会导出任何跟踪记录或 span。
网址映射
网址映射定义了匹配模式,以便根据网址将请求路由到相应的后端服务。网址映射可让您通过检查网址的各部分来分流您的流量,从而将请求发送到不同组的后端。定义默认服务是为了处理所有与指定的主机规则或路径匹配规则不相符的请求。
在某些情况(例如多区域负载均衡示例)下,您可能不会定义任何网址规则,而仅依赖于默认服务。
网址映射支持多项高级流量管理功能,例如基于标头的流量导向、基于权重的流量分配和请求镜像。详情请参阅以下内容:
下表指定了每种模式下外部应用负载均衡器所需的网址映射类型。
| 负载均衡器模式 | 网址映射类型 | 
|---|---|
| 全球外部应用负载均衡器 | 全球 | 
| 传统应用负载均衡器 | 全球级(仅具有部分受支持的功能) | 
| 区域级外部应用负载均衡器 | 区域 | 
SSL 证书
使用目标 HTTPS 代理的外部应用负载均衡器需要私钥和 SSL 证书作为负载均衡器配置的一部分。
- Google Cloud 提供了两种为目标 HTTPS 代理分配私钥和 SSL 证书的配置方法:Compute Engine SSL 证书和 Certificate Manager。如需了解每个配置的说明,请参阅 SSL 证书概览中的证书配置方法。 
- Google Cloud 提供两种证书类型:自行管理的证书和 Google 管理的证书。如需了解每种类型的说明,请参阅 SSL 证书概览中的证书类型。 
外部应用负载均衡器的类型(全球、区域或传统)决定了支持的配置方法和证书类型。如需了解详情,请参阅 SSL 证书概览中的证书和 Google Cloud 负载均衡器。
SSL 政策
SSL 政策指定 Google Cloud 负载均衡器在与客户端协商 SSL 时使用的一组 SSL 功能。
默认情况下,HTTPS 负载均衡所用的一组 SSL 功能具有良好的安全性和广泛的兼容性,但某些应用需要更好地控制用于其 HTTPS 或 SSL 连接的 SSL 版本和加密方式。您可以定义 SSL 政策来指定负载均衡器在与客户端协商 SSL 时使用的一组 SSL 功能。此外,您还可以将该 SSL 政策应用于目标 HTTPS 代理。
下表指定了针对每种模式下的负载均衡器的 SSL 政策支持。
| 负载均衡器模式 | 支持的 SSL 政策 | 
|---|---|
| 全球外部应用负载均衡器 | |
| 传统应用负载均衡器 | |
| 区域级外部应用负载均衡器 | 
后端服务
后端服务向负载均衡器提供配置信息,以便后者将请求定向到其后端,例如 Compute Engine 实例组或网络端点组 (NEG)。如需详细了解后端服务,请参阅后端服务概览。
如需查看显示如何使用后端服务和 Compute Engine 后端设置负载均衡器的示例,请参阅使用 Compute Engine 后端设置外部应用负载均衡器。
后端服务范围
下表列出了外部应用负载均衡器使用的后端服务资源和范围:
| 负载均衡器模式 | 后端服务资源 | 
|---|---|
| 全球外部应用负载均衡器 | backendServices(全球) | 
| 传统应用负载均衡器 | backendServices(全球) | 
| 区域级外部应用负载均衡器 | regionBackendServices(区域) | 
后端协议
应用负载均衡器的后端服务必须使用以下某个协议将请求发送到后端:
- HTTP,其使用 HTTP/1.1 且不使用 TLS
- HTTPS,其使用 HTTP/1.1 和 TLS
- HTTP/2,其使用 HTTP/2 和 TLS(不支持无加密的 HTTP/2)。
- H2C,其使用基于 TCP 的 HTTP/2。无需使用 TLS。传统应用负载均衡器不支持 H2C。
负载均衡器仅使用您指定的后端服务协议与其后端通信。如果负载均衡器无法使用指定的后端服务协议与后端通信,则不会回退为使用其他协议。
后端服务协议不需要匹配客户端与负载均衡器通信所用的协议。例如,客户端可以使用 HTTP/2 向负载均衡器发送请求,而负载均衡器可以使用 HTTP/1.1(HTTP 或 HTTPS)与后端进行通信。
后端存储桶
后端存储桶将传入的流量定向到 Cloud Storage 存储桶。如需查看展示如何将存储桶添加到外部应用负载均衡器的示例,请参阅设置使用后端存储桶的负载均衡器。如需了解 Cloud Storage 的一般信息,请参阅什么是 Cloud Storage?
后端
下表指定了外部应用负载均衡器在每种模式下支持的后端和相关功能。
| 负载均衡器模式 | 后端服务上支持的后端1 | 支持后端存储桶 | 支持 Cloud Armor | 支持 Cloud CDN2 | 支持 IAP2 | 支持 Service Extensions | |||||
|---|---|---|---|---|---|---|---|---|---|---|---|
| 实例组3 | 可用区级 NEG4 | 互联网 NEG | 无服务器 NEG | 混合 NEG | Private Service Connect NEG | ||||||
| 全球外部应用负载均衡器 | |||||||||||
| 传统应用负载均衡器 | 高级层级 |  | |||||||||
| 区域级外部应用负载均衡器 | |||||||||||
1后端服务上的后端必须是同一类型:全部都是实例组,或者全部都是同一类型的 NEG。此规则的一个例外情况是,您可以在同一后端服务中同时使用 GCE_VM_IP_PORT 可用区级 NEG 和混合 NEG 来支持混合架构。
2 IAP 与 Cloud CDN 彼此不兼容。您无法在同一后端服务中同时启用这两者。
3 同一后端服务支持组合使用可用区级非托管式实例组、可用区级托管式实例组和区域级托管式实例组。如果将自动扩缩功能用于作为两个或更多后端服务的后端的托管式实例组,请将实例组的自动扩缩政策配置为使用多个信号。
4 可用区级 NEG 必须使用 GCE_VM_IP_PORT 端点。
后端和 VPC 网络
后端位置的限制取决于负载均衡器的类型。
对于全球外部应用负载均衡器后端,请遵循以下准则:
- (实例组后端的)后端实例和(NEG 后端的)后端端点可以位于同一组织的任何 VPC 网络中。不同的 VPC 网络不需要使用 VPC 网络对等互连连接,因为 GFE 直接与各自的 VPC 网络中的后端进行通信。 
- Cloud Storage 存储桶与 VPC 网络无关。它们可以位于同一组织中的任何项目中。 - 全球外部应用负载均衡器还支持共享 VPC 环境,您可以在其中跨项目共享 VPC 网络及其关联资源。不过,对于全球外部应用负载均衡器,您无需配置共享 VPC 即可引用贵组织中其他项目的后端服务或后端存储桶。 
对于传统应用负载均衡器后端,请遵循以下准则:
- 来自实例组后端的所有后端实例和来自 NEG 后端的所有后端端点都必须位于同一项目中。但是,实例组后端或 NEG 可以使用该项目中的其他 VPC 网络。不同的 VPC 网络不需要使用 VPC 网络对等互连连接,因为 GFE 直接与各自的 VPC 网络中的后端进行通信。 
- Cloud Storage 存储桶与 VPC 网络无关。不过,它们必须与负载均衡器位于同一项目中。 
对于区域级外部应用负载均衡器后端,请遵循以下准则:
- 对于实例组、可用区级 NEG 和混合连接 NEG,所有后端都必须位于与后端服务相同的项目和区域中。不过,负载均衡器可以引用与后端服务位于同一项目中,但使用其他 VPC 网络的后端。负载均衡器的 VPC 网络与后端 VPC 网络之间的连接可以使用 VPC 网络对等互连、Cloud VPN 隧道、Cloud Interconnect VLAN 连接或 Network Connectivity Center 框架进行配置。 - 后端网络定义 - 对于可用区级 NEG 和混合 NEG,您需要在创建 NEG 时明确指定 VPC 网络。
- 对于托管式实例组,VPC 网络在实例模板中定义。
- 对于非托管式实例组,实例组的 VPC 网络设置为与添加到实例组的第一个虚拟机的 nic0接口的 VPC 网络相匹配。
 - 后端网络要求 - 您的后端网络必须满足以下网络要求之一: - 后端的 VPC 网络必须与转发规则的 VPC 网络完全匹配。 
- 后端的 VPC 网络必须使用 VPC 网络对等互连连接到转发规则的 VPC 网络。您必须配置子网路由交换,以允许转发规则 VPC 网络中的代理专用子网与后端实例或端点所使用的子网之间进行通信。 
 
- 后端的 VPC 网络和转发规则的 VPC 网络都必须是附加到同一个 Network Connectivity Center hub 上的 VPC spoke。导入和导出过滤条件必须允许转发规则 VPC 网络中的代理专用子网与后端实例或端点所使用的子网之间进行通信。
- 对于所有其他类型的后端,所有后端都必须位于同一 VPC 网络和区域中。 - 区域级外部应用负载均衡器还支持共享 VPC 环境,您可以在其中跨项目共享 VPC 网络及其关联资源。如果您希望区域级外部应用负载均衡器的后端服务和后端位于与转发规则不同的项目中,则需要在具有跨项目服务引用的共享 VPC 环境中配置负载均衡器。 
后端和网络接口
如果您使用实例组后端,数据包始终会递送到 nic0。如果您想将数据包发送到非 nic0 接口(vNIC 或 Dynamic Network Interface),请改用 NEG 后端。
如果您使用的是可用区级 NEG 后端,数据包会发送到 NEG 中的端点所代表的任何网络接口。NEG 端点必须与 NEG 明确定义的 VPC 网络位于同一 VPC 网络中。
健康检查
每项后端服务都会指定健康检查,用于定期监控后端是否已准备好从负载均衡器接收连接。这样可以降低向无法处理请求的后端发送请求的风险。健康检查不会检查应用本身是否正常运行。
对于健康检查探测,您必须创建入站流量允许防火墙规则,以允许健康检查探测到达您的后端实例。通常,健康检查探测源自 Google 的集中式健康检查机制。
使用混合 NEG 后端的区域外部应用负载均衡器是此规则的一个例外,因为其健康检查源自代理专用子网。如需了解详情,请参阅混合 NEG 概览。
健康检查协议
最佳实践是使用其协议与后端服务的协议相匹配的健康检查,不过这并非强制性要求,而且也不一定可行。例如,HTTP/2 健康检查能够最准确地测试后端的 HTTP/2 连接性。相比之下,使用混合 NEG 后端的区域级外部应用负载均衡器不支持 gRPC 健康检查。如需查看受支持的健康检查协议的列表,请参阅负载均衡功能。
下表指定了每种模式下外部应用负载均衡器支持的健康检查范围。
| 负载均衡器模式 | 健康检查类型 | 
|---|---|
| 全球外部应用负载均衡器 | 全球 | 
| 传统应用负载均衡器 | 全球 | 
| 区域级外部应用负载均衡器 | 区域 | 
如需详细了解健康检查,请参阅以下内容:
防火墙规则
负载均衡器需要以下防火墙规则:
- 对于全球外部应用负载均衡器,是许可来自 Google Front End (GFE) 前端的流量到达后端的入站流量允许规则。 对于区域级外部应用负载均衡器,是许可来自代理专用子网的流量到达后端的入站流量允许规则。
- 允许来自健康检查探测范围的流量的入站允许规则。如需详细了解健康检查探测以及必须允许来自它们的流量的原因,请参阅探测 IP 范围和防火墙规则。
防火墙规则在虚拟机实例级层(而不是在 GFE 代理上)实现。您无法使用 Google Cloud 防火墙规则来阻止流量到达负载均衡器。 对于全球外部应用负载均衡器和传统应用负载均衡器,您可以使用 Google Cloud Armor 来实现此目的。
这些防火墙规则的端口必须如下配置:
- 允许发送到每个后端服务的健康检查的目标端口的流量。 
- 对于实例组后端:通过后端服务的已命名端口与每个实例组上与该已命名端口关联的端口号之间的映射来确定要配置的端口。分配给同一后端服务的各实例组的端口号可能各不相同。 
- 对于 - GCE_VM_IP_PORTNEG 后端:允许发送到端点的端口号的流量。
下表汇总了防火墙规则所需的来源 IP 地址范围:
| 负载均衡器模式 | 健康检查来源范围 | 请求来源范围 | 
|---|---|---|
| 全球外部应用负载均衡器 | 
 对于进入后端的 IPv6 流量: 
 | GFE 流量来源取决于后端类型: 
 | 
| 传统应用负载均衡器 | 
 | GFE 流量来源取决于后端类型: 
 | 
| 区域级外部应用负载均衡器 | 
 对于进入后端的 IPv6 流量: 
 | 您配置的代理专用子网。 | 
GKE 支持
GKE 会通过以下方式使用外部应用负载均衡器:
- 使用 GKE Gateway Controller 创建的外部网关可以使用外部应用负载均衡器的任何模式。您可以通过选择 GatewayClass 来控制负载均衡器的模式。GKE Gateway Controller 始终使用 GCE_VM_IP_PORT可用区级 NEG 后端。
- 使用 GKE Ingress 控制器创建的外部 Ingress 始终是传统应用负载均衡器。GKE Ingress 控制器更喜欢使用 GCE_VM_IP_PORT可用区级 NEG 后端,但也支持实例组后端。
- 您可以使用由 GKE 服务创建和管理的 GCE_VM_IP_PORT可用区级 NEG 作为任何应用负载均衡器或代理网络负载均衡器的后端。如需了解详情,请参阅通过独立可用区级 NEG 实现容器原生负载均衡机制。
共享 VPC 架构
外部应用负载均衡器支持使用共享 VPC 的网络。共享 VPC 可让组织将多个项目中的资源连接到一个公用 VPC 网络,让它们能够通过使用该网络中的内部 IP 地址安全高效地相互通信。如果您还不熟悉共享 VPC,请阅读共享 VPC 概览。
在共享 VPC 网络中配置外部应用负载均衡器有多种方法。无论部署类型如何,负载均衡器的所有组件都必须位于同一组织中。
| 负载均衡器 | 前端组件 | 后端组件 | 
|---|---|---|
| 全球外部应用负载均衡器 | 如果您的后端使用共享 VPC 网络,请在共享 VPC 宿主项目中创建所需的网络。 全球外部 IP 地址、转发规则、目标 HTTP(S) 代理和关联的网址映射必须在同一项目中定义。此项目可以是宿主项目,也可以是服务项目。 | 您可以执行下列任一操作: 
 每个后端服务都必须在其引用的后端所在的项目中定义。与后端服务关联的健康检查也必须在后端服务所在的项目中定义。 后端可以是宿主项目中的共享 VPC 网络的一部分,也可以是独立 VPC 网络(即服务项目中的非共享 VPC 网络)的一部分。 | 
| 传统应用负载均衡器 | 全球外部 IP 地址、转发规则、目标 HTTP(S) 代理和关联的网址映射必须在后端所在的宿主项目或服务项目中定义。 | 全球后端服务必须在后端(实例组或 NEG)所在的宿主项目或服务项目中定义。与后端服务相关的健康检查也必须在后端服务所在的项目中定义。 | 
| 区域级外部应用负载均衡器 | 在共享 VPC 宿主项目中创建所需的网络和代理专用子网。 区域外部 IP 地址、转发规则、目标 HTTP(S) 代理和关联的网址映射必须在同一项目中定义。此项目可以是宿主项目,也可以是服务项目。 | 您可以执行下列任一操作: 
 每个后端服务都必须在其引用的后端所在的项目中定义。与后端服务相关的健康检查也必须在后端服务所在的项目中定义。 | 
虽然您可以在共享 VPC 宿主项目中创建所有负载均衡组件和后端,但此部署类型不会划分网络管理和服务开发责任。
服务项目中的所有负载均衡器组件和后端
以下架构图展示了标准共享 VPC 部署,其中所有负载均衡器组件和后端都位于服务项目中。所有应用负载均衡器都支持此部署类型。
负载均衡器组件和后端必须使用相同的 VPC 网络。
共享 VPC 环境中的无服务器后端
对于使用无服务器 NEG 后端的负载均衡器,后端 Cloud Run 或 Cloud Run functions 服务必须与无服务器 NEG 位于同一项目中。
此外,对于支持跨项目服务引用的区域外部应用负载均衡器,后端服务、无服务器 NEG 和 Cloud Run 服务必须始终位于同一服务项目中。
跨项目服务引用
跨项目服务引用是一种部署模型,其中负载均衡器的前端和网址映射位于一个项目中,而负载均衡器的后端服务和后端位于其他项目中。
借助跨项目服务引用,组织可以配置一个中央负载均衡器并将流量路由到跨多个不同项目分布的数百个服务。您可以在一个网址映射中集中管理所有流量路由规则和政策。您还可以将负载均衡器与一组主机名和 SSL 证书相关联。这样,您就可以优化部署应用所需的负载均衡器数量,并降低可管理性、运营费用和配额要求。
通过为每个职能团队设置不同的项目,您还可以实现组织中的角色分离。服务所有者可以专注于在服务项目中构建服务,而网络团队可以在另一个项目中预配和维护负载均衡器,这两个角色都可以使用跨项目服务引用进行连接。
服务所有者可以维护其服务公开的自主性,并控制哪些用户可以通过使用负载均衡器访问其服务。这是通过名为 Compute Load Balancer Services User 角色 (roles/compute.loadBalancerServiceUser) 的特殊 IAM 角色实现的。
跨项目服务引用支持因负载均衡器的类型而异:
- 对于全球外部应用负载均衡器:负载均衡器的前端和网址映射可以引用同一组织的任何项目中的后端服务或后端存储桶。不受 VPC 网络限制。虽然您可以使用共享 VPC 环境来配置跨项目部署(如此示例所示),但这并不是必要条件。 
- 对于区域级外部应用负载均衡器:您必须在共享 VPC 环境中创建负载均衡器。负载均衡器的前端和网址映射必须位于宿主项目或服务项目中,而负载均衡器的后端服务和后端可以分布在同一共享 VPC 环境的宿主项目或服务项目中。 
如需了解如何为区域级外部应用负载均衡器配置共享 VPC(无论是否使用跨项目服务引用),请参阅设置使用共享 VPC 区域的外部应用负载均衡器。
跨项目服务引用的使用说明
- 
    跨项目服务引用可用于实例组、无服务器 NEG 或大部分其他受支持的后端类型。但是,存在以下限制: - 使用全球外部应用负载均衡器时,如果后端服务具有基于 App Engine 的无服务器 NEG 后端,则您无法引用跨项目后端服务。 
- 使用区域级外部应用负载均衡器时,如果后端服务具有区域级互联网 NEG 后端,则您无法引用跨项目后端服务。
 
- 传统应用负载均衡器不支持跨项目服务引用。
- Google Cloud 不会区分多个项目中使用同一名称的资源(例如,后端服务)。因此,当您使用跨项目服务引用时,我们建议您在组织内的项目中使用唯一的后端服务名称。
- 如果您看到“不允许对此资源进行跨项目引用”等错误,请确保您有权使用该资源。拥有该资源的项目的管理员必须为您授予 Compute Load Balancer Services User 角色 (roles/compute.loadBalancerServiceUser)。可以在项目级层或资源级层授予此角色。例如,请参阅向 Compute Load Balancer Admin 授予使用后端服务或后端存储桶的权限。
示例 1:不同服务项目中的负载均衡器前端和后端
以下是共享 VPC 部署的示例,其中负载均衡器的前端和网址映射在服务项目 A 中创建,而网址映射引用服务项目 B 中的后端服务。
在这种情况下,服务项目 A 中的 Network Admin 或 Load Balancer Admin 需要访问服务项目 B 中的后端服务。服务项目 B 的管理员将 Compute Load Balancer Services User 角色 (roles/compute.loadBalancerServiceUser) 授予服务项目 A 中希望引用服务项目 B 中的后端服务的负载均衡器管理员。
示例 2:宿主项目中的负载均衡器前端和服务项目中的后端
以下是共享 VPC 部署的示例,其中负载均衡器的前端和网址映射在宿主项目中创建,后端服务(和后端)在服务项目中创建。
在这种情况下,宿主项目中的 Network Admin 或 Load Balancer Admin 需要访问服务项目中的后端服务。服务项目管理员将 Compute Load Balancer Services User 角色 (roles/compute.loadBalancerServiceUser) 授予宿主项目 A 中希望引用服务项目中的后端服务的负载均衡器管理员。
示例 3:不同项目中的负载均衡器前端和后端
以下是部署的示例,其中全球外部应用负载均衡器的前端和网址映射在与负载均衡器的后端服务和后端不同的项目中创建。此类部署不使用共享 VPC,并且仅受全球外部应用负载均衡器支持。
如需详细了解此设置,请参阅使用后端服务和后端存储桶设置跨项目服务引用。
高可用性和故障切换
外部应用负载均衡器中的高可用性和故障切换可以在负载均衡器级别进行配置。通过在需要备份的任何区域创建备用区域级外部应用负载均衡器可以处理此问题。
下表介绍了故障切换行为。
| 负载均衡器模式 | 故障切换方法 | 
|---|---|
| 全球外部应用负载均衡器、 传统应用负载均衡器 | 您可以配置主动-被动故障切换配置,采用这种配置后,流量会故障切换到备用区域级外部应用负载均衡器。您可以使用健康检查来检测服务中断情况,并在触发故障切换时使用 Cloud DNS 路由政策来路由流量。 | 
| 区域级外部应用负载均衡器 | 请使用以下方法之一来确保部署具有高可用性: 
 | 
HTTP/2 支持
HTTP/2 是 HTTP/1 协议的重大修订版本。HTTP/2 支持有 2 种模式:
- 基于 TLS 的 HTTP/2
- 基于 TCP 的明文 HTTP/2
基于 TLS 的 HTTP/2
客户端与外部应用负载均衡器之间的连接以及负载均衡器与其后端之间的连接支持基于 TLS 的 HTTP/2。
在进行 TLS 握手过程中,负载均衡器会通过使用 ALPN TLS 扩展程序与客户端自动协商 HTTP/2。即使负载均衡器配置为使用 HTTPS,新型客户端也会默认使用 HTTP/2。这是在客户端而非负载均衡器上控制的。
如果客户端不支持 HTTP/2,并且负载均衡器配置为在负载均衡器和后端实例之间使用 HTTP/2,则负载均衡器可能仍会协商 HTTPS 连接或接受不安全的 HTTP 请求。 然后,负载均衡器会转换这些 HTTPS 或 HTTP 请求,以便通过 HTTP/2 将请求代理到后端实例。
如需使用基于 TLS 的 HTTP/2,您必须在后端启用 TLS,并将后端服务协议设置为 HTTP2。如需了解详情,请参阅从负载均衡器到后端的加密。
HTTP/2 并发流数量上限
HTTP/2 SETTINGS_MAX_CONCURRENT_STREAMS 设置说明了由对等方发起并由端点接受的最大流数。HTTP/2 客户端向Google Cloud 负载均衡器通告的值实际上毫无意义,因为负载均衡器不会向客户端发起流。
如果负载均衡器使用 HTTP/2 与在虚拟机上运行的服务器通信,则负载均衡器遵循服务器所通告的 SETTINGS_MAX_CONCURRENT_STREAMS 值,但最大值为 100。在请求方向(Google Cloud 负载均衡器 → gRPC 服务器),负载均衡器使用来自 gRPC 服务器的初始 SETTINGS 帧来确定每个连接可以同时使用的流数量。如果服务器通告的值高于 100,则负载均衡器会将并发流的数量上限设为 100。如果通告零值,则负载均衡器无法将请求转发给服务器,这可能会导致错误。
HTTP/2 动态标头表大小
HTTP/2 通过多路复用和 HPACK 标头压缩等功能显著改进了 HTTP/1.1。HPACK 使用动态表来增强标头压缩,从而加快所有操作的速度。如需了解 HTTP/2 中动态标头表大小更改的影响、此功能如何提升性能,以及各种 HTTP 客户端库中的特定 bug 如何导致 HPACK 标头压缩出现问题,请参阅社区文章。
HTTP/2 限制
- 在负载均衡器和实例之间使用 HTTP/2 时,需要与实例之间建立的 TCP 连接数量要比使用 HTTP 或 HTTPS 时多得多。HTTP/2 不支持连接池;连接池是一项优化功能,可通过 HTTP 或 HTTPS 减少这些连接的数量。因此,您可能会看到后端延迟时间较长,因为系统会进行更频繁的后端连接。
- 在负载均衡器和后端之间使用 HTTP/2 时,不支持通过单个 HTTP/2 连接流 (RFC 8441) 运行 WebSocket 协议。
- 负载均衡器和后端之间的 HTTP/2 不支持服务器推送。
- Google Cloud API 或 Google Cloud 控制台中不会显示 gRPC 错误率和请求量。因此,即便 gRPC 端点返回错误,负载均衡器日志和监控数据仍会报告 200 OKHTTP 状态代码。
基于 TCP 的明文 HTTP/2 (H2C)
基于 TCP 的明文 HTTP/2(也称为 H2C)可让您在不使用 TLS 的情况下使用 HTTP/2。以下两种连接都支持 H2C:
- 客户端与负载均衡器之间的连接。无需特殊配置。
- 负载均衡器与其后端之间的连接。 - 如需为负载均衡器及其后端之间的连接配置 H2C,请将后端服务协议设置为 - H2C。
使用 GKE Gateway Controller 和 Cloud Service Mesh 创建的负载均衡器也支持 H2C。
传统应用负载均衡器不支持 H2C。
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 的支持。 | 
| DISABLE | 明确停用向客户端通告 HTTP/3 和 Google QUIC。 | 
如需明确启用(或停用)HTTP/3,请按照以下步骤操作。
控制台:HTTPS
- 在 Google Cloud 控制台中,转到负载均衡页面。
- 选择要修改的负载均衡器。
- 点击前端配置。
- 选择要修改的前端 IP 地址和端口。如需修改 HTTP/3 配置,协议必须为 HTTPS。
启用 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。
- 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。
WebSocket 支持
当您使用 HTTP 或 HTTPS 作为后端协议时,基于Google Cloud HTTP(S) 的负载均衡器支持 WebSocket 协议。负载均衡器不需要进行任何配置即可代理 WebSocket 连接。
WebSocket 协议提供客户端和负载均衡器之间的全双工通信通道。如需了解详情,请参阅 RFC 6455。
WebSocket 协议的工作原理如下:
- 负载均衡器识别到来自 HTTP 或 HTTPS 客户端的 WebSocket Upgrade请求。该请求包含Connection: Upgrade和Upgrade: websocket标头,后跟其他有关的 WebSocket 相关请求标头。
- 后端发送 WebSocket Upgrade响应。后端实例发送包含Connection: Upgrade和Upgrade: websocket标头及其他 WebSocket 相关响应标头的101 switching protocol响应。
- 负载均衡器会在当前连接期间代理双向流量。
如果后端实例返回状态代码 426 或 502,则负载均衡器会关闭连接。
WebSocket 的会话亲和性与其他任何请求的运作方式相同。如需了解详情,请参阅会话亲和性。
gRPC 支持
gRPC 是远程过程调用的开源框架。它基于 HTTP/2 标准运行。适合使用 gRPC 的场景如下:
- 延迟时间短、扩缩能力强的分布式系统
- 开发与云服务器通信的移动客户端
- 设计必须准确、高效并且独立于语言的新协议
- 支持扩展、身份验证和日志记录的分层设计
如需将 gRPC 与您的 Google Cloud 应用搭配使用,您必须通过 HTTP/2 以端到端方式对请求进行代理。为此,您可以使用以下某个配置创建应用负载均衡器:
- 对于端到端未加密流量(不使用 TLS):您可以创建 HTTP 负载均衡器(使用目标 HTTP 代理进行配置)。此外,您还可以将后端服务协议设置为 - H2C,以便配置负载均衡器将 HTTP/2 用于负载均衡器与其后端之间的未加密连接。
- 对于端到端加密流量(使用 TLS):您可以创建 HTTPS 负载均衡器(使用目标 HTTPS 代理和 SSL 证书进行配置)。在进行 SSL 握手过程中,负载均衡器会通过使用 ALPN TLS 扩展程序与客户端协商 HTTP/2。 - 此外,您还必须确保后端可以处理 TLS 流量,并将后端服务协议设置为 - HTTP2,以便配置负载均衡器将 HTTP/2 用于负载均衡器与其后端之间的加密连接。- 负载均衡器仍然可以与某些客户端协商 HTTPS,或接受配置为在负载均衡器和后端实例之间使用 HTTP/2 的负载均衡器上的不安全 HTTP 请求。这些 HTTP 或 HTTPS 请求由负载均衡器进行转换,以便通过 HTTP/2 将请求代理到后端实例。 
如果要将 HTTP/2 与 Google Kubernetes Engine Ingress 搭配使用或者将 gRPC 和 HTTP/2 与 Ingress 搭配使用来配置应用负载均衡器,请参阅 HTTP/2 与 Ingress 搭配使用实现负载均衡。
如果您想将 HTTP/2 与 Cloud Run 搭配使用来配置外部应用负载均衡器,请参阅在负载均衡器后使用 HTTP/2。
如需了解如何排查 HTTP/2 问题,请参阅排查后端 HTTP/2 问题。
如需了解 HTTP/2 限制,请参阅 HTTP/2 限制。
TLS 支持
默认情况下,HTTPS 目标代理在终结客户端 SSL 请求时仅接受 TLS 1.0、1.1、1.2 和 1.3。
当全球外部应用负载均衡器或区域级外部应用负载均衡器使用 HTTPS 作为后端服务协议时,它们可以与后端协商 TLS 1.2 或 1.3。当传统应用负载均衡器使用 HTTPS 作为后端服务协议时,它可以与后端协商 TLS 1.0、1.1、1.2 或 1.3。
双向 TLS 支持
双向 TLS (mTLS) 是一种业界标准协议,用于在客户端和服务器之间进行双向身份验证。mTLS 通过验证客户端和服务器是否都持有受信任的证书授权机构 (CA) 颁发的有效证书,帮助确保客户端和服务器可以相互验证身份。与仅验证服务器身份的标准 TLS 不同,mTLS 要求客户端和服务器都提供证书,以在建立通信之前确认双方的身份。
所有应用负载均衡器都支持 mTLS。如果使用 mTLS,负载均衡器会请求客户端在与负载均衡器进行 TLS 握手期间发送证书以进行身份验证。您可以配置 Certificate Manager 受信任证书存储区,然后负载均衡器会使用它来验证客户端证书的信任链。
如需详细了解 mTLS,请参阅双向 TLS 身份验证。
TLS 1.3 早期数据支持
对于基于 TCP 的 HTTPS(HTTP/1.1、HTTP/2)和基于 QUIC 的 HTTP/3,以下外部应用负载均衡器的目标 HTTPS 代理支持 TLS 1.3 早期数据:
- 全球外部应用负载均衡器
- 传统应用负载均衡器
TLS 1.3 在 RFC 8446 中定义,并引入了早期数据(也称为零往返时间 [0-RTT] 数据)的概念,这可以将恢复连接的应用性能提高 30% 到 50%。
使用 TLS 1.2 时,需要进行两次往返才能安全地传输数据。TLS 1.3 将其缩短为新连接仅需一次往返 (1-RTT),使客户端能够在收到第一个服务器响应后立即发送应用数据。此外,TLS 1.3 针对已恢复会话引入了早期数据概念,使客户端能够使用初始 ClientHello 发送应用数据,从而将有效往返时间缩短为零 (0-RTT)。借助 TLS 1.3 的早期数据,后端服务器可以在与客户端的握手过程完成之前开始处理客户端数据,从而缩短延迟时间;不过,必须注意降低重放风险。
由于早期数据是在握手完成之前发送的,因此攻击者可以尝试捕获和重放请求。为缓解这种情况,后端服务器必须谨慎控制早期数据的使用,将其使用限制在幂等请求范围内。旨在实现幂等性但可能会触发非幂等性更改的 HTTP 方法(例如修改数据库的 GET 请求)不得接受早期数据。在这种情况下,后端服务器必须通过返回 HTTP 425 Too Early 状态代码来拒绝包含 HTTP Early-Data: 1 标头的请求。
包含早期数据的请求会将 HTTP 早期数据标头设置为值 1,这会向后端服务器表明请求已通过 TLS 早期数据传输。它还表明客户端已了解 HTTP 425 Too
Early 状态代码。
TLS 早期数据 (0-RTT) 模式
您可以在负载均衡器的目标 HTTPS 代理资源上使用以下某种模式配置 TLS 早期数据。
- STRICT。这会为使用安全 HTTP 方法(GET、HEAD、OPTIONS、TRACE)的请求以及不包含查询参数的 HTTP 请求启用 TLS 1.3 早期数据。请求发送的早期数据包含非幂等 HTTP 方法(例如 POST 或 PUT)或查询参数时,该请求会被拒绝,并返回 HTTP- 425状态代码。
- PERMISSIVE。这会为使用安全 HTTP 方法(GET、HEAD、OPTIONS、TRACE)的请求启用 TLS 1.3 早期数据。此模式不会拒绝包含查询参数的请求。应用所有者必须确保早期数据可安全地用于每个请求路径,尤其是用于请求重放可能会导致意外副作用(例如 GET 请求触发了日志记录或数据库更新)的端点。
- DISABLED。TLS 1.3 早期数据不会被通告,任何(无效的)发送早期数据的尝试都会遭到拒绝。如果您的应用无法安全地处理早期数据请求,则必须停用早期数据。TLS 1.3 早期数据默认处于停用状态。
- UNRESTRICTED(不建议用于大多数工作负载)。此模式为使用任何 HTTP 方法(包括非幂等方法,例如 POST)的请求启用 TLS 1.3 早期数据。此模式不强制执行任何其他限制。此模式对于 gRPC 用例来说非常有用。不过,除非您评估了安全状况并使用其他机制降低了重放攻击的风险,否则我们不建议您采用这种方法。
配置 TLS 早期数据
如需明确启用或停用 TLS 早期数据,请执行以下操作:
控制台
- 在 Google Cloud 控制台中,前往负载均衡页面。 
- 选择您需要为其启用早期数据的负载均衡器。 
- 点击修改。 
- 点击前端配置。 
- 选择要修改的前端 IP 地址和端口。如需启用 TLS 早期数据,协议必须为 HTTPS。 
- 在早期数据 (0-RTT) 列表中,选择 TLS 早期数据模式。 
- 点击完成。 
- 如需更新负载均衡器,请点击更新。 
gcloud
- 在应用负载均衡器的目标 HTTPS 代理上配置 TLS 早期数据模式。 - gcloud compute target-https-proxies update TARGET_HTTPS_PROXY \ --tls-early-data=TLS_EARLY_DATA_MODE - 替换以下内容: - TARGET_HTTPS_PROXY:负载均衡器的目标 HTTPS 代理
- TLS_EARLY_DATA_MODE:- STRICT、- PERMISSIVE、- DISABLED或- UNRESTRICTED
 
API
PATCH https://compute.googleapis.com/compute/v1/projects/{project}/global/targetHttpsProxies/TARGET_HTTPS_PROXY
{
    "tlsEarlyData":"TLS_EARLY_DATA_MODE",
    "fingerprint": "FINGERPRINT"
}
替换以下内容:
- TARGET_HTTPS_PROXY:负载均衡器的目标 HTTPS 代理
- TLS_EARLY_DATA_MODE:- STRICT、- PERMISSIVE、- DISABLED或- UNRESTRICTED
- FINGERPRINT:使用 base64 编码的字符串。必须提供最新的指纹,才能为目标 HTTPS 代理打补丁;否则,请求将失败并显示 HTTP- 412 Precondition Failed状态代码。
配置 TLS 早期数据后,您可以通过支持 TLS 早期数据的 HTTP 客户端发出请求。您可以观察到恢复的请求缩短了延迟时间。
如果不符合 RFC 的客户端发送的请求使用非幂等方法或查询参数,则请求会被拒绝。您会在负载均衡器日志中看到 HTTP 425 Early 状态代码和以下 HTTP 响应:
HTTP/1.1 425 Too Early Content-Type: text/html; charset=UTF-8 Referrer-Policy: no-referrer Content-Length: 1558 Date: Thu, 03 Aug 2024 02:45:14 GMT Connection: close <!DOCTYPE html> <html lang=en> <title>Error 425 (Too Early)</title> <p>The request was sent to the server too early, please retry. That's all we know.</p> </html>
限制
- 终止 SSL 连接时,HTTPS 负载均衡器不会发送 - close_notify关闭提醒。也就是说,负载均衡器会关闭 TCP 连接,而不是执行 SSL 关停。
- HTTPS 负载均衡器仅支持在证书的通用名称 ( - CN) 特性或主题备用名称 (- SAN) 特性中网域包含小写字符。只有在目标代理中设置为主证书时,系统才会返回网域中包含大写字符的证书。
- 除了连接到互联网 NEG 后端的负载均衡器之外,HTTPS 负载均衡器在连接到后端时不会使用服务器名称指示 (SNI) 扩展程序。如需了解详情,请参阅从负载均衡器到后端的加密。 
- Google Cloud 不保证底层 TCP 连接在后端服务超时的整个期间保持打开状态。客户端系统必须实现重试逻辑,而不是依赖 TCP 连接长时间保持打开状态。 
- 使用Google Cloud 控制台在高级层级中创建区域级外部应用负载均衡器时, Google Cloud 控制台仅提供支持标准层级的区域。如需访问其他区域,请使用 gcloud CLI 或 API。 
- 全球和传统应用负载均衡器使用的 GFE 代理不支持在请求的 POST 载荷完全代理到后端之前发送的早期 - 200 OK响应。发送过早的- 200 OK响应会导致 GFE 关闭与后端的连接。- 您的后端必须在收到请求标头后立即以 - 100 Continue响应进行响应,然后等待直到请求的 POST 载荷已完全通过代理,然后以最终的- 200 OK响应代码进行响应。
- 在共享 VPC 环境中将区域外部应用负载均衡器与 Cloud Run 搭配使用时,服务项目中的独立 VPC 网络可以将流量发送到在同一共享 VPC 环境中的其他任何项目中部署的任何其他 Cloud Run 服务。这是一个已知问题。 
- 借助 Cloud CDN,您可以通过发出缓存失效操作请求来强制缓存忽略一个对象或一组对象。如果您使用的是具有共享 VPC 跨项目服务引用的全球外部应用负载均衡器,则默认情况下,服务项目管理员没有请求缓存失效操作所需的权限。这是因为缓存失效操作在前端项目(即包含转发规则、目标代理和负载均衡器的网址映射的项目)中进行配置。因此,缓存失效操作只能由具有 IAM 角色的主账号发出,以在前端项目中配置负载均衡器相关资源(例如 Compute Network Admin 角色)。在单独项目中控制后端服务预配的服务管理员需要与前端项目的负载均衡器管理员合作,为其跨项目服务发出缓存失效操作。 
后续步骤
- 如需了解外部应用负载均衡器如何处理连接、路由流量和保持会话亲和性,请参阅外部应用负载均衡器的请求分配。 
- 如需了解如何部署全球外部应用负载均衡器,请参阅使用 Compute Engine 后端设置外部应用负载均衡器。 
- 如需了解如何部署区域级外部应用负载均衡器,请参阅使用 Compute Engine 后端设置区域级外部应用负载均衡器。
- 如果您是传统应用负载均衡器的现有用户,则在规划使用全球外部应用负载均衡器的新部署时,请确保查看迁移概览。 
- 如需了解如何使用 Terraform 自动执行外部应用负载均衡器设置,请参阅外部应用负载均衡器的 Terraform 模块示例。 
- 如需了解如何配置适用于全球外部应用负载均衡器的高级流量管理功能,请参阅全球外部应用负载均衡器的流量管理概览。 
- 如需了解如何配置适用于区域级外部应用负载均衡器的高级流量管理功能,请参阅区域级外部应用负载均衡器流量管理概览。
- 如需了解如何托管和服务网站,请参阅托管和服务网站。 
- 如需查找 Google PoP 的位置,请参阅 GFE 位置。 
- 如需了解容量管理,请参阅《教程:使用负载均衡进行容量管理》和使用全局负载均衡进行应用容量优化。 
- 如需了解如何使用 Certificate Manager 预配和管理 SSL 证书,请参阅 Certificate Manager 概览。 
- 如需将自定义逻辑插入负载均衡数据路径,请配置 Service Extensions 插件或标注。 
- 对于区域级外部应用负载均衡器,您可以尝试使用 Apigee Shadow API Discovery 在现有的Google Cloud 基础设施中查找影子 API(也称为未记录的 API)。在启用 Shadow API Discovery 之前,请务必阅读相关的限制。