处理来自多个地区的流量

如需更快地响应面向全球用户的响应,您需要在多个地区部署服务,并将用户路由到最近的地区。

但是,Cloud Run(全代管式)服务会部署到各个地区,并且要将用户路由到服务的不同地区,您需要配置外部 HTTP(S) 负载平衡

本指南介绍了如何通过由代管式 TLS 证书保护的网域配置外部 HTTP(S) 负载平衡器,该负载平衡器指向一个全球任播 IP 地址(用于将用户路由到已部署您的服务的最近 Google 数据中心)。

前期准备

创建负载平衡器

创建外部负载平衡器涉及创建各种网络资源并将它们连接在一起,如以下说明中所示。

命令行

  1. 预留静态 IP 地址,这样您就无需在重新创建负载平衡器时更新 DNS 记录。
    gcloud compute addresses create --global SERVICE_IP
    在上述命令中,将 SERVICE_IP 替换为 IP 地址资源的名称(例如 myservice-ip)。

    此 IP 地址是一个全球任播 IPv4 地址,可路由到 Google 数据中心或离访问者最近的接入点。

  2. 创建后端服务。
    gcloud compute backend-services create --global BACKEND_NAME

    在上述命令中,将 BACKEND_NAME 替换为您要提供给后端服务的名称(例如 myservice-backend)。

  3. 创建网址映射。
    gcloud compute url-maps create URLMAP_NAME --default-service=BACKEND_NAME

    URLMAP_NAME 替换为您要提供给网址映射的名称(例如 myservice-urlmap)。

  4. 为您的网域创建代管式 TLS 证书,以处理 HTTPS 流量。(将 example.com 替换为您的域名。)
    gcloud beta compute ssl-certificates create CERT_NAME \
      --domains=example.com

    CERT_NAME 替换为您希望代管式 SSL 证书具有的名称(例如 myservice-cert)。

  5. 创建一个目标 HTTPS 代理。
    gcloud compute target-https-proxies create HTTPS_PROXY_NAME \
      --ssl-certificates=CERT_NAME \
      --url-map=URLMAP_NAME

    HTTPS_PROXY_NAME 替换为您要提供给目标 HTTPS 代理的名称(例如 myservice-https)。

  6. 创建一条转发规则,将您创建的网络资源连接到 IP 地址。
    gcloud compute forwarding-rules create --global FORWARDING_RULE_NAME \
      --target-https-proxy=HTTPS_PROXY_NAME \
      --address=SERVICE_IP \
      --ports=443

    FORWARDING_RULE_NAME 替换为您要创建的转发规则资源的名称(例如 myservice-lb)。

部署到多个区域

将您的 Service 部署可用的 Cloud Run(全代管式)地区。为了便于管理,您可以在多个地区中使用相同的服务名称。

  1. 选择要在其中提供服务的地区

  2. 将 Cloud Run 服务部署到各个地区。

      gcloud run deploy SERVICE_NAME \
          --platform=managed \
          --allow-unauthenticated \
          --image=IMAGE_URL \
          --region=REGION
    

    执行以下变量替换操作:

    • REGION 替换为您要用作部署目标的其中一个地区。
    • SERVICE_NAME 替换为您的服务名称。在多个区域中使用相同的服务名称可让您更轻松地跟踪多区域部署。
    • IMAGE_URL 替换为对容器映像的引用,例如 gcr.io/myproject/my-image:latest
  3. 对每个区域重复执行上述步骤。

Cloud Run 位置

Cloud Run 是地区级的,这意味着运行 Cloud Run 服务的基础架构位于特定地区,并且由 Google 代管,以便在该地区内的所有区域以冗余方式提供。

选择用于运行 Cloud Run 服务的地区时,主要考虑该地区能否满足您的延迟时间、可用性或耐用性要求。通常,您可以选择距离用户最近的地区,但除此之外,您还应该考虑 Cloud Run 服务使用的其他 Google Cloud 产品的位置。跨多个位置使用 Google Cloud 产品可能会影响服务的延迟时间和费用。

Cloud Run 可在以下地区使用:

基于层级 1 价格

  • asia-east1(台湾)
  • asia-northeast1(东京)
  • asia-northeast2(大阪)
  • europe-north1(芬兰)
  • europe-west1(比利时)
  • europe-west4(荷兰)
  • us-central1(爱荷华)
  • us-east1(南卡罗来纳)
  • us-east4(北弗吉尼亚)
  • us-west1(俄勒冈)

