外部应用负载均衡器概览

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

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

操作模式

您可以在区域级模式下使用此负载均衡器,后文中将其称为区域级外部应用负载均衡器。此负载均衡器作为基于开源 Envoy 代理的托管式服务实现。其中包括高级流量管理功能,例如流量镜像、基于权重的流量分配,以及基于请求或基于响应的标头转换。区域级模式可确保所有客户端和后端都位于指定区域。如果您想仅从一个地理位置传送内容(例如,为了符合合规性规定),请使用此负载均衡器。

架构

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

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

  • 外部转发规则指定外部 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 地址、端口和协议将流量路由到由目标代理、网址映射和一个或多个后端服务组成的负载均衡配置。

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

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

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

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

区域级外部转发规则

区域级外部 IP 地址

负载均衡方案:
EXTERNAL_MANAGED

请求到达距离客户端最近的 Trusted Cloud PoP。然后,请求会通过 Trusted Cloud的高级骨干网络路由,直到到达与负载均衡器位于同一区域的 Envoy 代理。

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

转发规则和 VPC 网络

本部分介绍了外部应用负载均衡器使用的转发规则如何与 VPC 网络相关联。

负载均衡器模式 VPC 网络关联
区域级外部应用负载均衡器

转发规则的 VPC 网络是创建代理专用子网所在的网络。您可以在创建转发规则时指定网络。

转发规则始终会与显式或隐式 VPC 网络相关联,具体取决于您使用的是 IPv4 地址还是 IPv6 地址范围。

  • 区域级外部 IPv4 地址始终位于 VPC 网络外部。不过,创建转发规则时,您需要指定已创建代理专用子网的 VPC 网络。因此,转发规则具有显式网络关联。
  • 区域级外部 IPv6 地址范围始终位于 VPC 网络内。创建转发规则时,您需要指定从中获取 IP 地址范围的子网。此子网必须位于创建代理专用子网的同一区域和 VPC 网络中。因此,存在隐含的网络关联。

目标代理

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

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

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

负载均衡器模式 目标代理类型 代理添加的标头 支持自定义标头
区域级外部应用负载均衡器 区域级 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 标头:

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

主机标头

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

X-Forwarded-For 标头

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

  1. 连接到负载均衡器的客户端的 IP 地址
  2. 负载均衡器转发规则的 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_addressserver_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 标头的末尾:

  1. 连接到后端的 GFE 的 IP 地址。 GFE IP 地址在 130.211.0.0/2235.191.0.0/16 范围内。

  2. 后端系统本身的 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 证书作为负载均衡器配置的一部分。

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

区域级外部应用负载均衡器支持自行管理的 Compute Engine SSL 证书

SSL 政策

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

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

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

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

后端服务

后端服务向负载均衡器提供配置信息,以便后者将请求定向到其后端,例如 Compute Engine 实例组或网络端点组 (NEG)。如需详细了解后端服务,请参阅后端服务概览

后端服务范围

下表列出了外部应用负载均衡器使用的后端服务资源和范围:

负载均衡器模式 后端服务资源
区域级外部应用负载均衡器 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)与后端进行通信。

后端

区域级外部应用负载均衡器支持以下类型的后端:

  • 实例组
  • 区域 NEG
  • 互联网 NEG

后端和 VPC 网络

对于区域级外部应用负载均衡器后端,请遵循以下准则:

  • 对于实例组、可用区级 NEG 和混合连接 NEG,所有后端都必须位于与后端服务相同的项目和区域中。不过,负载均衡器可以引用与后端服务位于同一项目中,但使用其他 VPC 网络的后端。负载均衡器的 VPC 网络与后端 VPC 网络之间的连接可以使用 VPC 网络对等互连、Cloud VPN 隧道或 Cloud Interconnect VLAN 连接进行配置。

    后端网络定义

    • 对于可用区级 NEG 和混合 NEG,您需要在创建 NEG 时明确指定 VPC 网络。
    • 对于托管式实例组,VPC 网络在实例模板中定义。
    • 对于非托管式实例组,实例组的 VPC 网络设置为与添加到实例组的第一个虚拟机的 nic0 接口的 VPC 网络相匹配。

    后端网络要求

    您的后端网络必须满足以下网络要求之一:

    • 后端的 VPC 网络必须与转发规则的 VPC 网络完全匹配。

    • 后端的 VPC 网络必须使用 VPC 网络对等互连连接到转发规则的 VPC 网络。您必须配置子网路由交换,以允许转发规则 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 健康检查。如需查看受支持的健康检查协议的列表,请参阅负载均衡功能

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

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

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

防火墙规则

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

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

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

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

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

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

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

GKE 支持

