使用 Cloud Run 设置区域级内部应用负载均衡器

本文档介绍了如何使用 Cloud Run 部署区域级内部应用负载均衡器。如需进行此设置,请为负载均衡器使用无服务器 NEG 后端。

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

本指南介绍如何配置应用负载均衡器以将请求代理到无服务器 NEG 后端。

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

准备工作

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

安装 Google Cloud SDK

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

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

部署 Cloud Run 服务

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

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

无服务器 NEG、负载均衡器和任何客户端虚拟机都必须与 Cloud Run 服务位于同一区域。

如需阻止从互联网访问 Cloud Run 服务,请将入站流量限制为 internal。来自内部应用负载均衡器的流量被视为内部流量。

gcloud run deploy CLOUD_RUN_SERVICE_NAME \
  --platform=managed \
  --allow-unauthenticated \
  --ingress=internal \
  --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. 对于名称,输入 lb-subnet
    2. 选择区域
    3. 对于 IP 地址范围,输入 10.1.2.0/24
    4. 点击完成
  6. 点击创建

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
    

创建代理专用子网

lb-network 网络中特定区域的所有基于 Envoy 的区域负载均衡器创建代理专用子网。

控制台

  1. 在 Google 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 控制台中,转到负载均衡页面。

    转到“负载均衡”

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

基本配置

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

配置前端

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

      以下示例展示了如何创建 Compute Engine SSL 证书:

    7. 点击创建新证书
      1. 名称字段中,输入一个名称。
      2. 在相应字段中上传您的 PEM 格式的文件:
        • 证书
        • 私钥
      3. 点击创建

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

  5. 可选:如需创建 HTTP 负载均衡器,请执行以下操作:
    1. 协议下,选择 HTTP
    2. 子网下,选择子网。
    3. IP 版本下,选择 IPv4
    4. IP 地址下,选择临时
    5. 端口下,选择 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. 可选:点击等效代码以查看将用于创建负载均衡器的 REST API 请求。
  4. 点击创建。等待负载均衡器完成创建。
  5. 点击负载均衡器的名称 (serverless-lb)。
  6. 请记下负载均衡器的 IP 地址,以备在下一个任务中使用。

gcloud

  1. 为 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
        
  2. 创建区域后端服务。将 --protocol 设置为 HTTP。此参数会被忽略,但它是必需参数,因为如果不设置,--protocol 会默认为 TCP。
        gcloud compute backend-services create BACKEND_SERVICE_NAME \
            --load-balancing-scheme=INTERNAL_MANAGED \
            --protocol=HTTP \
            --region=REGION
        
  3. 将无服务器 NEG 作为后端添加到此后端服务:
        gcloud compute backend-services add-backend BACKEND_SERVICE_NAME \
            --region=REGION \
            --network-endpoint-group=SERVERLESS_NEG_NAME \
            --network-endpoint-group-region=REGION
        
  4. 创建区域网址映射以将传入的请求路由到此后端服务:
        gcloud compute url-maps create URL_MAP_NAME \
            --default-service=BACKEND_SERVICE_NAME \
            --region=REGION
        
    此示例网址映射仅会定位到一项代表单个无服务器应用的后端服务,因此您不需要设置主机规则或路径匹配器。
  5. 可选:如果您在客户端和负载均衡器之间使用 HTTPS,请执行此步骤。HTTP 负载均衡器不需要执行此步骤。

    您可以创建 Compute Engine 证书或 Certificate Manager 证书。使用以下任一方法通过 Certificate Manager 创建证书:

    • 自行管理的区域级证书。如需了解如何创建和使用自行管理的区域级证书,请参阅部署自行管理的区域级证书。不支持证书映射。

    • Google 管理的区域级证书。不支持证书映射。

      Certificate Manager 支持以下类型的 Google 管理的区域级证书:

    • 创建证书后,将证书直接附加到目标代理。

      如需创建自行管理的区域 SSL 证书资源,请运行以下命令:
          gcloud compute ssl-certificates create SSL_CERTIFICATE_NAME \
              --certificate CRT_FILE_PATH \
              --private-key KEY_FILE_PATH \
              --region=REGION
          
    • 创建区域目标代理以将请求路由到网址映射。

      对于 HTTP 负载均衡器,请创建 HTTP 目标代理:
          gcloud compute target-http-proxies create TARGET_HTTP_PROXY_NAME \
              --url-map=URL_MAP_NAME \
              --region=REGION
          
      对于 HTTPS 负载均衡器,请创建 HTTPS 目标代理。该代理属于负载均衡器,用于保存 HTTPS 负载均衡所需的 SSL 证书,因此您还需要在此步骤中加载您的证书。
          gcloud compute target-https-proxies create TARGET_HTTPS_PROXY_NAME \
              --ssl-certificates=SSL_CERTIFICATE_NAME \
              --url-map=URL_MAP_NAME \
              --region=REGION
          
    • 创建转发规则以将传入请求路由到代理。 请勿将代理专用子网用于转发规则 IP 地址。您可以配置子网 (lb-subnet) 中的任何有效 IP 地址。

      对于 HTTP 负载均衡器:
          gcloud compute forwarding-rules create HTTP_FORWARDING_RULE_NAME \
              --load-balancing-scheme=INTERNAL_MANAGED \
              --network=lb-network \
              --subnet=lb-subnet \
              --address=IP_ADDRESS \
              --target-http-proxy=TARGET_HTTP_PROXY_NAME \
              --target-http-proxy-region=REGION \
              --region=REGION \
              --ports=80
          
      对于 HTTPS 负载均衡器:
          gcloud compute forwarding-rules create HTTPS_FORWARDING_RULE_NAME \
              --load-balancing-scheme=INTERNAL_MANAGED \
              --network=lb-network \
              --subnet=lb-subnet \
              --address=IP_ADDRESS \
              --target-https-proxy=TARGET_HTTPS_PROXY_NAME \
              --target-https-proxy-region=REGION \
              --region=REGION \
              --ports=443
          

