使用 Cloud Run、App Engine 或 Cloud Functions 设置全球外部应用负载均衡器

本页面介绍如何创建外部应用负载均衡器,以将请求路由到无服务器后端。在此处,“无服务器”这一术语指的是以下无服务器计算产品:

  • App Engine
  • Cloud Functions
  • Cloud Run

外部应用负载均衡器与 API Gateway 的集成使无服务器后端能够利用 Cloud Load Balancing 提供的所有功能。如需配置外部应用负载均衡器以将流量路由到 API Gateway,请参阅适用于 API Gateway 的外部应用负载均衡器使用入门。外部应用负载均衡器对 API Gateway 的支持目前处于预览版阶段。

借助无服务器 NEG,您可以将 Google Cloud 无服务器应用外部应用负载均衡器搭配使用。使用无服务器 NEG 后端配置负载均衡器后,对负载均衡器发出的请求会被路由到无服务器应用后端。

如需详细了解无服务器 NEG,请参阅无服务器 NEG 概览

如果您是传统版应用负载均衡器的现有用户,在规划使用全球外部应用负载均衡器的新部署时,请确保查看规划向全球外部应用负载均衡器的迁移

准备工作

  1. 部署 App Engine、Cloud Functions 或 Cloud Run 服务
  2. 如果您尚未安装 Google Cloud CLI,请执行此操作
  3. 配置权限
  4. 添加 SSL 证书资源

部署 App Engine、Cloud Functions 或 Cloud Run 服务

本页面中的说明假定您已运行 Cloud Run、Cloud Functions 或 App Engine 服务。

对于本页面中的示例,我们已使用 Cloud Run Python 快速入门us-central1 区域中部署 Cloud Run 服务。本页面的其余部分介绍了如何设置外部应用负载均衡器,以使其使用无服务器 NEG 后端将请求路由到此服务。

如果您尚未部署无服务器应用,或者如果您想试用示例无服务器 NEG 应用,请按照以下快速入门之一进行操作。您可以在任何地区中创建无服务器应用,但稍后必须使用相同地区创建无服务器 NEG 和负载均衡器。

Cloud Run

如需创建简单的 Hello World 应用,将其打包到一个容器映像中,然后将该容器映像部署到 Cloud Run,请参阅快速入门:构建和部署

如果您已将示例容器上传到 Container Registry,请参阅快速入门:部署预建的示例容器

Cloud Functions

请参阅《Cloud Functions:Python 快速入门》

App Engine

请参阅以下 App Engine Python 3 快速入门指南:

安装 Google Cloud CLI

安装 Google Cloud CLI。如需了解该工具的概念信息和安装信息,请参阅 gcloud 概览

如果您之前未运行过 gcloud CLI,请先运行 gcloud init,以初始化您的 gcloud 目录。

配置权限

如需按照本指南中的说明进行操作,您需要创建无服务器 NEG 并在项目中创建外部 HTTP(S) 负载均衡器。您应该是项目的 Owner 或 Editor,或者应具有下列 Compute Engine IAM 角色

任务 所需角色
创建负载均衡器和网络组件 Network Admin
创建和修改 NEG Compute Instance Admin
创建和修改 SSL 证书 Security Admin

保留外部 IP 地址

现在您的服务已启动并正在运行,接下来请设置一个全球静态外部 IP 地址,以供客户用来访问您的负载均衡器。

控制台

  1. 在 Google Cloud 控制台中,转到外部 IP 地址页面。

    转到“外部 IP 地址”

  2. 点击预留外部静态 IP 地址

  3. 对于名称,输入 example-ip

  4. 网络服务层级部分,选择高级

  5. 对于 IP 版本,请选择 IPv4

  6. 对于类型,请选择全球

  7. 点击预留

gcloud

gcloud compute addresses create example-ip \
    --network-tier=PREMIUM \
    --ip-version=IPV4 \
    --global

请记下预留的 IPv4 地址:

gcloud compute addresses describe example-ip \
    --format="get(address)" \
    --global

创建 SSL 证书资源

如需创建 HTTPS 负载均衡器,您必须向该负载均衡器的前端添加 SSL 证书资源。使用 Google 管理的 SSL 证书自行管理的 SSL 证书创建 SSL 证书资源。

  • Google 管理的证书。建议使用 Google 管理的证书,因为 Google Cloud 会自动获取、管理和续订这些证书。如需创建 Google 管理的证书,您必须拥有该网域的网域和 DNS 记录,才能预配证书。如果您还没有域名,则可以从 Google Domains 获取一个。如需了解详情,请参阅 Google Domains 使用入门。此外,您还需要更新网域的 DNS A 记录,以指向上一步 (example-ip) 中创建的负载均衡器的 IP 地址。有关详细说明,请参阅使用 Google 管理的证书

  • 自签发证书。如果您暂时不想设置网域,则可以使用自签名 SSL 证书进行测试。

此示例假定您已创建 SSL 证书资源。

如果您想在不创建 SSL 证书资源(或 Google 管理的证书所需的网域)的情况下测试此过程,则仍然可以改用此页面中的说明来设置 HTTP 负载均衡器。

创建负载均衡器

在下图中,负载均衡器使用无服务器 NEG 后端将请求定向到无服务器 Cloud Run 服务。对于本示例,我们按照 Cloud Run Python 快速入门中的说明来部署 Cloud Run 服务。

Cloud Run 应用的外部应用负载均衡器架构。
Cloud Run 应用的外部应用负载均衡器架构(点击可放大)。

由于使用无服务器 NEG 后端的后端服务不支持健康检查,因此如果负载均衡器只有无服务器 NEG 后端,则您无需创建允许健康检查的防火墙规则。

控制台

开始配置

  1. 在 Google Cloud 控制台中,转到负载均衡页面。

    转到“负载均衡”

  2. 点击创建负载均衡器
  3. 负载均衡器的类型字段中,选择应用负载均衡器 (HTTP/HTTPS),然后点击下一步
  4. 公共或内部字段中,选择公共(外部),然后点击下一步
  5. 全球或单个区域部署字段中,选择最适合全球性工作负载,然后点击下一步
  6. 负载均衡器世代字段中,选择全球外部应用负载均衡器,然后点击下一步
  7. 点击配置

基本配置

  1. 对于负载均衡器的名称,请输入 serverless-lb
  2. 不关闭窗口继续操作。

前端配置

  1. 点击前端配置
  2. 名称部分,输入名称。
  3. 要创建 HTTPS 负载均衡器,您必须有一个 SSL 证书 (gcloud compute ssl-certificates list)。

    我们建议您使用 Google 管理的证书,如先前所述。

  4. 如需配置外部应用负载均衡器,请按如下所示填写各个字段。

    验证以下选项配置了以下值:

    属性 值(按照说明输入值或选择选项)
    协议 HTTPS
    网络服务层级 优质
    IP 版本 IPv4
    IP 地址 example-ip
    端口 443
    可选:HTTP keepalive 超时 输入 5 到 1200 秒的超时值。默认值为 610 秒。
    证书 选择现有的 SSL 证书或创建新证书。

    如需创建 HTTPS 负载均衡器,您必须具有要在 HTTPS 代理中使用的 SSL 证书资源。您可以使用 Google 管理的 SSL 证书或自行管理的 SSL 证书创建 SSL 证书资源。
    如需创建 Google 管理的证书,您必须拥有一个网域。该网域的 A 记录必须解析为负载均衡器的 IP 地址(在此示例中为 example-ip)。建议使用 Google 管理的证书,因为 Google Cloud 会自动获取、管理和续订这些证书。如果您没有网域,则可以使用自签名 SSL 证书进行测试。
    可选:启用从 HTTP 到 HTTPS 的重定向 使用此复选框可启用从 HTTP 到 HTTPS 的重定向。

    启用此复选框会创建一个额外的部分 HTTP 负载均衡器,它使用与 HTTPS 负载均衡器相同的 IP 地址,并将 HTTP 请求重定向到负载均衡器的 HTTPS 前端。

    只有在选择 HTTPS 协议并使用预留 IP 地址时,才能选中此复选框。

    如果您想在不设置 SSL 证书资源(或 Google 管理的证书所需要的网域)的情况下测试此过程,则可以设置 HTTP 负载均衡器。

    如需创建 HTTP 负载均衡器,请验证以下选项已使用这些值进行配置:

    属性 值(按照说明输入值或选择选项)
    协议 HTTP
    网络服务层级 优质
    IP 版本 IPv4
    IP 地址 example-ip
    端口 80
    可选:HTTP keepalive 超时 输入 5 到 1200 秒的超时值。默认值为 610 秒。
  5. 点击完成

后端配置

  1. 点击后端配置
  2. 后端服务和后端存储桶列表中,点击创建后端服务
  3. 名称部分,输入名称。
  4. 后端类型下,选择无服务器网络端点组
  5. 保持协议不变。此参数会被忽略。
  6. 后端部分的新建后端中,选择创建无服务器网络端点组
  7. 名称部分,输入名称。
  8. 区域中,选择 us-central1,然后选择 Cloud Run
  9. 选中选择服务名称
  10. 服务列表中,选择您要为其创建负载均衡器的 Cloud Run 服务。
  11. 点击创建
  12. 新建后端部分中,点击完成
  13. 点击创建

路由规则

路由规则决定了流量的定向方式。如需配置路由,您需要设置主机规则和路径匹配器,它们是外部应用负载均衡器网址映射的配置组件。

  1. 点击路由规则

  2. 保留默认主机和路径。对于本示例,所有请求都会转到上一步中创建的后端服务。

检查配置

  1. 点击检查并最终确定
  2. 检查所有设置。
  3. 可选:点击等效代码以查看将用于创建负载均衡器的 REST API 请求。
  4. 点击创建
  5. 等待负载均衡器创建完毕。
  6. 点击负载均衡器的名称 (serverless-lb)。
  7. 请记下负载均衡器的 IP 地址,以备在下一个任务中使用。它被称为 IP_ADDRESS

