后端服务概览

后端服务定义了 Cloud Load Balancing 如何分配流量。后端服务配置包含一组值,例如用于连接到后端的协议、各种分发和会话设置、运行状况检查和超时。这些设置可对负载平衡器的行为进行精细控制。如果需要快速开始,大多数设置都具有允许轻松配置的默认值。

您可以为以下 Google Cloud 负载平衡服务配置后端服务:

  • 外部 HTTP(S) 负载平衡
  • 内部 HTTP(S) 负载平衡
  • SSL 代理负载平衡
  • TCP 代理负载平衡
  • 内部 TCP/UDP 负载平衡

Traffic Director 也会使用后端服务。网络负载平衡不使用后端服务。

负载平衡器、Envoy 代理和无代理 gRPC 客户端使用后端服务资源中的配置信息执行以下操作:

  • 将流量定向到正确的后端(实例组或网络端点组 (NEG))。您可以将外部 HTTP(S) 负载平衡器配置为使用后端存储分区(而非后端服务)。如需了解如何将后端存储分区与外部 HTTP(S) 负载平衡器配合使用,请参阅设置使用后端存储分区的负载平衡器
  • 根据平衡模式(这是每个后端的设置)分配流量。
  • 确定哪个运行状况检查正在监控后端的运行状况。
  • 指定“会话亲和性”
  • 确定是否已启用其他服务,包括下列各项:
    • Cloud CDN(仅限外部 HTTP(S) 负载平衡器)
    • Google Cloud Armor 安全政策(仅限外部 HTTP(S) 负载平衡器)
    • Identity-Aware Proxy(仅限外部 HTTP(S) 负载平衡器)

您可以在创建后端服务或将后端服务添加到后端服务时设置这些值。

后端服务的范围为全球或地区

如需详细了解后端服务资源的属性 (Property),请参阅以下参考文档:

您使用的产品(即负载平衡器或 Traffic Director)决定了以下各项:

  • 最大后端服务数量
  • 后端服务的范围
  • 每个后端服务可以使用的后端类型
  • 后端服务的负载平衡方案
产品 最大后端服务数量 后端服务的范围 受支持的后端类型 负载平衡方案
外部 HTTP(S) 负载平衡 多个 全球1 每个后端服务都支持以下后端组合:
  • 所有实例组后端:一个或多个代管实例组后端、非代管实例组后端或代管实例组后端与非代管实例组后端的组合
  • 所有区域 NEG:一个或多个区域 NEG
  • 所有无服务器 NEG:一个或多个 App Engine、Cloud Run 或 Cloud Functions 服务
  • 一个互联网 NEG
EXTERNAL
内部 HTTP(S) 负载平衡 多个 地区 每个后端服务都支持以下后端组合:
  • 所有实例组后端:一个或多个代管实例组后端、非代管实例组后端或代管实例组后端与非代管实例组后端的组合,或者
  • 所有区域 NEG:一个或多个区域 NEG
INTERNAL_MANAGED
SSL 代理负载平衡 1 全球1 后端服务支持以下后端组合:
  • 所有实例组后端:一个或多个代管实例组后端、非代管实例组后端或代管实例组后端与非代管实例组后端的组合,或者
  • 所有区域 NEG:一个或多个区域 NEG,或者
  • 一个互联网 NEG
EXTERNAL
TCP 代理负载平衡 1 全球1 后端服务支持以下后端组合:
  • 所有实例组后端:一个或多个代管实例组后端、非代管实例组后端或代管实例组后端与非代管实例组后端的组合,或者
  • 所有区域 NEG:一个或多个区域 NEG,或者
  • 一个互联网 NEG
EXTERNAL
内部 TCP/UDP 负载平衡 1 范围为地区,但可以配置为可在全球访问 后端服务支持以下后端组合:
  • 所有实例组后端:一个或多个代管实例组后端、非代管实例组后端或代管实例组后端与非代管实例组后端的组合
INTERNAL
Traffic Director 多个 全球 每个后端服务都支持以下后端组合:
  • 所有实例组后端:一个或多个代管实例组后端、非代管实例组后端或代管实例组后端与非代管实例组后端的组合,或者
  • 所有区域 NEG:一个或多个区域 NEG
INTERNAL_SELF_MANAGED

1 在标准或优质网络层级中,HTTP(S) 负载平衡、SSL 代理负载平衡和 TCP 代理负载平衡使用的后端服务始终覆盖全球范围。但是,在标准层级中,存在以下限制:

后端

后端是指从 Google Cloud 负载平衡器、Traffic Director 配置的 Envoy 代理或无代理 gRPC 客户端接收流量的端点。后端有多种类型:

此外,您还可以使用后端存储分区代替后端服务,还可以创建 Cloud Storage 存储分区后端。