GKE 会通过以下方式使用外部应用负载均衡器:

  • 使用 GKE Gateway Controller 创建的外部网关可以使用外部应用负载均衡器的任何模式。您可以通过选择 GatewayClass 来控制负载均衡器的模式。GKE Gateway Controller 始终使用 GCE_VM_IP_PORT 可用区级 NEG 后端。

共享 VPC 架构

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

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

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

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

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

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

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

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

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

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

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

共享 VPC 网络上的区域级外部应用负载均衡器。
共享 VPC 网络上的区域级外部应用负载均衡器(点击可放大)。

跨项目服务引用

跨项目服务引用是一种部署模型,其中负载均衡器的前端和网址映射位于一个项目中,而负载均衡器的后端服务和后端位于其他项目中

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

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

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

跨项目服务引用支持因负载均衡器的类型而异:

  • 对于全球外部应用负载均衡器:负载均衡器的前端和网址映射可以引用同一组织的任何项目中的后端服务或后端存储桶。不受 VPC 网络限制。虽然您可以使用共享 VPC 环境来配置跨项目部署(如此示例所示),但这并不是必要条件。

  • 对于区域级外部应用负载均衡器:您必须在共享 VPC 环境中创建负载均衡器。负载均衡器的前端和网址映射必须位于宿主项目或服务项目中,而负载均衡器的后端服务和后端可以分布在同一共享 VPC 环境的宿主项目或服务项目中。

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

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

跨项目服务引用的使用说明

  • Trusted 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 故障切换路由政策来路由流量。如需了解详情,请参阅外部应用负载均衡器的故障切换
  • 您可以配置主动-主动故障切换配置,即在您确定最支持应用流量的区域中部署多个单独的区域级外部应用负载均衡器。您可以使用 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 客户端向Trusted Cloud 负载均衡器通告的值实际上毫无意义,因为负载均衡器不会向客户端发起流。

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

HTTP/2 限制

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

基于 TCP 的明文 HTTP/2 (H2C)

基于 TCP 的明文 HTTP/2(也称为 H2C)可让您在不使用 TLS 的情况下使用 HTTP/2。以下两种连接都支持 H2C:

  • 客户端与负载均衡器之间的连接。无需特殊配置。
  • 负载均衡器与其后端之间的连接。

    如需为负载均衡器及其后端之间的连接配置 H2C,请将后端服务协议设置为 H2C

使用 GKE Gateway Controller 和 Cloud Service Mesh 创建的负载均衡器也支持 H2C。

传统应用负载均衡器不支持 H2C。

WebSocket 支持

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

WebSocket 协议提供客户端和负载均衡器之间的全双工通信通道。如需了解详情,请参阅 RFC 6455

WebSocket 协议的运作方式如下:

  1. 负载均衡器识别到来自 HTTP 或 HTTPS 客户端的 WebSocket Upgrade 请求。该请求包含 Connection: UpgradeUpgrade: websocket 标头,后跟其他有关的 WebSocket 相关请求标头。
  2. 后端发送 WebSocket Upgrade 响应。后端实例发送包含 Connection: UpgradeUpgrade: websocket 标头及其他 WebSocket 相关响应标头的 101 switching protocol 响应。
  3. 负载均衡器会在当前连接期间代理双向流量。

如果后端实例返回状态代码 426502,则负载均衡器会关闭连接。

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

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

gRPC 支持

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

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

如需将 gRPC 与您的 Trusted 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 早期数据,请执行以下操作:

控制台

  1. 在 Trusted Cloud 控制台中,前往负载均衡页面。

    转到“负载均衡”

  2. 选择您需要为其启用早期数据的负载均衡器。

  3. 点击修改

  4. 点击前端配置

  5. 选择要修改的前端 IP 地址和端口。如需启用 TLS 早期数据,协议必须为 HTTPS。

  6. 早期数据 (0-RTT) 列表中,选择 TLS 早期数据模式。

  7. 点击完成

  8. 如需更新负载均衡器,请点击更新

gcloud

  1. 在应用负载均衡器的目标 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_MODESTRICTPERMISSIVEDISABLEDUNRESTRICTED

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_MODESTRICTPERMISSIVEDISABLEDUNRESTRICTED
  • 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) 扩展程序。如需了解详情,请参阅从负载均衡器到后端的加密

  • Trusted Cloud 不保证底层 TCP 连接在后端服务超时的整个期间保持打开状态。客户端系统必须实现重试逻辑,而不是依赖 TCP 连接长时间保持打开状态。

  • 使用Trusted Cloud 控制台在高级层级中创建区域级外部应用负载均衡器时, Trusted Cloud 控制台仅提供支持标准层级的区域。如需访问其他区域,请使用 gcloud CLI 或 API。

后续步骤