gcloud

  1. 为您的无服务器应用创建无服务器 NEG。

    如需使用 Cloud Run 服务创建无服务器 NEG,请运行以下命令:

       gcloud compute network-endpoint-groups create SERVERLESS_NEG_NAME \
           --region=us-central1 \
           --network-endpoint-type=serverless  \
           --cloud-run-service=CLOUD_RUN_SERVICE_NAME
       
    如需了解更多选项,请参阅 gcloud compute network-endpoint-groups creategcloud 参考指南。
  2. 创建后端服务。
       gcloud compute backend-services create BACKEND_SERVICE_NAME \
           --load-balancing-scheme=EXTERNAL_MANAGED \
           --global
       
  3. 将无服务器 NEG 作为后端添加到此后端服务:
       gcloud compute backend-services add-backend BACKEND_SERVICE_NAME \
           --global \
           --network-endpoint-group=SERVERLESS_NEG_NAME \
           --network-endpoint-group-region=us-central1
       
  4. 创建网址映射以将传入请求路由到相应后端服务:
       gcloud compute url-maps create URL_MAP_NAME \
           --default-service BACKEND_SERVICE_NAME
       

    此示例网址映射仅会定位一项代表单个无服务器应用的后端服务,因此我们不需要设置主机规则或路径匹配器。如果您有多项后端服务,则可以使用主机规则根据主机名将请求定向到不同的服务,还可以设置路径匹配器以根据请求路径将请求定向到不同的服务。

  5. 如需创建 HTTPS 负载均衡器,您必须具有要在 HTTPS 目标代理中使用的 SSL 证书资源。您可以使用 Google 管理的 SSL 证书或自行管理的 SSL 证书创建 SSL 证书资源。建议使用 Google 管理的证书,因为 Google Cloud 会自动获取、管理和续订这些证书。

    如需创建 Google 管理的证书,您必须拥有一个网域。如果您没有网域,则可以使用自签名 SSL 证书进行测试。

    如需创建 Google 管理的 SSL 证书资源,请运行以下命令:
       gcloud compute ssl-certificates create SSL_CERTIFICATE_NAME \
           --domains DOMAIN
       
    如需创建自行管理的 SSL 证书资源,请运行以下命令:
       gcloud compute ssl-certificates create SSL_CERTIFICATE_NAME \
           --certificate CRT_FILE_PATH \
           --private-key KEY_FILE_PATH
       
  6. 创建目标 HTTP(S) 代理以将请求路由到您的网址映射:

    对于 HTTP 负载均衡器,请创建 HTTP 目标代理:

       gcloud compute target-http-proxies create TARGET_HTTP_PROXY_NAME \
          --http-keep-alive-timeout-sec=HTTP_KEEP_ALIVE_TIMEOUT_SEC \
          --url-map=URL_MAP_NAME
       

    对于 HTTPS 负载均衡器,请创建 HTTPS 目标代理。该代理属于负载均衡器,保存用于 HTTPS 负载均衡的 SSL 证书,因此您还需要在此步骤中加载证书。

       gcloud compute target-https-proxies create TARGET_HTTPS_PROXY_NAME \
           --http-keep-alive-timeout-sec=HTTP_KEEP_ALIVE_TIMEOUT_SEC \
           --ssl-certificates=SSL_CERTIFICATE_NAME \
           --url-map=URL_MAP_NAME
       

    请替换以下内容:

    • TARGET_HTTP_PROXY_NAME:目标 HTTP 代理的名称。
    • TARGET_HTTPS_PROXY_NAME:目标 HTTPS 代理的名称。
    • HTTP_KEEP_ALIVE_TIMEOUT_SEC:可选字段,用于指定客户端 HTTP keepalive 超时。超时值必须介于 5 到 1200 秒之间。默认值为 610 秒。
    • SSL_CERTIFICATE_NAME:SSL 证书的名称。
    • URL_MAP_NAME:网址映射的名称。
  7. 创建转发规则以将传入请求路由到代理。

    对于 HTTP 负载均衡器:

       gcloud compute forwarding-rules create HTTP_FORWARDING_RULE_NAME \
       --load-balancing-scheme=EXTERNAL_MANAGED \
       --network-tier=PREMIUM \
       --address=example-ip \
       --target-http-proxy=TARGET_HTTP_PROXY_NAME \
       --global \
       --ports=80
       

    对于 HTTPS 负载均衡器:

       gcloud compute forwarding-rules create HTTPS_FORWARDING_RULE_NAME \
           --load-balancing-scheme=EXTERNAL_MANAGED \
           --network-tier=PREMIUM \
           --address=example-ip \
           --target-https-proxy=TARGET_HTTPS_PROXY_NAME \
           --global \
           --ports=443
       

将您的网域连接到负载均衡器

创建负载均衡器后,请记好与负载均衡器关联的 IP 地址,例如 30.90.80.100。如需将您的网域指向负载均衡器,请使用您的网域注册服务创建 A 记录。如果您向 SSL 证书添加了多个网域,则必须为每个网域添加一条 A 记录,所有网域均指向负载均衡器的 IP 地址。例如,如需为 www.example.comexample.com 创建 A 记录,请使用以下命令:

NAME                  TYPE     DATA
www                   A        30.90.80.100
@                     A        30.90.80.100

如果您使用 Cloud DNS 作为 DNS 提供商,请参阅添加、修改和删除记录

测试负载均衡器

现在您已经配置了负载均衡器,接下来可以开始向负载均衡器的 IP 地址发送流量了。如果您配置了网域,则还可以将流量发送到该域名。不过,DNS 传播可能需要一些时间才能完成,因此您可以先使用 IP 地址进行测试。

  1. 在 Google Cloud 控制台中,转到负载均衡页面。

    进入“负载均衡”

  2. 点击刚刚创建的负载均衡器。

  3. 记下负载均衡器的 IP 地址

  4. 对于 HTTP 负载均衡器,您可以使用网络浏览器转到 http://IP_ADDRESS 来测试负载均衡器。将 IP_ADDRESS 替换为负载均衡器的 IP 地址。系统会将您定向到 helloworld 服务首页。

  5. 对于 HTTPS 负载均衡器,您可以使用网络浏览器转到 https://IP_ADDRESS 来测试负载均衡器。将 IP_ADDRESS 替换为负载均衡器的 IP 地址。系统会将您定向到 helloworld 服务首页。
    如果此操作无效并且您使用的是 Google 管理的证书,请确认证书资源的状态为“有效”。如需了解详情,请参阅 Google 管理的 SSL 证书资源状态
    如果您使用自签名证书进行测试,您的浏览器将显示警告。您必须明确指示浏览器接受自签名证书。点击该警告即可查看实际页面。

其他配置选项

本部分对配置示例进行了扩展,以提供一些额外的替代配置选项。所有任务均为可选任务。您可以按任意顺序执行这些任务。

设置多区域负载均衡

在本页面前面的示例中,我们只有一项 Cloud Run 服务用作 us-central1 区域中的后端。由于无服务器 NEG 一次只能指向一个端点,因此不会跨多个区域执行负载均衡。外部应用负载均衡器仅用作前端,并将流量代理到指定的 helloworld 应用端点。但是,建议您从多个区域提供 Cloud Run 应用,以缩短最终用户延迟时间。

如果后端服务附加了多个无服务器 NEG,则负载均衡器会通过将请求转发到最近的可用区域中的无服务器 NEG 来均衡流量。但是,后端服务在每个区域只能包含一个无服务器 NEG。如需使 Cloud Run 服务在多个区域可用,您需要设置跨区域路由。您应该能够使用一个全球通用的网址方案来从距离用户最近的区域处理用户请求。

如需设置多区域传送,您需要使用优质网络层级,以确保所有区域 Cloud Run 部署都兼容并可处理来自任何区域的流量。

如需设置多区域负载均衡器,请执行以下操作:

  1. 在不同区域中设置两项 Cloud Run 服务。假设您已经部署了两项 Cloud Run 服务:一项服务部署到美国的一个区域,另一项服务部署到欧洲的一个区域。
  2. 使用以下设置创建外部应用负载均衡器:
    1. 设置具有两个无服务器 NEG 的全球后端服务:
      1. 在被部署到美国的 Cloud Run 服务所在的区域中创建第一个 NEG。
      2. 在被部署到欧洲的 Cloud Run 服务所在的区域中创建第二个 NEG。
    2. 在您的前端配置中设置高级网络服务层级。

下图展示了生成的设置。

无服务器应用的多区域路由。
无服务器应用的多区域路由

本部分基于本页前面所述的负载均衡器设置,在此设置过程中,您在 us-central1 区域中创建了一个无服务器 NEG,用于指向同一区域中的 Cloud Run 服务。此外,本部分还假设您已在 europe-west1 区域中创建第二项 Cloud Run 服务。您创建的第二个无服务器 NEG 将指向 europe-west1 区域中的此 Cloud Run 服务。

在此示例中,您将完成以下步骤:

  1. europe-west1 区域中创建第二个无服务器 NEG。
  2. 将第二个无服务器 NEG 连接到后端服务。

如需将第二个无服务器 NEG 添加到现有的后端服务,请按照以下步骤操作。

控制台

  1. 在 Google Cloud 控制台中,转到负载均衡页面。

    转到“负载均衡”

  2. 点击要修改其后端服务的负载均衡器的名称。

  3. 负载均衡器详情页面上,点击 修改

  4. 修改全球外部应用负载均衡器页面上,点击后端配置

  5. 后端配置页面上,针对要修改的后端服务点击 修改

  6. 后端部分中,点击添加后端

  7. 无服务器网络端点组列表中,选择创建无服务器网络端点组

  8. 输入无服务器 NEG 的名称。

  9. 对于区域,请选择 europe-west1

  10. 对于无服务器网络端点组类型,选择 Cloud Run,然后执行以下操作:

    1. 选中选择服务选项。
    2. 服务列表中,选择要为其创建负载均衡器的 Cloud Run 服务。
  11. 点击创建

  12. 新建后端页面上,点击完成

  13. 点击保存

  14. 如需更新后端服务,请点击更新

  15. 如需更新负载均衡器,请在修改全球外部应用负载均衡器页面上点击更新

gcloud

  1. 在部署 Cloud Run 服务的同一区域中创建第二个无服务器 NEG。

    gcloud compute network-endpoint-groups create SERVERLESS_NEG_NAME_2 \
      --region=europe-west1 \
      --network-endpoint-type=SERVERLESS \
      --cloud-run-service=CLOUD_RUN_SERVICE_2
    

    请替换以下内容:

    • SERVERLESS_NEG_NAME_2:第二个无服务器 NEG 的名称
    • CLOUD_RUN_SERVICE_2:Cloud Run 服务的名称
  2. 将第二个无服务器 NEG 作为后端添加到此后端服务。

    gcloud compute backend-services add-backend BACKEND_SERVICE_NAME \
      --global \
      --network-endpoint-group=SERVERLESS_NEG_NAME_2 \
      --network-endpoint-group-region=europe-west1
    

    请替换以下内容:

    • BACKEND_SERVICE_NAME:后端服务的名称
    • SERVERLESS_NEG_NAME_2:第二个无服务器 NEG 的名称

将经过身份验证的 Pub/Sub 推送订阅与多区域 Cloud Run 部署搭配使用

对于经过身份验证的推送请求,默认情况下,Cloud Run 预期它包含特定于区域的受众群体字段。在多区域 Cloud Run 部署中,如果推送请求路由到其他区域的 Cloud Run 服务,JWT 令牌验证将因受众群体不匹配而失败。