您不能将不同类型的后端与同一后端服务搭配使用。例如,单个后端服务不能引用实例组和区域 NEG 的组合。但是,您可以在同一后端服务中使用不同类型的实例组的组合。例如,单个后端服务可以引用代管实例组和非代管实例组的组合。如需详细了解哪些后端与哪些后端服务兼容,请参阅上一部分中的表格。

您无法删除与后端服务关联的后端实例组或 NEG。在删除实例组或 NEG 之前,必须先从引用它的所有后端服务中将其作为后端移除。

后端协议

创建后端服务时,您必须指定用于与后端通信的协议。每个后端服务只能指定一个协议,您不能指定次要协议来作为后备。

可用协议包括:

  • HTTP
  • HTTPS
  • HTTP/2
  • SSL
  • TCP
  • UDP
  • gRPC(仅限 Traffic Director)

哪种协议有效取决于负载平衡器的类型,或者您是否使用 Traffic Director。如需了解详情,请参阅负载平衡器功能Traffic Director 功能

更改后端服务的协议,会使后端在几分钟的时间里无法通过负载平衡器访问。

在负载平衡器和后端之间进行的加密

对于 HTTP(S) 负载平衡、TCP 代理负载平衡和 SSL 代理负载平衡,Google 会自动对 Google Front End (GFE) 前端与 Google Cloud 中的后端之间的流量进行加密。

除了此网络级加密之外,您还可以使用安全协议作为后端服务协议。安全协议包括 SSL、HTTPS 或 HTTP/2(使用 TLS)。您可以将它们用于基于 GFE 的负载平衡器以及内部 HTTP(S) 负载平衡和 Traffic Director。

当负载平衡器使用安全的后端服务协议连接到后端时,GFE 即为 SSL 或 HTTPS 客户端。同样,当使用 Traffic Director 配置的客户端代理使用安全后端服务协议连接到您的后端时,该代理即为 SSL 或 HTTPS 客户端。

在以下情况下,建议使用安全协议连接到后端实例:

  • 如果您需要建立从负载平衡器(或 Traffic Director)到后端实例的可审核加密连接。

  • 如果负载平衡器(通过互联网 NEG)连接到 Google Cloud 外部的后端实例。与互联网 NEG 后端的通信可能会传输到公共互联网。当负载平衡器连接到互联网 NEG 时,公共证书授权机构签名的证书必须满足验证要求

如需在负载平衡器和后端之间使用安全协议,请注意以下要求:

  • 负载平衡器的后端服务必须使用 SSL (TLS)、HTTPS 或 HTTP/2 协议。

  • 后端实例软件必须使用后端服务所用的协议来处理流量。例如,如果后端服务使用 HTTPS,请务必将后端实例配置为使用 HTTPS。如果您使用 HTTP/2 协议,则后端必须使用 TLS。如需了解配置说明,请参阅后端实例的软件文档。

  • 您必须在后端实例上安装私钥和证书。这些证书不需要与负载平衡器的 SSL 证书匹配。如需了解安装说明,请参阅后端实例的软件文档。

  • 在后端实例上运行的软件必须以 SSL 或 HTTPS 服务器的形式运行。如需了解配置说明,请参阅后端实例的软件文档。

使用实例组或区域 NEG 后端时,请谨记以下事项:

  • 当 GFE 启动与后端的 TLS 会话时,GFE 不会使用服务器名称指示 (SNI) 扩展程序。

  • 当 GFE 连接到 Google Cloud 内的后端时,GFE 会接受您的后端提供的任何证书。GFE 不执行证书验证。例如,即使在下列情况下,证书也被视为有效:

    • 该证书是自签名证书。
    • 该证书由未知证书授权机构 (CA) 签名。
    • 该证书已过期或尚未生效。
    • CNsubjectAlternativeName 特性与 Host 标头或 DNS PTR 记录不匹配。
如需详细了解 Google 的加密,请参阅 Google Cloud 中的传输加密

实例组

本部分介绍实例组如何使用后端服务。

后端虚拟机和外部 IP 地址

后端服务中的后端虚拟机不需要外部 IP 地址:

  • 对于外部 HTTP(S) 负载平衡器、SSL 代理负载平衡器和 TCP 代理负载平衡器:客户端使用负载平衡器的外部 IP 地址与 Google Front End (GFE) 前端进行通信。GFE 前端使用主要网络接口的内部 IP 地址与后端虚拟机或端点进行通信。由于 GFE 前端是代理,因此后端虚拟机本身不需要外部 IP 地址。

  • 对于内部 HTTP(S) 负载平衡器、内部 TCP/UDP 负载平衡器和 Traffic Director:内部负载平衡器和 Traffic Director 的后端虚拟机不需要外部 IP 地址。

已命名端口

负载平衡器可以在负载平衡器的转发规则中指定的一个或多个端口号处侦听前端。在后端,负载平衡器可以将流量转发到同一端口号,或转发到其他端口号。您的后端实例(Compute Engine 实例)正在侦听此端口号。您可以在实例组中配置此端口号,并在后端服务配置中引用它。

