使用 Cloud Run 设置区域级外部 HTTP(S) 负载均衡器

本页面介绍如何使用 Cloud Run 后端部署区域级外部 HTTP(S) 负载均衡器。如需进行此设置,请为负载均衡器使用无服务器 NEG 后端。

在试用此过程之前,请确保您熟悉以下主题:

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

准备工作

  1. 安装 Google Cloud CLI
  2. 部署 Cloud Run 服务
  3. 配置权限

安装 Google Cloud SDK

安装 gcloud 命令行工具。如需了解该工具的概念信息和安装信息,请参阅 gcloud 概览

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

注意:您无法使用 Cloud Console 通过无服务器 NEG 后端设置区域级外部 HTTP(S) 负载均衡器。

部署 Cloud Run 服务

本页面中的说明假定您已运行 Cloud Run 服务。

对于本页面中的示例,您可以使用任何 Cloud Run 快速入门部署 Cloud Run 服务。

无服务器 NEG 和负载均衡器必须与 Cloud Run 服务位于同一区域中。通过将入站流量限制为 internal and cloud load balancing,您可以阻止直接发送到 Cloud Run 服务默认网址的外部请求。例如:

gcloud run deploy CLOUD_RUN_SERVICE_NAME \
  --platform=managed \
  --allow-unauthenticated \
  --ingress=internal-and-cloud-load-balancing \
  --region=REGION \
  --image=IMAGE_URL

记下您创建的服务的名称。本页面的其余部分介绍了如何设置负载均衡器,以将请求路由到此服务。

配置权限

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

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

配置网络和子网

如需配置网络及其子网,您必须先创建 VPC 网络,在特定子网中创建虚拟机实例,然后创建代理专用子网。

创建 VPC 网络

创建自定义模式 VPC 网络,然后在区域内创建所需的子网。最后,为您的网络定义防火墙规则。

控制台

  1. 前往 Google Cloud 控制台中的 VPC 网络页面。

    转到 VPC 网络

  2. 点击创建 VPC 网络

  3. 名称字段中,输入 lb-network

  4. 子网创建模式字段中,选择自定义

  5. 新子网部分,为子网指定以下配置参数:

    1. 为子网提供名称
    2. 选择区域
    3. 输入 IP 地址范围,例如 10.1.2.0/24。如需了解详情,请参阅主要 IPv4 范围

      如果您选择的范围不是 RFC 1918 地址,请确认该范围与现有配置不冲突。如需了解详情,请参阅 IPv4 子网范围

    4. 点击完成

  6. 防火墙规则部分中,选择 IPv4 防火墙规则标签页中的预定义防火墙规则。这些预定义规则适用于实例连接的常见使用场景。

    每个预定义的规则名称都以您创建的 VPC 网络的名称开头。

    1. 可选:您可以修改 lb-network-allow-custom 规则。在包含规则的行的右侧,点击修改以选择子网,添加其他 IPv4 范围并指定协议和端口。

    如果您稍后添加其他子网,则 lb-network-allow-custom 防火墙规则不会自动更新。如果需要将防火墙规则用于新子网,则必须更新防火墙配置以添加规则。

    如果您不选择任何预定义规则,则可以在创建网络之后创建自己的防火墙规则

  7. 为 VPC 网络选择动态路由模式。稍后,您可以更改动态路由模式

    如需了解详情,请参阅动态路由模式

  8. 最大传输单元 (MTU) 字段中,选择 1460(默认)或 1500

    在将 MTU 设置为 1500 之前,请查看最大传输单元概览

  9. 点击创建

gcloud

  1. 使用 gcloud compute networks create 命令创建自定义 VPC 网络:

    gcloud compute networks create lb-network --subnet-mode=custom
    
  2. lb-network 网络中创建子网。此示例使用 10.1.2.0/24 作为子网的 IP 地址范围。您可以配置任何有效的子网范围

    gcloud compute networks subnets create lb-subnet \
    --network=lb-network \
    --range=10.1.2.0/24 \
    --region=REGION
    

在特定子网中创建虚拟机实例

在您打算设置具有无服务器后端的区域负载均衡器的 VPC 网络中,必须至少有一个虚拟机。如果该网络中已有虚拟机,则无需执行此步骤。