如需解决该特定区域的限制,请执行以下操作:

  1. 为不同区域中的服务部署配置相同的自定义受众群体
  2. 配置 Pub/Sub 推送消息,以将自定义受众群体用作 JWT 令牌中的受众群体

设置区域路由

从多个区域提供应用的一个常见原因是满足数据位置要求。 例如,您可能需要确保欧洲用户发出的请求始终从位于欧洲的某一区域传送。如需进行此项设置,您需要一个分别包含欧盟用户网址和非欧盟用户网址的网址架构,并将您的欧盟用户定向到欧盟网址。

在这种情况下,您可以使用网址映射将请求从特定网址路由到其相应区域。通过这种设置,针对一个区域的请求绝不会传送到其他区域。这样可以在各区域之间实现隔离。另一方面,如果一个区域发生故障,请求并不会被路由到其他区域。因此,此设置并不会增加服务的可用性。

如需设置区域路由,您需要使用优质网络层级,以便将不同的区域合并到一条转发规则中。

如需设置使用地区路由的负载均衡器,请执行以下操作:

  1. 在不同区域中设置两项 Cloud Run 服务。假设您已经部署了以下两项 Cloud Run 服务:一项 hello-world-eu 服务部署到欧洲的一个区域,另一项 hello-world-us 服务部署到美国的一个区域。
  2. 使用以下设置创建外部应用负载均衡器:
    1. 在欧洲区域设置一项使用无服务器 NEG 的后端服务。必须在部署到欧洲的 Cloud Run 服务所在的区域中创建无服务器 NEG。
    2. 在美国设置第二项使用其他无服务器 NEG 的后端服务,此无服务器 NEG 必须在部署到美国的 Cloud Run 服务所在的同一区域中创建。
    3. 使用适当的主机和路径规则设置网址映射,以使一组网址路由到位于欧洲的后端服务,而所有请求都路由到位于美国的后端服务。
    4. 在您的前端配置中设置优质网络层级。

其余设置可与前文所述相同。您会得到类似如下所示的设置:

无服务器应用的区域路由(没有故障切换功能)。
无服务器应用的区域路由(没有故障切换功能)

使用网址掩码

创建无服务器 NEG 时,您可以使用网址掩码来指向同一网域处提供的多项服务,而不必选择特定的 Cloud Run 服务。网址掩码是网址架构的模板。无服务器 NEG 将使用此模板从传入请求的网址中提取服务名称,并将请求映射到相应服务。

如果您的服务映射到自定义网域,而不是 Google Cloud 为已部署的服务提供的默认地址,则网址掩码特别有用。借助网址掩码,即使应用使用自定义网址格式,您也可以通过一条规则定位多项服务和版本。

如果您尚未阅读无服务器 NEG 概览:网址掩码,请务必阅读该文档。

构建网址掩码

如需为负载均衡器构建网址掩码,请从您的服务网址入手。对于本示例,我们将使用在 https://example.com/login 处运行的示例无服务器应用。这是将提供该应用的 login 服务的网址。

  1. 从该网址中移除 httphttps。仍保留 example.com/login
  2. 将服务名称替换为网址掩码的占位符。
    1. Cloud Run:将 Cloud Run 服务名称替换为占位符 <service>。如果 Cloud Run 服务具有与之关联的标记,请将标记名称替换为占位符 <tag>。 在此示例中,保留的网址掩码是 example.com/<service>
    2. Cloud Functions:将函数名称替换为占位符 <function>。 在此示例中,保留的网址掩码是 example.com/<function>
    3. App Engine:将服务名称替换为占位符 <service>。 如果服务具有与之关联的版本,请将该版本替换为占位符 <version>。 在此示例中,保留的网址掩码是 example.com/<service>
    4. API Gateway:将网关名称替换为占位符 <gateway>。在此示例中,保留的网址掩码是 example.com/<gateway>
  3. (可选)如果可以从网址的路径部分提取服务名称(或者函数、版本或标记),则可以省略网域。网址掩码的路径部分通过第一个 / 字符区分。如果网址掩码中没有 /,则掩码将被理解为仅代表主机。因此,对于此示例,网址掩码可以缩减至 /<service>/<gateway>/<function>

    同样,如果可以从网址的主机部分提取服务名称,则可以从网址掩码中完全省略路径。

    您还可以省略位于第一个占位符之前的任何主机或子网域组成部分以及位于最后一个占位符之后的任何路径组成部分。在这种情况下,占位符会捕获相应组成部分所需的信息。

以下几个示例演示了这些规则:

Cloud Run

下表假定您有一个名为 example.com 的自定义网域,并且您的所有 Cloud Run 服务都使用外部应用负载均衡器映射到此网域。

服务名称,标记名称 自定义网域网址 网址掩码
service:login https://login-home.example.com/web <service>-home.example.com
service:login https://example.com/login/web example.com/<service> 或 /<service>
service:login,tag:test https://test.login.example.com/web <tag>.<service>.example.com
service:login,tag:test https://example.com/home/login/test example.com/home/<service>/<tag> 或 /home/<service>/<tag>
service:login,tag:test https://test.example.com/home/login/web <tag>.example.com/home/<service>

Cloud Functions

下表假定您有一个名为 example.com 的自定义网域,并且您的所有 Cloud Functions 服务都映射到此网域。

函数名称 自定义网域网址 网址掩码
login https://example.com/login /<function>
login https://example.com/home/login /home/<function>
login https://login.example.com <function>.example.com
login https://login.home.example.com <function>.home.example.com

App Engine