后端端口号称为“已命名端口”,因为它是名称/值对。在实例组中,您可以定义端口的键名称和值。然后,您可以在后端服务配置中引用已命名端口。

如果实例组的已命名端口与后端服务配置中的 --port-name 匹配,则后端服务使用此端口号与实例组的虚拟机进行通信。

以下负载平衡器类型要求每个后端 Compute Engine 实例组具有一个已命名端口:

  • 内部 HTTP(S) 负载平衡
  • HTTP(S) 负载平衡
  • SSL 代理负载平衡
  • TCP 代理负载平衡

如需了解如何创建已命名端口,请参阅以下说明:

例如,您可以在实例组上按如下方式设置已命名端口,其中服务名称为 my-service-name,端口为 8888

gcloud compute instance-groups unmanaged set-named-ports my-unmanaged-ig \
    --named-ports=my-service-name:8888

然后,您可以将后端服务上的 --port-name 设置为 my-service-name

gcloud compute backend-services update my-backend-service \
    --port-name=my-service-name

注意事项:

  • 每个后端服务订阅一个端口名称。每个后端服务的每个后端实例组都必须至少有一个使用该名称的已命名端口。

  • 如果每个实例组为同一端口名称指定了不同的端口号,则后端服务在与不同实例组中的虚拟机通信时可以使用不同的端口号。

  • 后端服务使用的已解析端口号不必与负载平衡器的转发规则使用的端口号相匹配。

已命名端口不用于以下情况:

  • 不用于区域 NEG 或互联网 NEG 后端,因为这些 NEG 使用不同机制(即,在端点本身上)定义端口。
  • 不用于无服务器 NEG 后端,因为这些 NEG 没有端点。
  • 不用于内部 TCP/UDP 负载平衡器,因为内部 TCP/UDP 负载平衡器是直通式负载平衡器(而非代理),并且其后端服务不会订阅已命名端口。

如需详细了解已命名端口,请参阅 SDK 文档中的 gcloud compute instance-groups managed set-named-portsgcloud compute instance-groups unmanaged set-named-ports

有关实例组的限制和指南

在为负载平衡器创建实例组时,请记住以下限制和指南:

  • 不要将一个虚拟机放在多个负载平衡实例组中。如果虚拟机是两个或更多非代管实例组的成员,或者是一个代管实例组和一个或多个非代管实例组的成员,则 Google Cloud 限制您一次只能将其中一个实例组用作特定后端服务的后端。

    如果您需要一个虚拟机参与多个负载平衡器,则必须将同一实例组用作每个后端服务上的后端。如需对不同端口的流量进行平衡,请在一个实例组上创建必需的已命名端口,并让每个后端服务订阅一个唯一的已命名端口。

  • 您可以将同一实例组用作多个后端服务的后端。在这种情况下,后端必须使用兼容的平衡模式。兼容表示平衡模式必须相同,或者它们必须是 CONNECTIONRATE 的组合。不兼容的组合如下:

    • CONNECTION - UTILIZATION
    • RATE - UTILIZATION

    请思考以下示例:

    • 您有两个后端服务:external-https-backend-service 用于外部 HTTP(S) 负载平衡器,internal-tcp-backend-service 用于内部 TCP/UDP 负载平衡器。
    • 您在 internal-tcp-backend-service 中使用名为 instance-group-a 的实例组。
    • internal-tcp-backend-service 中,您必须应用 CONNECTION 平衡模式,因为内部 TCP/UDP 负载平衡器仅支持 CONNECTION 平衡模式。
    • 如果在 external-https-backend-service 中应用 RATE 平衡模式,那么您也可以在 external-https-backend-service 中使用 instance-group-a
    • 如果使用 UTILIZATION 平衡模式,您也无法在 external-https-backend-service 中使用 instance-group-a
  • 若要更改用作多个后端服务的后端的实例组的平衡模式,请执行以下操作:

    • 从一个后端服务以外的其他所有后端服务中移除实例组。
    • 更改一个剩余后端服务上的后端的平衡模式。
    • 将实例组作为后端重新添加到剩余的后端服务(如果这些服务支持新平衡模式)。
  • 如果您的实例组与多个后端服务相关联,则每个后端服务都可以引用实例组上相同或不同的已命名端口。

  • 我们不建议在多个后端服务中添加自动扩缩式代管实例组,这可能导致实例组中的实例进行不可预测和不必要的扩缩,尤其是在您使用 HTTP 负载平衡利用率自动扩缩指标时。

    • 建议不要这样做,但如果自动扩缩指标是 CPU 利用率或者与负载平衡器的服务容量无关的 Cloud Monitoring 指标,则此方案可能适用。使用其中一个自动扩缩指标可防止不稳定的扩缩。