控制台

  1. 在 Google Cloud Console 中,转到虚拟机实例页面。

    转到虚拟机实例

  2. 选择您的项目并点击继续

  3. 点击创建实例

  4. 为您的虚拟机指定名称 test-vm。如需了解详情,请参阅资源命名惯例

  5. 可选操作:更改此虚拟机的可用区。Compute Engine 会随机列出每个区域内的可用区,以鼓励跨多个可用区使用。

  6. 防火墙部分中,选择允许 HTTP 流量允许 HTTPS 流量,以允许传送到虚拟机的 HTTP 或 HTTPS 流量。

    Cloud 控制台会向您的虚拟机中添加网络标记,并创建对应的入站防火墙规则,该规则允许 tcp:80 (HTTP) 或 tcp:443 (HTTPS) 上的所有传入流量。

    网络标记可将防火墙规则与虚拟机相关联。如需了解详情,请参阅虚拟私有云文档中的防火墙规则概览

  7. 展开网络、磁盘、安全、管理、单独租用部分。

    1. 展开网络部分。
    2. 对于网络接口,请指定网络详细信息:
      1. 网络字段中,选择包含您创建的子网的 VPC 网络,例如 lb-network
      2. 子网字段中,选择虚拟机要使用的子网,例如 lb-subnet
      3. 点击完成
  8. 要创建并启动该虚拟机,请点击创建

gcloud

  1. 创建一个虚拟机。

    gcloud compute instances create test-vm \
    --network=lb-network \
    --subnet=lb-subnet \
    --zone=ZONE
    

创建代理专用子网

lb-network 网络的区域中,为所有基于 Envoy 的负载均衡器(内部 HTTP(S) 负载均衡器和区域外部 HTTP(S) 负载均衡器)创建代理专用子网。

控制台

  1. 在 Cloud 控制台中,前往 VPC 网络页面。
    转到 VPC 网络
  2. 点击您要向其中添加代理专用子网的共享 VPC 网络的名称。
  3. 点击添加子网
  4. 名称字段中,输入 proxy-only-subnet
  5. 选择区域
  6. 用途设置为区域级代管式代理
  7. 输入 IP 地址范围 10.129.0.0/23
  8. 点击添加

gcloud

  1. 使用 gcloud compute networks subnets create 命令创建代理专用子网。
    此示例将 IP 地址范围 10.129.0.0/23 用于代理专用子网。您可以配置任何有效的子网范围

    gcloud compute networks subnets create proxy-only-subnet \
     --purpose=REGIONAL_MANAGED_PROXY \
     --role=ACTIVE \
     --region=REGION \
     --network=lb-network \
     --range=10.129.0.0/23
    

创建负载均衡器

在下图中,负载均衡器使用无服务器 NEG 后端将请求定向到无服务器 Cloud Run 服务。

Cloud Run 应用的区域级外部 HTTP(S) 负载均衡架构。
Cloud Run 应用的区域级外部 HTTP(S) 负载均衡架构

从负载均衡器到无服务器 NEG 后端的流量,使用 VPC 外部定义且不受防火墙规则约束的特殊路由。因此,如果您的负载均衡器只有无服务器 NEG 后端,则无需创建防火墙规则即可允许从代理专用子网到无服务器后端的流量。

控制台

开始配置

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

    转到“负载均衡”

  2. HTTP(S) 负载均衡下,点击开始配置
  3. 面向互联网或仅限内部下,选择从互联网到我的虚拟机或无服务器服务
  4. 全球性或区域级下,选择区域级 HTTP(S) 负载均衡器
  5. 点击继续
  6. 对于负载均衡器的名称,请输入 serverless-lb
  7. 选择网络 lb_network
  8. 不关闭窗口继续操作。

配置前端

  1. 在继续操作之前,请确保您拥有 SSL 证书
  2. 点击前端配置
  3. 输入名称
  4. 如需配置区域外部 HTTP(S) 负载均衡器,请按如下所示填写各个字段。
    1. 协议下,选择 HTTPS
    2. IP 版本下,选择 IPv4
    3. IP 地址下,选择临时
    4. 端口下,选择 443
    5. 证书下,选择现有的 SSL 证书或创建新证书。

      如需创建 HTTPS 负载均衡器,您必须具有要在 HTTPS 代理中使用的 SSL 证书资源。您可以使用自行管理的 SSL 证书创建 SSL 证书资源。
      系统不支持 Google 管理的证书。

    如果您想在不设置 SSL 证书资源的情况下测试此过程,则可以设置 HTTP 负载均衡器。

  5. 可选:如需创建 HTTP 负载均衡器,请执行以下操作:
    1. 协议下,选择 HTTPS
    2. IP 版本下,选择 IPv4
    3. IP 地址下,选择临时
    4. 端口下,选择 80
  6. 点击完成

配置后端服务

  1. 点击后端配置
  2. 创建或选择后端服务下拉菜单中,将指针悬停在后端服务上,然后选择创建后端服务
  3. 创建后端服务窗口中,输入名称
  4. 后端类型下,选择无服务器网络端点组(预览版)
  5. 保持协议不变。此参数会被忽略。
  6. 后端 > 新建后端下,选择创建无服务器网络端点组
    1. 创建无服务器网络端点组窗口中,输入名称
    2. 区域下会显示负载均衡器所在的区域。
    3. 无服务器网络端点组类型字段中,选择 Cloud Run。Cloud Run 是唯一受支持的类型。
    4. 选中选择服务名称
    5. 服务下拉列表中,选择您要为其创建负载均衡器的 Cloud Run 服务。
    6. 点击完成
    7. 点击创建
  7. 创建后端服务窗口中,点击创建

配置路由规则

路由规则决定了流量的定向方式。您可以将流量定向到后端服务或 Kubernetes 服务。没有明确匹配主机和路径匹配器的所有流量都将发送到默认服务。

  1. 点击简单主机和路径规则
  2. 后端下拉列表中选择一项后端服务。

检查配置

  1. 点击检查并最终确定
  2. 检查后端主机和路径规则以及前端的值。
  3. 点击创建。 等待负载均衡器完成创建。
  4. 点击负载均衡器的名称 (serverless-lb)。
  5. 请记下负载均衡器的 IP 地址,以备在下一个任务中使用。

gcloud

  1. 为负载均衡器预留静态外部 IP 地址:
        gcloud compute addresses create ADDRESS_NAME  \
            --region=REGION \
            --network-tier=STANDARD
        
  2. 为 Cloud Run 服务创建无服务器 NEG:
        gcloud compute network-endpoint-groups create SERVERLESS_NEG_NAME \
            --region=REGION \
            --network-endpoint-type=serverless  \
            --cloud-run-service=CLOUD_RUN_SERVICE_NAME
        
  3. 创建区域后端服务。将 --protocol 设置为 HTTP 或 HTTPS。
        gcloud beta compute backend-services create BACKEND_SERVICE_NAME \
            --load-balancing-scheme=EXTERNAL_MANAGED \
            --protocol=HTTP \
            --region=REGION
        
  4. 将无服务器 NEG 作为后端添加到此后端服务:
        gcloud beta compute backend-services add-backend BACKEND_SERVICE_NAME \
            --region=REGION \
            --network-endpoint-group=SERVERLESS_NEG_NAME \
            --network-endpoint-group-region=REGION
        
  5. 创建区域网址映射以将传入的请求路由到此后端服务:
        gcloud beta compute url-maps create URL_MAP_NAME \
            --default-service=BACKEND_SERVICE_NAME \
            --region=REGION
        
    此示例网址映射仅会定位到一项代表单个无服务器应用的后端服务,因此您不需要设置主机规则或路径匹配器。
  6. 如需创建 HTTPS 负载均衡器,您必须具有要在 HTTPS 目标代理中使用的 SSL 证书资源。您可以使用自行管理的 SSL 证书创建 SSL 证书资源。不支持 Google 管理的证书。 如需创建自行管理的区域 SSL 证书资源,请运行以下命令:
        gcloud beta compute ssl-certificates create SSL_CERTIFICATE_NAME \
            --certificate CRT_FILE_PATH \
            --private-key KEY_FILE_PATH \
            --region=REGION
        
  7. 创建区域目标代理以将请求路由到网址映射。

    对于 HTTP 负载均衡器,请创建 HTTP 目标代理:
        gcloud beta compute target-http-proxies create TARGET_HTTP_PROXY_NAME \
            --url-map=URL_MAP_NAME \
            --region=REGION
        
    对于 HTTPS 负载均衡器,请创建 HTTPS 目标代理。 该代理属于负载均衡器,用于保存 HTTPS 负载均衡所需的 SSL 证书,因此您还需要在此步骤中加载您的证书。
        gcloud beta compute target-https-proxies create TARGET_HTTPS_PROXY_NAME \
            --ssl-certificates=SSL_CERTIFICATE_NAME \
            --url-map=URL_MAP_NAME \
            --region=REGION
        
  8. 创建转发规则以将传入请求路由到代理。 对于 HTTP 负载均衡器:
        gcloud beta compute forwarding-rules create HTTP_FORWARDING_RULE_NAME \
            --load-balancing-scheme=EXTERNAL_MANAGED \
            --network-tier=STANDARD \
            --network=lb-network \
            --address=ADDRESS_NAME \
            --target-http-proxy=TARGET_HTTP_PROXY_NAME \
            --target-http-proxy-region=REGION \
            --region=REGION \
            --ports=80
        
    对于 HTTPS 负载均衡器:
        gcloud beta compute forwarding-rules create HTTPS_FORWARDING_RULE_NAME \
            --load-balancing-scheme=EXTERNAL_MANAGED \
            --network-tier=STANDARD \
            --network=lb-network \
            --address=ADDRESS_NAME \
            --target-https-proxy=TARGET_HTTPS_PROXY_NAME \
            --target-https-proxy-region=REGION \
            --region=REGION \
            --ports=443
        