测试负载均衡器

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

创建客户端虚拟机

此示例在与负载均衡器相同的区域内创建一个客户端虚拟机 (vm-client)。该客户端用于验证负载均衡器的配置,并演示预期的行为。

gcloud

客户端虚拟机可以位于负载均衡器所在的 REGION 的任何可用区中,并且可以使用同一 VPC 网络中的任何子网。

gcloud compute instances create vm-client \
    --image-family=debian-10 \
    --image-project=debian-cloud \
    --tags=allow-ssh \
    --network=lb-network \
    --subnet=lb-subnet \
    --zone=ZONE

配置防火墙规则

此示例要求测试客户端虚拟机的以下防火墙规则:

fw-allow-ssh。适用于测试客户端虚拟机的入站流量规则,允许从任何地址到 TCP 端口 22 的传入 SSH 连接。您可以为此规则选择限制性更高的来源 IP 地址范围;例如,您可以仅指定要从中启动 SSH 会话的系统的 IP 地址范围。此示例使用目标标记 allow-ssh

控制台

  1. 在 Google Cloud 控制台中,转到防火墙页面。
    前往“防火墙政策”
  2. 点击创建防火墙规则,以创建允许传入 SSH 连接的规则:
    • 名称allow-ssh
    • 网络lb-network
    • 流量方向入站
    • 对匹配项执行的操作允许
    • 目标指定的目标标记
    • 目标标记allow-ssh
    • 来源过滤条件IPv4 范围
    • 来源 IPv4 范围0.0.0.0/0
    • 协议和端口
      • 选择指定的协议和端口
      • 选中 TCP 复选框,然后输入 22 作为端口号。
  3. 点击创建

gcloud

  1. 创建 fw-allow-ssh 防火墙规则,允许通过 SSH 连接到网络标记为 allow-ssh 的虚拟机。如果省略 source-ranges,Google Cloud 会将规则解释为表示所有来源

    gcloud compute firewall-rules create fw-allow-ssh \
        --network=lb-network \
        --action=allow \
        --direction=ingress \
        --target-tags=allow-ssh \
        --rules=tcp:22
    

将流量发送到负载均衡器

负载均衡器配置在首次部署后可能需要几分钟时间才能全球传播。

  • 通过 SSH 连接到客户端实例。

    gcloud compute ssh vm-client \
      --zone=ZONE
    
  • 验证负载均衡器是否按预期为 Cloud Run 服务首页提供服务。

    对于 HTTP 测试,请运行以下命令:

    curl IP_ADDRESS
    

    对于 HTTPS 测试,请运行以下命令:

    curl -k -s 'https://TEST_DOMAIN_URL:443' --connect-to TEST_DOMAIN_URL:443:IP_ADDRESS:443
    

    TEST_DOMAIN_URL 替换为与您的应用关联的网域。例如 test.example.com

    -k 标志会导致 curl 跳过证书验证。

其他配置选项

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

使用网址掩码

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

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

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

构建网址掩码

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

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

    同样,如果可以从网址的主机部分提取 <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. 修改全球外部应用负载均衡器页面上,点击后端配置
  5. 后端配置页面上,点击您要修改的后端服务对应的 修改
  6. 点击添加后端
  7. 选择创建无服务器网络端点组
    1. 名称输入 helloworld-serverless-neg
    2. 区域下会显示负载均衡器所在的区域。
    3. 无服务器网络端点组类型下,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. 转到 Google Cloud 控制台中的网络端点组页面。
    前往“网络端点组”页面
  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

后续步骤