区域网络端点组

使用区域网络端点组 (NEG) 作为其后端的后端服务在虚拟机内运行的应用或容器之间分配流量。

区域网络端点是 IP 地址和端口的组合,可通过以下两种方式之一指定:

  • 通过指定 IP address:port 对,例如 10.0.1.1:80
  • 通过仅指定网络端点 IP 地址。NEG 的默认端口会自动用作 IP address:port 对的端口。

网络端点通过其 IP 地址和端口来表示服务,而不是引用特定的虚拟机。网络端点组是网络端点的逻辑分组。

如需了解详情,请参阅负载平衡中的网络端点组概览

互联网网络端点组

互联网 NEG 是在本地基础架构中或由第三方提供的基础架构上托管的全球资源。

互联网 NEG 是 IP 地址或主机名以及可选端口的组合:

  • 可公开解析的完全限定域名和可选端口,例如 backend.example.com:443(默认端口:对于 HTTP 为 80,对于 HTTPS 为 443)。
  • 可公开访问的 IP 地址和可选端口,例如 203.0.113.8:80203.0.113.8:443(默认端口:对于 HTTP 为 80,对于 HTTPS 为 443

使用互联网网络端点组作为后端的外部 HTTP(S) 负载平衡器的后端服务向 Google Cloud 外部的目标分配流量。

如需了解详情,请参阅互联网网络端点组概览

无服务器网络端点组

网络端点组 (NEG) 为负载平衡器指定了一组后端端点。无服务器 NEG 是指向 Cloud RunApp EngineCloud Functions 服务的后端。

无服务器 NEG 可以表示以下内容:

  • 一项 Cloud Run 服务或一组共用相同网址格式的服务。
  • 一个 Cloud Functions 函数或一组共用相同网址格式的函数。
  • 一个 App Engine 应用(标准或 Flex 应用)、应用内的一项特定服务,甚至是应用的某一特定版本。

如需了解详情,请参阅无服务器网络端点组概览

流量分配

后端行为的某些方面由后端服务资源中以下字段的值决定:

  • 平衡模式定义了负载平衡器如何为新请求或连接衡量后端就绪情况。
  • 目标容量,用于定义目标最大连接数、目标最大速率或目标最大 CPU 利用率。
  • 容量扩缩器,可调整总体可用容量,而无需修改目标容量。

平衡模式

平衡模式确定负载平衡器的后端是可以处理额外的流量还是已完全加载。Google Cloud 有三种平衡模式:

  • CONNECTION
  • RATE
  • UTILIZATION

平衡模式选项取决于后端服务的负载平衡方案、后端服务的协议以及连接到后端服务的后端类型。

在后端服务中添加后端时可设置平衡模式。请注意,您无法为无服务器 NEG 设置平衡模式。

平衡模式 受支持的负载平衡方案 受支持的后端服务协议 受支持的后端类型 适用的产品
CONNECTION EXTERNAL
INTERNAL
SSL、TCP、UDP
协议选项受负载平衡器类型的限制。例如,内部 TCP/UDP 负载平衡仅使用 TCP 或 UDP 协议。
实例组或区域 NEG(如果受支持)。
例如,内部 TCP/UDP 负载平衡不支持区域 NEG。
  • SSL 代理负载平衡
  • TCP 代理负载平衡
  • 内部 TCP/UDP 负载平衡
RATE EXTERNAL
INTERNAL_MANAGED
INTERNAL_SELF_MANAGED
HTTP、HTTPS、HTTP2、gRPC 实例组或区域 NEG
  • 外部 HTTP(S) 负载平衡
  • 内部 HTTP(S) 负载平衡
  • Traffic Director(INTERNAL_SELF_MANAGED;仅限 HTTP 和 gRPC 协议)
UTILIZATION EXTERNAL
INTERNAL_MANAGED
INTERNAL_SELF_MANAGED
任何协议 仅限实例组。区域 NEG 不支持利用率模式。
  • 外部 HTTP(S) 负载平衡
  • 内部 HTTP(S) 负载平衡
  • SSL 代理负载平衡
  • TCP 代理负载平衡
  • Traffic Director(INTERNAL_SELF_MANAGED;仅限 HTTP 和 gRPC 协议)

如果与后端服务相关联的所有虚拟机的平均利用率低于 10%,则 Google Cloud 可能会首选特定区域。当您使用代管地区实例组、不同区域中的代管区域实例组以及非代管区域实例组时,可能会发生这种情况。随着发送到负载平衡器的流量越来越多,这种区域不平衡问题会自动得以解决。

如需了解详情,请参阅 gcloud beta compute backend-services add-backend

更改负载平衡器的平衡模式

对于某些负载平衡器,您无法更改平衡模式,因为后端服务可能只有一种平衡模式:

  • 内部 TCP/UDP 负载平衡器的后端服务只能使用 CONNECTION 平衡模式。
  • 外部 HTTP(S) 负载平衡器的后端服务(其中所有后端都是 NEG)只能使用 RATE 平衡模式。
  • 内部 HTTP(S) 负载平衡器的后端服务(其中所有后端都是 NEG)只能使用 RATE 平衡模式。
  • SSL 代理负载平衡器的后端服务(其中所有后端都是 NEG)只能使用 CONNECTION 平衡模式
  • TCP 代理负载平衡器的后端服务(其中所有后端都是 NEG)只能使用 CONNECTION 平衡模式

对于某些负载平衡器,您可以更改平衡模式,因为其后端服务可以使用多个模式:

  • 外部 HTTP(S) 负载平衡器的后端服务(其中所有后端都是实例组)可以使用 RATEUTILIZATION 平衡模式。
  • 内部 HTTP(S) 负载平衡器的后端服务(其中所有后端都是实例组)可以使用 RATEUTILIZATION 平衡模式。
  • SSL 代理负载平衡器的后端服务(其中所有后端都是实例组)可以使用 CONNECTIONUTILIZATION 平衡模式。
  • TCP 代理负载平衡器的后端服务(其中所有后端都是实例组)可以使用 CONNECTIONUTILIZATION 平衡模式。

目标容量

每种平衡模式都有对应的目标容量,用于定义目标最大连接数、目标最大速率或目标最大 CPU 利用率。对于每种平衡模式,目标容量都不是断路器。在某些情况下,负载平衡器将超过最大值,例如在所有后端虚拟机或端点都已达到最大值的情况下。

  • 对于 CONNECTION 平衡模式,目标容量可定义目标最大并发连接数。您可以使用以下设置之一:

    • max-connections-per-instance(每个虚拟机)
    • max-connections-per-endpoint(每个区域级 NEG 中的端点)
    • max-connections(整个实例组的每个区域级 NEG 和区域级非代管实例组)

    当您指定 max-connections-per-instancemax-connections-per-endpoint 时,Google Cloud 会计算每个虚拟机或每个端点的有效目标,如下所示

    • (每个虚拟机的最大连接数 * 虚拟机总数)/ 运行状况良好的虚拟机数量
    • (每个端点的最大连接数 * 端点总数)/ 运行状况良好的端点数量

    当您指定 max-connections 时,Google Cloud 会采用下列方式计算每个虚拟机或每个端点的有效目标

    • 最大连接数 / 运行状况良好的虚拟机数量
    • 最大连接数 / 运行状况良好的端点数量
  • 对于 RATE 平衡模式,目标容量可定义 HTTP 请求的目标最大速率。您可以使用以下设置之一:

    • max-rate-per-instance(每个虚拟机)
    • max-rate-per-endpoint(区域级 NEG 中的每个端点)
    • max-rate(整个实例组的区域级 NEG 和区域级非代管实例组)

    当您指定 max-rate-per-instancemax-rate-per-endpoint 时,Google Cloud 会计算每个虚拟机或每个端点的有效目标,如下所示

    • 每个虚拟机的最大速率 * 虚拟机总数 / 运行状况良好的虚拟机数量
    • 每个端点的最大速率 * 端点总数 / 运行状况良好的端点数量

    当您指定 max-rate 时,Google Cloud 会采用下列方式计算每个虚拟机或每个端点的有效目标速率

    • 最大速率 / 运行状况良好的虚拟机数量
    • 最大速率 / 运行状况良好的端点数量
  • 对于 UTILIZATION 平衡模式,没有强制性目标容量。下表汇总了多种选项,具体取决于后端类型。

此表说明了针对给定负载平衡器和后端类型的所有可能的平衡模式。它还显示了在与平衡模式结合使用时,您必须指定的可用或必需的容量设置。

负载平衡器 后端类型 平衡模式 目标容量
内部 TCP/UDP 负载平衡 实例组 CONNECTION 您不能指定最大连接数。
SSL 代理负载平衡、TCP 代理负载平衡 实例组 CONNECTION 必须指定以下选项之一:
1. 每个区域实例组的最大连接数
2. 每个实例的最大连接数
 (区域或地区实例组)
UTILIZATION 选择性地指定以下选项之一:
1. 最大利用率
2. 每个区域实例组的最大连接数
3. 每个实例的最大连接数
 (区域或地区实例组)
4. 1 和 2 组合在一起
5. 1 和 3 组合在一起
区域 NEG CONNECTION 必须指定以下选项之一:
1. 每个区域 NEG 的最大连接数
2. 每个端点的最大连接数
HTTP(S) 负载平衡、内部 HTTP(S) 负载平衡、Traffic Director 实例组 RATE 必须指定以下选项之一:
1. 每个区域实例组的最大速率
2. 每个实例的最大速率
 (区域或地区实例组)
UTILIZATION 选择性地指定以下选项之一:
1. 最大利用率
2. 每个区域实例组的最大速率
3. 每个实例的最大速率
 (区域或地区实例组)
4. 1 和 2 组合在一起
5. 1 和 3 组合在一起
区域 NEG RATE 必须指定以下选项之一:
1. 每个区域 NEG 的最大速率
2. 每个端点的最大速率

容量扩缩器

您可以选择性地调整容量扩缩器以缩减目标容量(最大利用率、最大速率或最大连接数),而无需更改目标容量。支持目标容量的所有负载平衡器都支持容量扩缩器。唯一的例外是内部 TCP/UDP 负载平衡器。

默认情况下,容量扩缩器为 1.0 (100%)。这意味着,如果后端实例目前的使用率百分比为 80% 且最大利用率设置为 80%,则后端服务将停止向此实例发送请求:

capacity-scaler: 1 * 0.8

您可以将容量扩缩器设置为 0.0 或从 0.1 (10%) 设置为 1.0 (100%)。缩放比例为零 (0.0) 将阻止所有新连接。如果只有一个后端挂接到后端服务,则无法配置 0.0 设置。

当两个后端服务共享实例组后端时使用容量扩缩器

在您有两个后端服务使用同一实例组后端的情况下,您需要在这两个后端服务之间分配实例组的容量。

例如,您可以将这两个后端服务上的容量扩缩器设置为 0.5,每个后端服务将获得 40% 的实例组容量:

capacity-scaler: 0.5 * 0.8

当每个后端服务已使用 40% 的实例组容量时,请求便不会再发送到此实例组。

Traffic Director 和流量分配

Traffic Director 也会使用后端服务资源。具体来说,Traffic Director 使用负载平衡方案为 INTERNAL_SELF_MANAGED 的后端服务。对于内部自行管理的后端服务,流量分配依据负载平衡模式和负载平衡政策的组合。后端服务根据后端的平衡模式将流量定向到后端。然后,Traffic Director 根据负载平衡政策分配流量。

内部自行管理的后端服务支持以下平衡模式:

  • UTILIZATION(如果所有后端都是实例组)
  • RATE(如果所有后端都是实例组或区域 NEG)

如果您选择 RATE 平衡模式,则必须指定最大速率、每个实例的最大速率或每个端点的最大速率。

如需详细了解 Traffic Director,请参阅 Traffic Director 概念

会话亲和性

如果没有会话亲和性,则负载平衡器会根据 5 元组哈希分配新请求,如下所示:

  • 客户端 IP 地址
  • 客户端来源端口
  • 负载平衡器的转发规则 IP 地址
  • 负载平衡器的目标端口
  • 第 3 层协议(所有使用后端服务的负载平衡器的 TCP 协议)。

后端实例组或区域 NEG 的平衡模式确定后端达到容量上限的条件。某些应用需要将给定用户发出的多个请求定向到同一后端或端点。此类应用包括广告投放、游戏或具有大量内部缓存的服务所使用的有状态服务器。

会话亲和性适用于 TCP 流量,包括 SSL、HTTP(S) 和 HTTP/2 协议。如果后端实例或端点运行状况良好且不在容量范围内(根据平衡模式),则后续请求会转到同一个后端虚拟机或端点。配置会话亲和性时请注意以下几点:

  • 由于 UDP 流量没有“会话”的概念,因此会话亲和性不适用于此类流量。

  • 如果配置了无代理 gRPC 服务,Traffic Director 不支持会话亲和性。

  • 为进行身份验证或为了安全起见,请勿依赖会话亲和性。会话亲和性设计为在后端达到或超过容量上限或运行状况不佳时被破坏。

  • Google Cloud 负载平衡器会尽最大努力提供会话亲和性。更改后端运行状况检查状态或更改后端完整度的因素(以平衡模式衡量)可能会破坏会话亲和性。不建议将 None 以外的会话亲和性与 UTILIZATION 平衡模式一起使用。这是因为实例利用率的更改可能会导致负载平衡服务将新请求或连接定向到不太完整的后端虚拟机,破坏会话亲和性。请改用 RATECONNECTION 平衡模式,以降低破坏会话亲和性的可能性。

下表显示了会话亲和性选项:

产品 会话亲和性选项
内部 TCP/UDP • 无
• 客户端 IP 地址
• 客户端 IP 地址和协议
• 客户端 IP 地址、协议和端口
TCP 代理
SSL 代理
• 无
• 客户端 IP 地址
外部 HTTP(S) • 无
• 客户端 IP 地址
• 生成的 Cookie
内部 HTTP(S) • 无
• 客户端 IP 地址
• 生成的 Cookie
• 标头字段
• HTTP Cookie
网络 网络负载平衡不使用后端服务。 请通过目标池为网络负载平衡器设置会话亲和性。请参阅目标池中的 sessionAffinity 参数。
Traffic Director • 无
• 客户端 IP 地址
• 生成的 Cookie
• 标头字段
• HTTP Cookie

以下几个部分介绍了不同类型的会话亲和性。

客户端 IP 地址亲和性

客户端 IP 地址亲和性将来自同一客户端 IP 地址的请求定向到同一个后端实例。客户端 IP 地址亲和性适用于所有使用后端服务的 Google Cloud 负载平衡器。

使用客户端 IP 地址亲和性时,请注意以下几点:

  • 客户端 IP 地址亲和性是一个二元组哈希,由客户端的 IP 地址以及客户端连接的负载平衡器转发规则的 IP 地址组成。

  • 如果原始客户端位于 NAT 后面或通过代理发出请求,则负载平衡器看到的客户端 IP 地址可能不是原始客户端。通过 NAT 或代理发出的请求会将 NAT 路由器或代理的 IP 地址用作客户端 IP 地址。这会导致传入的流量无谓汇集到同一个后端实例上。

  • 如果客户端从一个网络切换到另一个网络,其 IP 地址会发生变化,导致亲和性被破坏。

如果设置了生成的 Cookie 亲和性,则负载平衡器会针对第一个请求发出一个 Cookie。对于具有相同 Cookie 的每个后续请求,负载平衡器会将请求定向到同一个后端虚拟机或端点。

  • 对于外部 HTTP(S) 负载平衡器,Cookie 名为 GCLB
  • 对于内部 HTTP(S) 负载平衡器和 Traffic Director,Cookie 名为 GCILB

与基于客户端 IP 地址的亲和性相比,基于 Cookie 的亲和性可更准确地识别负载平衡器的客户端。例如:

  1. 使用基于 Cookie 的亲和性时,负载平衡器可以唯一标识共享同一来源 IP 地址的两个或更多客户端系统。使用基于客户端 IP 地址的亲和性,负载平衡器会处理来自同一来源 IP 地址的所有连接,就像它们来自同一客户端系统一样。

  2. 如果客户端更改其 IP 地址,则基于 Cookie 的亲和性可让负载平衡器识别来自该客户端的后续连接,而不是将此连接视为新连接。例如,当移动设备从一个网络切换到另一个网络时,客户端会更改其 IP 地址。

在负载平衡器为基于生成的 Cookie 亲和性创建一个 Cookie 时,它会将该 Cookie 的 path 特性设置为 /。如果网址映射的路径匹配器拥有一个主机名的多个后端服务,则所有后端服务会共用同一个会话 Cookie。

负载平衡器生成的 HTTP Cookie 的生命周期是可配置的。您可以将该生命周期设置为 0(默认值,这意味着 Cookie 只是会话 Cookie),也可以将 Cookie 的生命周期设置为一个介于 1 秒到 86400 秒(24 小时)之间的值(含边界值)。

标头字段亲和性

如果同时满足以下两个条件,则内部 HTTP(S) 负载平衡器可以使用标头字段亲和性:

  • 负载平衡位置政策是 RING_HASH 或 MAGLEV。
  • 后端服务的一致性哈希指定 HTTP 标头的名称。

标头字段亲和性根据 --custom-request-header 标志中指定的 HTTP 标头的值,将请求路由到区域 NEG 中的后端虚拟机或端点。

如需详细了解使用标头字段亲和性的内部 HTTP(S) 负载平衡,请参阅内部 HTTP(S) 负载平衡概览

如果同时满足以下两个条件,则内部 HTTP(S) 负载平衡器可以使用 HTTP Cookie 亲和性:

  • 负载平衡位置政策是 RING_HASH 或 MAGLEV。
  • 后端服务的一致性哈希指定 HTTP Cookie 的名称。

HTTP Cookie 亲和性根据 HTTP_COOKIE 标志中指定的 HTTP Cookie,将请求路由到 NEG 中的后端虚拟机或端点。如果客户端未提供 Cookie,则代理会生成 Cookie 并通过 Set-Cookie 标头将其返回给客户端。

如需详细了解使用 HTTP Cookie 亲和性的内部 HTTP(S) 负载平衡,请参阅内部 HTTP(S) 负载平衡概览

失去会话亲和性

无论选择哪种类型的亲和性,在以下情况下,客户端都可能会失去与后端的亲和性:

  • 如果后端实例组或区域 NEG 的容量不足(根据平衡模式的目标容量定义)。在这种情况下,Google Cloud 会将流量定向到可能位于不同区域的其他后端实例组或区域 NEG。为解决此问题,请务必根据自己的测试为每个后端指定正确的目标容量。
  • 自动扩缩功能会向代管实例组添加实例或从中移除实例。发生这种情况时,实例组中的实例数量会发生变化,因此后端服务会为会话亲和性重新计算哈希值。为解决此问题,请确保代管实例组的最小大小可以应对典型负载。仅当负载意外增加时,系统才会执行自动扩缩功能。
  • 如果 NEG 中的后端虚拟机或端点未通过运行状况检查,则负载平衡器会将流量定向到其他运行状况良好的后端。如需详细了解当所有后端都未通过运行状况检查时负载平衡器如何应对,请参阅每个 Google Cloud 负载平衡器对应的文档。
  • UTILIZATION 平衡模式适用于后端实例组时,会话亲和性会因后端利用率的变化而被破坏。您可以使用 RATECONNECTION 平衡模式(具体取决于负载平衡器类型支持哪种模式)来解决此问题。

使用 HTTP(S) 负载平衡、SSL 代理负载平衡或 TCP 代理负载平衡时,请额外注意以下几点:

  • 如果从互联网上的客户端到 Google 的路由路径在请求或连接之间发生变化,则系统可能会选择其他 Google Front End (GFE) 前端作为代理。这可能会破坏会话亲和性。
  • 当您使用 UTILIZATION 平衡模式时(尤其是未定义目标最大容量时),如果负载平衡器的流量较低,会话亲和性可能会被破坏。请改用 RATECONNECTION 平衡模式。

后端服务超时

大多数 Google Cloud 负载平衡器都具有后端服务超时。默认值是 30 秒。

  • 对于使用 HTTP、HTTPS 或 HTTP/2 协议的外部 HTTP(S) 负载平衡器和内部 HTTP(S) 负载平衡器,后端服务超时为 HTTP(S) 流量的请求/响应超时。这是负载平衡器等待后端返回请求的完整响应的时间量。例如,如果后端服务超时值是默认值 30 秒,则后端有 30 秒的时间来传送请求的完整响应。如果后端在将响应标头发送到负载平衡器之前关闭了连接或超时,则负载平衡器会重试一次 HTTP GET 请求。如果后端发送响应标头(即使响应正文不完整),或者发送到后端的请求不是 HTTP GET 请求,则负载平衡器不会重试。如果后端根本没有响应,则负载平衡器会向客户端返回 HTTP 5xx 响应。要更改后端对请求作出响应的分配时间,请更改超时值。

  • 对于 HTTP 流量,客户端完成其请求发送的最长时间等于后端服务超时值。如果看到带有 jsonPayload.statusDetail client_timed_out 的 HTTP 408 响应,则表示客户端的请求被代理或者后端的响应被代理时跟不上进度。如果问题是由于客户端遇到性能问题,您可以通过增加后端服务超时值来解决此问题。

  • 对于外部 HTTP(S) 负载平衡器和内部 HTTP(S) 负载平衡器,如果 HTTP 连接升级到 WebSocket,则后端服务超时将定义 WebSocket 可以保持打开状态(无论是否空闲)的最长时间。

  • 对于 SSL 代理负载平衡器和 TCP 代理负载平衡器,超时为空闲超时。如需在删除连接之前允许更多或更少时间,请更改超时值。此空闲超时也用于 WebSocket 连接。

  • 对于内部 TCP/UDP 负载平衡器,后端服务超时无效。

  • 如果配置了无代理 gRPC 服务,Traffic Director 不支持后端服务超时。

运行状况检查

后端为实例组或区域 NEG 的每个后端服务都必须进行相关的运行状况检查。使用互联网 NEG 作为后端的后端服务不得引用运行状况检查。

如果使用 Google Cloud Console 创建负载平衡器,您可以在创建负载平衡器时创建运行状况检查(如果需要),也可以引用现有运行状况检查。

当您通过 gcloud 命令行工具或 API 创建使用实例组或区域 NEG 后端的后端服务时,必须引用现有运行状况检查。如需详细了解所需运行状况检查的类型和范围,请参阅“运行状况检查概览”中的负载平衡器指南

如需了解详情,请参阅以下文档:

在后端服务资源上启用的额外功能

以下可选 Google Cloud 功能适用于 HTTP(S) 负载平衡使用的后端服务。本文档不讨论这些功能,但以下页面会对这些功能进行讨论:

  • Google Cloud Armor 通过安全政策防御 DDoS 攻击和其他攻击。
  • Cloud CDN 是一种低延迟内容分发系统。
  • 创建自定义标头是负载平衡器添加到请求的额外标头。
  • IAP 可让您执行以下操作:
    • 使用 Google 帐号进行 OAuth 2.0 登录时需要进行身份验证
    • 使用 Identity and Access Management 权限控制访问权限

其他说明

只有内部 HTTP(S) 负载平衡器和 Traffic Director 支持以下功能;但是,当您将无代理 gRPC 服务与 Traffic Director 配合使用时,它们不受支持。

  • 熔断
  • 离群值检测
  • 负载平衡政策
  • 基于 HTTP Cookie 的会话亲和性
  • 基于 HTTP 标头的会话亲和性

后续步骤

如需获得说明如何在负载平衡中使用后端服务的相关文档和信息,请查看以下内容: