API 网关的 HTTP(S) 负载均衡使用入门

本教程介绍如何创建 Google Cloud HTTP(S) 外部负载均衡器,以将请求路由到 API Gateway。配置过程遵循与配置 Cloud Load Balancing 集成相同的步骤,这些集成包括与其他无服务器产品(如 Cloud RunCloud FunctionsApp Engine)的集成。

虽然 API Gateway 正常运行并不需要负载均衡器,但您的网关可以利用 Cloud Load Balancing 的多种优势。例如,通过将 Cloud Load Balancing 与 API Gateway 搭配使用,您可以执行以下操作:

  • 使用自定义网域。
  • 将 Google Cloud Armor 用作网络安全服务。
  • 在多个位置管理跨网关的高效负载均衡。
  • 实现高级流量管理。

准备工作

  1. 如果您尚未下载并安装 Google Cloud CLI,请执行此操作。

    下载 gcloud CLI

  2. 更新 gcloud 组件:

    gcloud components update
  3. 按照 API Gateway 快速入门部署 Cloud Run 服务并创建指向该服务的网关。

  4. 配置权限

  5. 添加 SSL 证书资源

部署 Cloud Run 服务和 API Gateway 实例

在本教程中,您会将“hello-world”服务部署到 Cloud Run,创建路由到 Cloud Run 服务的网关,并配置 HTTP(S) 负载均衡器以将请求路由到自定义网域。

虽然本教程使用 Cloud Run 作为 API Gateway 的后端服务,但这些步骤也适用于 API Gateway 目前支持的任何后端服务。

API Gateway 快速入门成功完成后,您应该有一个已部署的网关网址指向 Cloud Run 服务。

配置权限

在本教程中,您将创建一个无服务器网络端点组 (NEG) 并在 Cloud 项目中创建外部 HTTP(S) 负载均衡器。这需要项目 Owner 或 Editor 角色,或者以下 Compute Engine IAM 角色

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

创建 SSL 证书资源

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

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

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

本教程假定您已创建 SSL 证书资源。

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

创建 HTTP(S) 负载均衡器

  1. 为 API Gateway 创建无服务器 NEG。

    网络端点组 (NEG) 为负载均衡器指定了一组后端端点。无服务器 NEG 是指向 API Gateway 等服务的后端,如下图所示:

    无服务器 NEG 作为多区域网关的后端示意图

    如需为您的网关创建无服务器 NEG,请运行以下命令,其中:

    • SERVERLESS_NEG_NAME 是要创建的无服务器 NEG 的名称。
    • GATEWAY_ID 指定网关的名称。
    • REGION_ID 是无服务器 NEG 的部署区域(这应与网关区域一致)。
    gcloud beta compute network-endpoint-groups create SERVERLESS_NEG_NAME \
      --region=REGION_ID \
      --network-endpoint-type=serverless \
      --serverless-deployment-platform=apigateway.googleapis.com \
      --serverless-deployment-resource=GATEWAY_ID

    例如:

    gcloud beta compute network-endpoint-groups create api-gateway-serverless-neg \
      --region=us-central1 \
      --network-endpoint-type=serverless \
      --serverless-deployment-platform=apigateway.googleapis.com \
      --serverless-deployment-resource=my-gateway
  2. 创建后端服务以定义 Cloud Load Balancing 如何分配流量。

    后端服务配置包含一组值,例如用于连接到后端的协议、各种分发和会话设置、健康检查和超时,如下图所示:

    无服务器 NEG 作为后端服务的后端示意图

    如需创建后端服务,请运行以下命令:

    gcloud compute backend-services create BACKEND_SERVICE_NAME --global

    其中,BACKEND_SERVICE_NAME 是新后端服务的名称。

    例如:

    gcloud compute backend-services create api-gateway-backend-service --global

    如需将无服务器 NEG 作为后端添加到后端服务,请运行以下命令,其中:

    • BACKEND_SERVICE_NAME 是后端服务的名称。
    • SERVERLESS_NEG_NAME 是上一步中创建的无服务器 NEG 的名称。
    • REGION_ID 是无服务器 NEG 的部署区域(这应与网关区域一致)。
    gcloud compute backend-services add-backend BACKEND_SERVICE_NAME \
      --global \
      --network-endpoint-group=SERVERLESS_NEG_NAME \
      --network-endpoint-group-region=REGION_ID

    例如:

    gcloud compute backend-services add-backend api-gateway-backend-service \
      --global \
      --network-endpoint-group=api-gateway-serverless-neg \
      --network-endpoint-group-region=us-central1
  3. 创建网址映射以将传入的请求路由到此后端服务,如下图所示:

    网址映射到后端服务的示意图

    要创建网址映射,请运行以下命令,其中:

    • URL_MAP_NAME 是要创建的网址映射的名称。
    • BACKEND_SERVICE_NAME 是后端服务的名称。
    gcloud compute url-maps create URL_MAP_NAME \
      --default-service BACKEND_SERVICE_NAME

    例如:

    gcloud compute url-maps create api-gateway-url-map \
      --default-service api-gateway-backend-service

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

    例如:

    gcloud compute url-maps add-path-matcher api-gateway-url-map \
      --path-matcher-name=my-pm2  \
      --default-service=my-host-default-backend \
      --path-rules="/video=video-service,/video/*=video-service" \
      --new-hosts my-hosts.com
    gcloud compute url-maps add-host-rule api-gateway-url-map \
      --hosts=my-app-domain \
      --path-matcher-name=my-app-path-matcher

    如需详细了解主机规则和路径匹配器,请参阅网址映射文档。

  4. 为目标代理创建 SSL 证书,如下图所示:

    目标代理的 SSL 证书示意图

    如需创建 HTTP(S) 负载均衡器,HTTP(S) 目标代理需要一个 SSL 证书资源。您可以使用 Google 管理的 SSL 证书或自行管理的 SSL 证书创建 SSL 证书资源。建议使用 Google 管理的证书。如果您在没有 SSL 证书资源的情况下测试此流程,并且希望设置 HTTP 负载均衡器,则可以跳过此步骤。

    如需创建 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
  5. 创建目标 HTTP(S) 代理以将请求路由到您的网址映射,如下图所示:

    图中显示从 HTTP 代理到网址映射

    如需创建目标代理,请使用以下命令,其中:

    • TARGET_HTTPS_PROXY_NAME 是要创建的目标 HTTP(S) 代理的名称。
    • URL_MAP_NAME 是上一步中创建的网址映射的名称。
    • 可选:SSL_CERT_NAME 是创建的 SSL 证书的名称。
    gcloud compute target-https-proxies create TARGET_HTTPS_PROXY_NAME \
      --ssl-certificates=SSL_CERT_NAME \
      --url-map=URL_MAP_NAME

    例如:

    gcloud compute target-https-proxies create api-gateway-https-proxy \
      --ssl-certificates=hello-cert \
      --url-map=api-gateway-url-map

    如上所述,您可以在不创建 SSL 证书资源的情况下创建 HTTP 负载均衡器。为此,请使用以下命令:

    gcloud compute target-http-proxies create TARGET_HTTP_PROXY_NAME \
          --url-map=URL_MAP_NAME

    例如:

    gcloud compute target-http-proxies create api-gateway-http-proxy \
      --url-map=api-gateway-url-map

    针对 HTTP 代理的后续命令应进行修改,以适应 --target-http-proxy 标志以及您TARGET_HTTP_PROXY_NAME针对其 HTTP(S) 对应方的命令。

  6. 创建转发规则以将传入的请求路由到相应代理,如下图所示:

    图中显示从转发规则到 HTTP 代理

    使用以下命令创建转发规则,其中:

    • HTTPS_FORWARDING_RULE_NAME 是要创建的规则的名称。
    • TARGET_HTTPS_PROXY_NAME 是 HTTP(S) 目标代理的名称。
    gcloud compute forwarding-rules create HTTPS_FORWARDING_RULE_NAME \
      --target-https-proxy=TARGET_HTTPS_PROXY_NAME \
      --global \
      --ports=443

    例如:

    gcloud compute forwarding-rules create my-fw \
      --target-https-proxy=api-gateway-https-proxy \
      --global \
      --ports=443

使用负载均衡器 IP 地址更新 DNS 记录

如果您有自定义网域,则需要执行此步骤来设置网域的 DNS 设置,以指向服务的新 IP 地址。如果您使用 Google 管理的证书(需要网域)创建 HTTP(S) 负载均衡器,也必须执行此步骤。与 DNS 搭配使用时,建议分配和使用静态 IP 地址。此步骤的具体说明取决于您的 DNS 提供商。

  1. 为了将流量发送到负载均衡器,您的网域的 DNS 记录(在本教程中为 my-app-domain)必须指向负载均衡器的 IP 地址。

    如需查找全局转发规则的 IP 地址,请使用以下命令:

    gcloud compute forwarding-rules list
  2. 更新网域的 DNS A 或 AAAA 记录以指向负载均衡器的 IP 地址,以便改为通过负载均衡器路由发送到现有自定义网域网址的流量。DNS 可能需要短则几秒钟,长则几小时的时间才能将此项更改传播到 DNS 服务器。

  3. 测试以确认您的网关是否使用 curl 或访问浏览器中的网址接收流量。例如:https://my-app-domain

    测试后,您应该会看到 Cloud Run 服务生成的响应。例如,这可能是“Hello World”HTML 页面,或者是由后端服务直接生成的其他预期响应。这意味着您的请求正在经过负载均衡器,并且后端服务正在指示负载均衡器将其发送到网关。

测试负载均衡器配置

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

如需查找全局转发规则的 IP 地址,请使用以下命令:

gcloud compute forwarding-rules list

通过 curl 命令测试您的服务的各个网址的响应。例如:

curl https://HOST_URL/hello/
curl https://HOST_URL

您可以使用 API Gateway Cloud 控制台验证请求是否到达正确的服务。

恭喜!您已成功为 API Gateway 预览版配置 HTTP(S) 负载均衡。

清理

为避免系统因本快速入门中使用的资源向您的 Google Cloud 账号收取费用,您可以删除您创建的 Cloud Load Balancing 资源。如果这些资源是在其自己的项目中创建的,则您可以删除整个项目。否则,您可以逐个删除这些资源。

删除项目

运行以下命令,将 PROJECT_ID 替换为您的项目 ID:

gcloud projects delete PROJECT_ID

删除各个资源

删除负载均衡器中的每个组件:

  1. 删除转发规则:

    gcloud compute forwarding-rules delete HTTPS_FORWARDING_RULE_NAME --global
  2. 删除全局外部 IP 地址:

    gcloud compute addresses delete IP_ADDRESSES --global
  3. 删除目标代理:

    gcloud compute target-https-proxies delete TARGET_HTTP_PROXY_NAME
  4. 删除网址映射:

    gcloud compute url-maps delete URL_MAP_NAME
  5. 删除后端服务:

    gcloud compute backend-services delete BACKEND_SERVICE_NAME --global
  6. (可选)删除 SSL 证书:

    gcloud compute ssl-certificates delete SSL_CERTIFICATE_NAME

删除无服务器 NEG:

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