下表假定您有一个名为 example.com 的自定义网域,并且您的所有 App Engine 服务都映射到此网域。

服务名称,版本 自定义网域网址 网址掩码
service:login https://login.example.com/web <service>.example.com
service:login https://example.com/home/login/web example.com/home/<service> 或 /home/<service>
service:login,version:test https://test.example.com/login/web <version>.example.com/<service>
service:login,version:test https://example.com/login/test example.com/<service>/<version>

API 网关

下表假定您有一个名为 example.com 的自定义网域,并且您的所有 API Gateway 服务都映射到此网域

网关名称 API Gateway(预览版)自定义网域网址 网址掩码
login https://example.com/login /<gateway>
login https://example.com/home/login /home/<gateway>
login https://login.example.com <gateway>.example.com
login https://login.home.example.com <gateway>.home.example.com

使用网址掩码创建无服务器 NEG

控制台

对于新的负载均衡器,您可以使用与本主题前面介绍的相同的端到端流程。配置后端服务时,请不要选择特定服务,而是输入网址掩码。

如果您已有负载均衡器,则可以修改后端配置,并让无服务器 NEG 指向网址掩码而不是特定服务。

如需将基于网址掩码的无服务器 NEG 添加到现有的后端服务,请执行以下操作:

  1. 转到 Google Cloud 控制台中的“负载均衡”页面。
    转到“负载均衡”页面
  2. 点击要修改其后端服务的负载均衡器的名称。
  3. 负载均衡器详情页面上,点击修改
  4. 修改全球外部应用负载均衡器页面上,点击后端配置
  5. 后端配置页面上,针对要修改的后端服务点击修改
  6. 点击添加后端
  7. 选择创建无服务器网络端点组
    1. 名称输入 helloworld-serverless-neg
    2. 区域下,选择 us-central1
    3. 无服务器网络端点组类型下,选择其中创建了无服务器应用(或服务或功能)的平台。
      1. 选择使用网址掩码
      2. 输入网址掩码。如需了解如何创建网址掩码,请参阅构建网址掩码
      3. 点击创建
  8. 新建后端部分中,点击完成
  9. 点击更新

gcloud:Cloud Run

如需使用示例网址掩码 example.com/<service> 创建无服务器 NEG,请使用以下命令:

gcloud compute network-endpoint-groups create helloworld-neg-mask \
  --region=us-central1 \
  --network-endpoint-type=serverless \
  --cloud-run-url-mask="example.com/<service>"

gcloud:Cloud Functions

如需使用示例网址掩码 example.com/<service> 创建无服务器 NEG,请使用以下命令:

gcloud compute network-endpoint-groups create helloworld-neg-mask \
 --region=us-central1 \
 --network-endpoint-type=serverless \
 --cloud-function-url-mask="example.com/<service>"

gcloud:App Engine

如需使用示例网址掩码 example.com/<service> 创建无服务器 NEG,请使用以下命令:

gcloud compute network-endpoint-groups create helloworld-neg-mask \
    --region=us-central1 \
    --network-endpoint-type=serverless \
    --app-engine-url-mask="example.com/<service>"

gcloud:API Gateway

如需使用示例网址掩码 example.com/<gateway> 创建无服务器 NEG,请使用以下命令:

gcloud beta compute network-endpoint-groups create helloworld-neg-mask \
  --region=us-central1 \
  --network-endpoint-type=serverless \
  --serverless-deployment-platform=apigateway.googleapis.com \
  --serverless-deployment-resource=my-gateway \
  --serverless-deployment-url-mask="example.com/<gateway>"

如需了解负载均衡器如何处理网址掩码不匹配的问题,请参阅排查无服务器 NEG 的问题

迁移自定义网域以便由外部应用负载均衡器处理

如果将无服务器计算应用映射到自定义网域,您可能需要更新 DNS 记录,以便通过负载均衡器路由发送到现有 Cloud Run、Cloud Functions、API Gateway 或 App Engine 自定义网域网址的流量。

例如,如果您有一个名为 example.com 的自定义网域,并且所有 Cloud Run 服务都映射到此网域,则应更新 example.com 的 DNS 记录以使其指向负载均衡器的 IP 地址。

在更新 DNS 记录之前,您可以在本地测试您的配置,方法是将自定义网域的本地 DNS 解析强制设置为负载均衡器的 IP 地址。如需在本地进行测试,请修改本地机器上的 /etc/hosts/ 文件以将 example.com 指向负载均衡器的 IP 地址,或者使用 curl --resolve 标志强制 curl 对该请求使用负载均衡器的 IP 地址。

example.com 的 DNS 记录解析为 HTTP(S) 负载均衡器的 IP 地址时,发送到 example.com 的请求会开始通过负载均衡器进行路由。负载均衡器会根据其网址映射将请求分配到相关后端服务。此外,如果后端服务配置了网址掩码,则无服务器 NEG 会使用该掩码将请求路由到相应的 Cloud Run、Cloud Functions、API Gateway 或 App Engine 服务。

启用 Cloud CDN

通过为 Cloud Run 服务启用 Cloud CDN,您可以将内容缓存到您的用户附近,从而优化内容传送。

您可以使用 gcloud compute backend-services update 命令在全球外部应用负载均衡器使用的后端服务上启用 Cloud CDN。

gcloud compute backend-services update helloworld-backend-service 
--enable-cdn
--global

使用 Cloud Run、Cloud Functions、API Gateway 和 App Engine 后端的后端服务支持 Cloud CDN。