测试负载均衡器

现在您已经配置了负载均衡器,接下来可以开始向负载均衡器的 IP 地址发送流量了。

  1. 转到 Google Cloud Console 中的“负载均衡”页面。
    转到“负载均衡”
  2. 点击刚刚创建的负载均衡器。
  3. 记下负载均衡器的 IP 地址
  4. 对于 HTTP 负载均衡器,您可以使用网络浏览器转到 http://IP_ADDRESS 来测试负载均衡器。将 IP_ADDRESS 替换为负载均衡器的 IP 地址。系统会将您定向到 Cloud Run 服务首页。
  5. 对于 HTTPS 负载均衡器,您可以使用网络浏览器转到 https://IP_ADDRESS 来测试负载均衡器。将 IP_ADDRESS 替换为负载均衡器的 IP 地址。系统会将您定向到 Cloud Run 服务首页。
    如果您使用自签名证书进行测试,您的浏览器将显示警告。您必须明确指示浏览器接受自签名证书。点击该警告即可查看实际页面。

其他配置选项

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

使用网址掩码

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

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

如果您尚未阅读无服务器 NEGS 概览:网址掩码,请务必阅读此项内容。

构建网址掩码

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

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

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

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

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

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

服务名称,标记名称 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>

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

控制台

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

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

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

  1. 在 Google Cloud 控制台中,前往“负载均衡”页面。
    前往“负载均衡”页面
  2. 点击包含您要修改的后端服务的负载均衡器的名称。
  3. 负载均衡器详情页面上,点击修改
  4. 修改 HTTP(S) 负载均衡器页面上,点击后端配置
  5. 后端配置页面上,针对要修改的后端服务点击修改
  6. 点击添加后端
  7. 选择创建无服务器网络端点组
    1. 名称输入 helloworld-serverless-neg
    2. 区域下会显示负载均衡器所在的区域。
    3. 无服务器网络端点组类型下会显示 Cloud Run。目前,Cloud Run 是唯一受支持的网络端点组类型。
      1. 选择使用网址掩码
      2. 输入网址掩码。如需了解如何创建网址掩码,请参阅构建网址掩码
      3. 点击创建

  8. 新建后端中,点击完成
  9. 点击更新

gcloud

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

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

删除无服务器 NEG

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

控制台

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

gcloud

如需从后端服务中移除无服务器 NEG,您必须指定在其中创建该 NEG 的区域。

gcloud compute backend-services remove-backend BACKEND_SERVICE_NAME \
    --network-endpoint-group=SERVERLESS_NEG_NAME \
    --network-endpoint-group-region=REGION \
    --region=REGION

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

gcloud compute network-endpoint-groups delete SERVERLESS_NEG_NAME \
    --region=REGION

后续步骤