基于层级 2 价格

  • asia-east2(香港)
  • asia-northeast3(韩国首尔)
  • asia-southeast1(新加坡)
  • asia-southeast2 (雅加达)
  • asia-south1(印度孟买)
  • australia-southeast1(悉尼)
  • europe-west2(英国伦敦)
  • europe-west3(德国法兰克福)
  • europe-west6(瑞士苏黎世)
  • northamerica-northeast1(蒙特利尔)
  • southamerica-east1(巴西圣保罗)

如果您已创建 Cloud Run 服务,则可以在 Cloud Console 的 Cloud Run 信息中心查看相应的地区。

配置地区性后端

对于您在上一步中部署的每个地区,您需要创建无服务器网络端点组 (NEG),并按照以下说明将其添加到后端服务:

  1. REGION 中为 Cloud Run(全代管式)服务创建网络端点组:

    gcloud beta compute network-endpoint-groups create NEG_NAME \
        --region=REGION \
        --network-endpoint-type=SERVERLESS \
        --cloud-run-service=SERVICE_NAME 

    在上述命令中,进行如下替换:

    • NEG_NAME 替换为网络端点组资源的名称。(例如 myservice-neg-uscentral1
    • REGION 替换为部署服务的地区
    • SERVICE_NAME 替换为您的服务名称。
  2. 将网络端点组添加到后端服务:

    gcloud beta compute backend-services add-backend --global BACKEND_NAME \
        --network-endpoint-group-region=REGION \
        --network-endpoint-group=NEG_NAME

    指定您在上一步为该地区创建的 NEG_NAME

  3. 对每个地区重复上述步骤。

在您的网域中配置 DNS 记录

如需将域名指向您创建的转发规则,您需要使用您创建的 IP 地址更新其 DNS 记录。

  1. 通过运行以下命令查找负载平衡器的预留 IP 地址:

      gcloud compute addresses describe --global SERVICE_IP --format='value(address)'

    SERVICE_IP 替换为您之前创建的 IP 地址的名称。此命令会将 IP 地址输出到输出内容中。

  2. 使用此 IP 地址添加 A 记录,以更新网域的 DNS 记录。

等待负载平衡器预配

使用负载平衡器 IP 地址配置网域后,您需要等待 DNS 记录传播。同样,您需要等待一段时间,让系统为您的网域颁发代管式 TLS 证书,并且代管式 TLS 证书准备好开始在全球范围内提供 HTTPS 流量。

负载平衡器最多可能需要 30 分钟才能开始处理流量。

准备就绪后,请访问前缀为 https:// 的网址,试一试。

验证状态

  1. 如需检查您的 DNS 记录传播的状态,请使用 dig 命令行实用程序:

    dig A +short example.com

    输出应显示您在 DNS 记录中配置的 IP 地址。

  2. 检查代管式证书颁发的状态,运行以下命令:

    gcloud beta compute ssl-certificates describe CERT_NAME

    CERT_NAME 替换为您之前为 SSL 证书资源选择的名称。

    输出内容应显示包含 status: ACTIVE 的行。

设置从 HTTP 到 HTTPS 的重定向

默认情况下,转发规则仅处理单个协议,因此向 http:// 端点发出的请求将返回 404 Not Found 响应。如果您需要将对 http:// 网址的请求重定向到 https:// 协议,则需要按照以下说明创建额外的网址映射和转发规则:

  1. 使用重定向规则创建网址映射。

    gcloud compute url-maps import HTTP_URLMAP_NAME \
        --global \
        --source /dev/stdin <<EOF
    name: HTTP_URLMAP_NAME
    defaultUrlRedirect:
      redirectResponseCode: MOVED_PERMANENTLY_DEFAULT
      httpsRedirect: True
    EOF

    HTTP_URLMAP_NAME 替换为您将创建的网址映射资源的名称(例如 myservice-httpredirect)。

  2. 使用网址映射创建目标 HTTP 代理。

    gcloud compute target-http-proxies create HTTP_PROXY_NAME \
      --url-map=HTTP_URLMAP_NAME

    HTTP_PROXY_NAME 替换为您将创建的目标 HTTP 代理的名称(例如 myservice-http)。

  3. 在端口 80 上使用相同的预留 IP 地址创建转发规则。

    gcloud compute forwarding-rules create --global HTTP_FORWARDING_RULE_NAME \
      --target-http-proxy=HTTP_PROXY_NAME \
      --address=SERVICE_IP \
      --ports=80
    

    HTTP_FORWARDING_RULE_NAME 替换为您将创建的新转发规则的名称(例如 myservice-httplb)。