在外部应用负载均衡器上启用 IAP

注意:IAP 与 Cloud CDN 不兼容。

您可以将 IAP 配置为启用或停用(默认)。如果设置为启用,您必须为 oauth2-client-idoauth2-client-secret 提供值。

如需启用 IAP,请更新后端服务以添加具有 oauth2-client-idoauth2-client-secret--iap=enabled 标志。

gcloud compute backend-services update BACKEND_SERVICE_NAME \
    --iap=enabled,oauth2-client-id=ID,oauth2-client-secret=SECRET \
    --global

启用 Google Cloud Armor

Google Cloud Armor 是一款安全产品,可为所有 GCLB 代理负载均衡器提供针对分布式拒绝服务攻击 (DDoS) 的保护。Google Cloud Armor 还为通过外部应用负载均衡器访问的服务提供可配置的安全政策。如需了解适用于外部应用负载均衡器的 Google Cloud Armor 安全政策,请参阅 Google Cloud Armor 安全政策概览

如果您使用的是 Cloud Functions,则可以使用 internal-and-gclb 入站流量设置来确保将请求发送到默认网址。

如果您使用的是 Cloud Run,则可以通过将入站流量限制到“内部和 Cloud Load Balancing”来屏蔽发送到默认网址或通过 Cloud Run 设置的任何其他自定义网域的请求”

如果您使用的是 App Engine,则可以使用入站流量控制机制,以便您的应用仅接收负载均衡器(如果您使用 VPC,则还有 VPC)发送的请求。

如果没有适当的入站流量设置,用户可使用无服务器应用的默认网址来绕过负载均衡器、Google Cloud Armor 安全政策、SSL 证书和通过负载均衡器传递的私钥。

可选:配置默认的后端安全政策。默认安全政策会限制超出用户配置阈值的流量。如需详细了解默认安全政策,请参阅速率限制概览

  1. 如需停用 Google Cloud Armor 默认安全政策,请在后端安全政策列表菜单中选择 None
  2. 安全部分中,选择默认安全政策
  3. 政策名称字段中,接受自动生成的名称或输入安全政策的名称。
  4. 请求数字段中,接受默认请求数,或输入介于 110,000 之间的整数。
  5. 间隔字段中,选择间隔。
  6. 对密钥实施字段中,选择以下值之一:全部IP 地址X-Forwarded-For IP 地址。如需详细了解这些选项,请参阅确定客户端以进行速率限制

启用日志记录和监控

您可以为外部应用负载均衡器后端服务启用和停用日志记录功能,还可以查看其日志。使用 Google Cloud 控制台时,对于具有无服务器 NEG 后端的后端服务,日志记录功能默认启用。您可以根据需要使用 gcloud 停用每个后端服务的日志记录功能。有关说明,请参阅日志记录

负载均衡器还会将监控数据导出到 Cloud Monitoring。监控指标可用于评估负载均衡器的配置、使用情况和性能。指标还可用于排查问题以及提高资源利用率和改善用户体验。有关说明,请参阅监控

更新客户端 HTTP keepalive 超时

前面步骤中创建的负载均衡器已配置客户端 HTTP keepalive 超时的默认值。如需更新客户端 HTTP keepalive 超时,请按照以下说明操作。

控制台

  1. 在 Google Cloud 控制台中,转到负载均衡页面。

    转到“负载均衡”

  2. 点击要修改的负载均衡器的名称。
  3. 点击修改
  4. 点击前端配置
  5. 展开高级功能。对于 HTTP keepalive 超时,请输入 5 到 1,200 秒的超时值。
  6. 点击更新
  7. 如需查看更改,请点击查看并最终确定,然后点击更新

gcloud

对于 HTTP 负载均衡器,请使用 gcloud compute target-http-proxies update 命令更新目标 HTTP 代理:

    gcloud compute target-http-proxies update TARGET_HTTP_PROXY_NAME \
        --http-keep-alive-timeout-sec=HTTP_KEEP_ALIVE_TIMEOUT_SEC \
        --global
    

对于 HTTPS 负载均衡器,请使用 gcloud compute target-https-proxies update 命令更新目标 HTTPS 代理:

    gcloud compute target-https-proxies update TARGET_HTTPS_PROXY_NAME \
        --http-keep-alive-timeout-sec=HTTP_KEEP_ALIVE_TIMEOUT_SEC \
        --global
    

请替换以下内容:

  • TARGET_HTTP_PROXY_NAME:目标 HTTP 代理的名称。
  • TARGET_HTTPS_PROXY_NAME:目标 HTTPS 代理的名称。
  • HTTP_KEEP_ALIVE_TIMEOUT_SEC:HTTP keepalive 超时值(5 到 1200 秒)。

启用离群值检测

您可以在全球后端服务上启用离群值检测,以识别运行状况不佳的无服务器 NEG 并减少发送到运行状况不佳的无服务器 NEG 的请求数。

可以使用以下方法之一在后端服务上启用离群值检测:

  • consecutiveErrors 方法 (outlierDetection.consecutiveErrors),其中 5xx 系列 HTTP 状态代码被视为错误。
  • consecutiveGatewayFailure 方法 (outlierDetection.consecutiveGatewayFailure),其中只有 502503504 HTTP 状态代码被视为错误。

请按照以下步骤为现有后端服务启用离群值检测。请注意,即使在启用离群值检测后,某些请求也可以发送到运行状况不佳的服务,并向客户端返回 5xx 状态代码。为了进一步降低错误率,您可以为离群值检测参数配置更激进的值。如需了解详情,请参阅 outlierDetection 字段

控制台

  1. 在 Google Cloud 控制台中,转到负载均衡页面。

    转到“负载均衡”

  2. 点击要修改其后端服务的负载均衡器的名称。

  3. 负载均衡器详情页面上,点击 修改

  4. 修改全球外部应用负载均衡器页面上,点击后端配置

  5. 后端配置页面上,针对要修改的后端服务点击 修改

  6. 向下滚动并展开高级配置部分。

  7. 离群值检测部分中,选中启用复选框。

  8. 点击 修改以配置离群值检测。

    验证以下选项是否配置了这些值:

    属性 价值
    连续错误数 5
    间隔时间 1000
    基本移除时间 30000
    最大移除百分比 50
    引发强制执行的连续错误数 100

    在此示例中,离群值检测分析每秒运行一次。如果 Envoy 代理收到的连续 HTTP 5xx 状态代码数为 5 个或更多,则后端端点会从 Envoy 代理的负载均衡池中移除 30 秒。当强制百分比设置为 100% 时,后端服务会在每次运行离群值检测分析时从这些特定 Envoy 代理的负载均衡池中逐出运行状况不佳的端点。如果满足移除条件,则最多可以从负载均衡池中移除 50% 的后端端点。

  9. 点击保存

  10. 如需更新后端服务,请点击更新

  11. 如需更新负载均衡器,请在修改全球外部应用负载均衡器页面上点击更新

gcloud

  1. 将后端服务导出到 YAML 文件。

    gcloud compute backend-services export BACKEND_SERVICE_NAME \
      --destination=BACKEND_SERVICE_NAME.yaml --global
    

    BACKEND_SERVICE_NAME 替换为后端服务的名称。

  2. 修改后端服务的 YAML 配置,以添加离群值检测字段,如以下 YAML 配置所示。

    在此示例中,离群值检测分析每秒运行一次。如果 Envoy 代理收到的连续 HTTP 5xx 状态代码数为 5 个或更多,则后端端点会从 Envoy 代理的负载均衡池中移除 30 秒。当强制百分比设置为 100% 时,后端服务会在每次运行离群值检测分析时从这些特定 Envoy 代理的负载均衡池中逐出运行状况不佳的端点。如果满足移除条件,则最多可以从负载均衡池中移除 50% 的后端端点。

    name: BACKEND_SERVICE_NAME
    backends:
    - balancingMode: UTILIZATION
      capacityScaler: 1.0
      group: https://www.googleapis.com/compute/v1/projects/PROJECT_ID/regions/REGION_A/networkEndpointGroups/SERVERLESS_NEG_NAME
    - balancingMode: UTILIZATION
      capacityScaler: 1.0
      group: https://www.googleapis.com/compute/v1/projects/PROJECT_ID/regions/REGION_B/networkEndpointGroups/SERVERLESS_NEG_NAME_2
    outlierDetection:
      baseEjectionTime:
        nanos: 0
        seconds: 30
      consecutiveErrors: 5
      enforcingConsecutiveErrors: 100
      interval:
        nanos: 0
        seconds: 1
      maxEjectionPercent: 50
    port: 80
    selfLink: https://www.googleapis.com/compute/v1/projects/PROJECT_ID/global/backendServices/BACKEND_SERVICE_NAME
    sessionAffinity: NONE
    timeoutSec: 30
    ...
    

    请替换以下内容:

    • BACKEND_SERVICE_NAME:后端服务的名称
    • PROJECT_ID:您的项目的 ID
    • REGION_AREGION_B:已配置负载均衡器的区域。
    • SERVERLESS_NEG_NAME:第一个无服务器 NEG 的名称
    • SERVERLESS_NEG_NAME_2:第二个无服务器 NEG 的名称
  3. 通过导入最新配置来更新后端服务。

    gcloud compute backend-services import BACKEND_SERVICE_NAME \
      --source=BACKEND_SERVICE_NAME.yaml --global
    

    离群值检测现已在后端服务上启用。

删除无服务器 NEG

如果网络端点组已连接到后端服务,则您无法将其删除。在删除 NEG 之前,请确保该 NEG 已与后端服务分离。

控制台

  1. 如需确保要删除的无服务器 NEG 当前未被任何后端服务使用,请转到负载均衡高级菜单中的后端服务标签页。
    转到“后端服务”标签页
  2. 如果无服务器 NEG 当前正在使用:
    1. 点击使用无服务器 NEG 的后端服务的名称。
    2. 点击修改
    3. 后端列表中,点击 以从后端服务中移除无服务器 NEG 后端。
    4. 点击保存
  3. 转到 Google Cloud 控制台中的网络端点组页面。
    转到“网络端点组”页面
  4. 选中您要删除的无服务器 NEG 对应的复选框。
  5. 点击删除
  6. 再次点击删除进行确认。

gcloud

如需从后端服务中移除无服务器 NEG,您必须指定在其中创建该 NEG 的区域。此外,您还必须指定 --global 标志,因为 helloworld-backend-service 是全球性资源。

gcloud compute backend-services remove-backend helloworld-backend-service \
    --network-endpoint-group=helloworld-serverless-neg \
    --network-endpoint-group-region=us-central1 \
    --global

如需删除无服务器 NEG,请使用以下命令:

gcloud compute network-endpoint-groups delete helloworld-serverless-neg \
    --region=us-central1

后续步骤