在共享 VPC 环境中使用 Cloud Storage 存储分区设置跨区域内部应用负载平衡器

本文档展示了在共享 VPC 环境中设置具有 Cloud Storage 存储分区的跨区域内部应用负载平衡器的两种示例配置:

  • 第一个示例是在一个服务项目中创建所有负载均衡器组件和后端。
  • 第二个示例是在一个服务项目中创建负载均衡器的前端组件和网址映射,而在其他服务项目中创建负载均衡器的后端存储桶和 Cloud Storage 存储桶。

这两个示例都需要相同的初始配置来授予所需角色设置共享 VPC,然后才能开始创建负载平衡器。

除了本文档中上述示例配置之外,您还可以设置共享 VPC 部署,其中负载平衡器的前端和网址映射在宿主项目中创建,后端存储分区以及 Cloud Storage 存储分区在服务项目中创建。如需详细了解其他有效的共享 VPC 架构,请参阅共享 VPC 架构

如果您不想使用共享 VPC 网络,请参阅使用 Cloud Storage 存储分区设置跨区域内部应用负载平衡器

准备工作

确保您的设置符合以下前提条件。

创建 Google Cloud 项目

为一个宿主项目和两个服务项目创建 Google Cloud 项目

所需的角色

如需获得在具有 Cloud Storage 存储分区的共享 VPC 环境中设置区域级外部应用负载平衡器所需的权限,请让您的管理员为您授予以下 IAM 角色:

如需详细了解如何授予角色,请参阅管理对项目、文件夹和组织的访问权限

您也可以通过自定义角色或其他预定义角色来获取所需的权限。

设置共享 VPC 环境

宿主项目中完成以下步骤,以设置共享 VPC 环境:

  1. 为负载均衡器的转发规则配置子网
  2. 配置代理专用子网
  3. 配置防火墙规则
  4. 在宿主项目中设置共享 VPC

您无需在每次创建新负载均衡器时都执行本部分中的步骤。但是,在继续创建负载均衡器之前,您必须确保可以访问此处所述的资源。

宿主项目使用以下 VPC 网络、区域和子网:

  • 网络。网络是名为 lb-network自定义模式 VPC 网络

  • 负载均衡器的子网us-east1 区域中名为 subnet-us 的子网使用 10.1.2.0/24 作为其主要 IP 范围。asia-east1 区域中名为 subnet-asia 的子网使用 10.1.3.0/24 作为其主要 IP 范围。

  • Envoy 代理的子网us-east1 区域中名为 proxy-only-subnet-us-east1 的子网使用 10.129.0.0/23 作为其主要 IP 范围。asia-east1 区域中名为 proxy-only-subnet-asia-east1 的子网使用 10.130.0.0/23 作为其主要 IP 范围。

为负载均衡器的转发规则配置子网

控制台

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

    进入 VPC 网络页面

  2. 点击创建 VPC 网络

  3. 对于名称,输入 lb-network

  4. 子网部分中,为子网创建模式选择自定义

  5. 新子网部分中,输入以下信息:

    • 名称subnet-us
    • 选择区域us-east1
    • IP 地址范围10.1.2.0/24
  6. 点击完成

  7. 点击添加子网

  8. 在其他区域为负载均衡器的转发规则创建另一个子网。在新子网部分中,输入以下信息:

    • 名称subnet-asia
    • 区域asia-east1
    • IP 地址范围10.1.3.0/24
  9. 点击完成

  10. 点击创建

gcloud

  1. 使用 gcloud compute networks create 命令创建一个名为 lb-network 的自定义 VPC 网络。

    gcloud compute networks create lb-network \
        --subnet-mode=custom \
        --project=HOST_PROJECT_ID
    
  2. 使用 gcloud compute networks subnets create 命令us-east1 区域的 lb-network VPC 网络中创建一个名为 subnet-us 的子网。

    gcloud compute networks subnets create subnet-us \
        --network=lb-network \
        --range=10.1.2.0/24 \
        --region=us-east1 \
        --project=HOST_PROJECT_ID
    
  3. 使用 gcloud compute networks subnets create 命令asia-east1 区域的 lb-network VPC 网络中创建一个名为 subnet-asia 的子网。

    gcloud compute networks subnets create subnet-asia \
        --network=lb-network \
        --range=10.1.3.0/24 \
        --region=asia-east1 \
        --project=HOST_PROJECT_ID
    

    HOST_PROJECT_ID 替换为Google Cloud 已在共享 VPC 环境中启用为宿主项目的项目所分配的项目 ID。

配置代理专用子网

代理专用子网提供了一组 IP 地址,供 Google Cloud 用于代表您运行 Envoy 代理。代理会终结来自客户端的连接并创建与后端的新连接。

此代理专用子网用于与 VPC 网络位于同一区域的所有基于 Envoy 的区域级负载均衡器。在每个网络中,每个区域只能有一个活跃代理专用子网用于给定用途。在此示例中,我们创建两个代理专用子网,一个位于 us-east1 区域,另一个位于 asia-east1 区域。

控制台

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

    进入 VPC 网络页面

  2. 点击您创建的 VPC 网络的名称。

  3. 子网标签页中,点击添加子网

  4. 请输入以下信息:

    • 对于名称,输入 proxy-only-subnet-us
    • 对于区域,输入 us-east1
    • 对于用途,选择跨区域托管式代理
    • 对于 IP 地址范围,输入 10.129.0.0/23
  5. 点击添加

  6. asia-east1 区域中创建另一个代理专用子网。 在子网标签页中,点击添加子网

  7. 请输入以下信息:

    • 对于名称,输入 proxy-only-subnet-asia
    • 对于区域,输入 asia-east1
    • 对于用途,选择跨区域托管式代理
    • 对于 IP 地址范围,输入 10.130.0.0/23
  8. 点击添加

gcloud

  1. 使用 gcloud compute networks subnets create 命令us-east1 区域中创建代理专用子网。

    在此示例中,代理专用子网名为 proxy-only-subnet-us

    gcloud compute networks subnets create proxy-only-subnet-us \
        --purpose=GLOBAL_MANAGED_PROXY \
        --role=ACTIVE \
        --region=us-east1 \
        --network=lb-network \
        --range=10.129.0.0/23 \
        --project=HOST_PROJECT_ID
    
  2. 使用 gcloud compute networks subnets create 命令asia-east1 区域中创建代理专用子网。

    在此示例中,代理专用子网名为 proxy-only-subnet-asia

    gcloud compute networks subnets create proxy-only-subnet-asia \
        --purpose=GLOBAL_MANAGED_PROXY \
        --role=ACTIVE \
        --region=asia-east1 \
        --network=lb-network \
        --range=10.130.0.0/23 \
        --project=HOST_PROJECT_ID
    

    HOST_PROJECT_ID 替换为分配给宿主项目的Google Cloud 项目 ID。

配置防火墙规则

此示例使用入站防火墙规则,允许通过端口 22 进行 SSH 访问客户端虚拟机。在此示例中,此防火墙规则名为 fw-allow-ssh

控制台

  1. 在 Google Cloud 控制台中,前往防火墙政策页面。

    转到“防火墙政策”

  2. 点击创建防火墙规则,以创建允许在客户端虚拟机上进行传入 SSH 连接的规则:

    • 名称fw-allow-ssh
    • 网络lb-network
    • 流量方向入站
    • 匹配时执行的操作允许
    • 目标指定的目标标记
    • 目标标记allow-ssh
    • 来源过滤条件IPv4 范围
    • 来源 IPv4 范围0.0.0.0/0
    • 协议和端口
      • 选择指定的协议和端口
      • 选中 TCP 复选框,然后输入 22 作为端口号。
  3. 点击创建

gcloud

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

    在此示例中,防火墙规则名为 fw-allow-ssh

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

    HOST_PROJECT_ID 替换为分配给宿主项目的Google Cloud 项目 ID。

在宿主项目中设置共享 VPC

您可以启用共享 VPC 宿主项目、共享宿主项目的子网,并将服务项目关联到宿主项目,以便服务项目可以使用共享 VPC 网络。如需在宿主项目中设置共享 VPC,请参阅以下页面:

完成上述步骤后,您可以采用以下任意一项设置:

在服务项目中配置负载均衡器

此示例会创建一个跨区域内部应用负载均衡器,其中所有负载均衡组件(转发规则、目标代理、网址映射和后端存储桶)和 Cloud Storage 存储桶都在服务项目中创建。

负载均衡器的网络资源(例如 VPC 子网、代理专用子网和防火墙规则)是在宿主项目中创建的。

图 1. 在具有 Cloud Storage 存储分区的共享 VPC 环境中设置跨区域内部应用负载平衡器
图 1. 共享 VPC 环境中具有 Cloud Storage 存储分区的跨区域内部应用负载平衡器

本部分介绍如何设置负载均衡器和后端。

此页面上的示例设置明确为负载均衡器的转发规则配置预留 IP 地址,而不是允许分配临时 IP 地址。我们建议的最佳实践是,为转发规则预留 IP 地址。

配置 Cloud Storage 存储桶

配置 Cloud Storage 存储桶的过程如下所示:

  1. 创建 Cloud Storage 存储分区
  2. 将内容复制到 Cloud Storage 存储分区
  3. 将 Cloud Storage 存储分区设为可公开访问

创建 Cloud Storage 存储桶

在此示例中,您将创建两个 Cloud Storage 存储分区:一个在 us-east1 区域,另一个在 asia-east1 区域。对于生产部署,我们建议您选择一个多区域存储桶,该存储桶会自动跨多个 Google Cloud 区域复制对象。这可以提高内容的可用性,并提高应用的故障容忍度。

控制台

  1. 在 Google Cloud 控制台中,转到 Cloud Storage 存储桶页面。

    进入“存储桶”

  2. 点击 创建

  3. 开始使用部分中,输入遵循命名准则的全局唯一名称。

  4. 点击选择数据存储位置

  5. 位置类型设置为区域

  6. 从区域列表中选择 us-east1

  7. 点击创建

  8. 点击存储桶以返回“Cloud Storage 存储桶”页面。按照上述说明创建第二个存储桶,但将位置设置为 asia-east1

gcloud

  1. 使用 gcloud storage buckets create 命令us-east1 区域中创建第一个存储桶。

    gcloud storage buckets create gs://BUCKET1_NAME \
        --default-storage-class=standard \
        --location=us-east1 \
        --uniform-bucket-level-access \
        --project=SERVICE_PROJECT_ID
    
  2. 使用 gcloud storage buckets create 命令asia-east1 区域中创建第二个存储桶。

    gcloud storage buckets create gs://BUCKET2_NAME \
        --default-storage-class=standard \
        --location=asia-east1 \
        --uniform-bucket-level-access \
        --project=SERVICE_PROJECT_ID
    

    替换以下内容:

    • BUCKET1_NAMEBUCKET2_NAME: Cloud Storage 存储桶名称

    • SERVICE_PROJECT_ID:分配给服务项目的 Google Cloud 项目 ID

将内容复制到 Cloud Storage 存储分区

如需填充 Cloud Storage 存储桶,请将图形文件从公共 Cloud Storage 存储桶复制到您自己的 Cloud Storage 存储桶。

在 Cloud Shell 中运行以下命令,将存储桶名称变量替换为您的唯一 Cloud Storage 存储桶名称:

  gcloud storage cp gs://gcp-external-http-lb-with-bucket/three-cats.jpg gs://BUCKET1_NAME/love-to-purr/
  
  gcloud storage cp gs://gcp-external-http-lb-with-bucket/two-dogs.jpg gs://BUCKET2_NAME/love-to-fetch/
  

BUCKET1_NAMEBUCKET2_NAME 替换为 Cloud Storage 存储桶名称。

将 Cloud Storage 存储分区设为可公开访问

如需将存储桶中的所有对象设为可供公共互联网上的所有人读取,请为主账号 allUsers 授予 Storage Object Viewer 角色 (roles/storage.objectViewer)。

控制台

要授予所有用户查看存储桶中对象的权限,请对每个存储桶重复执行以下过程:

  1. 在 Google Cloud 控制台中,转到 Cloud Storage 存储桶页面。

    进入“存储桶”

  2. 在存储桶列表中,点击您要设为公开的存储桶的名称。

  3. 选择权限标签页。

  4. 权限部分中,点击 授予访问权限按钮。 系统会显示授予访问权限对话框。

  5. 新的主账号字段中,输入 allUsers

  6. 选择角色字段的过滤条件框中输入 Storage Object Viewer,然后从过滤后的结果中选择 Storage Object Viewer

  7. 点击保存

  8. 点击允许公开访问

gcloud

如需授予所有用户查看存储分区中对象的权限,请运行 gcloud storage buckets add-iam-policy-binding 命令

gcloud storage buckets add-iam-policy-binding gs://BUCKET1_NAME --member=allUsers --role=roles/storage.objectViewer
gcloud storage buckets add-iam-policy-binding gs://BUCKET2_NAME --member=allUsers --role=roles/storage.objectViewer

BUCKET1_NAMEBUCKET2_NAME 替换为 Cloud Storage 存储桶名称。

预留负载均衡器的 IP 地址

为以下资源预留静态内部 IP 地址:

  • us-east1 区域中的转发规则
  • asia-east1 区域中的转发规则

控制台

  1. 在 Google Cloud 控制台中,前往 IP 地址页面。

    进入“预留静态地址”

  2. 点击预留内部

  3. 名称部分,输入新地址的名称。

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

  5. 点击预留以预留该 IP 地址。

  6. 再次按照这些步骤在 asia-east1 区域中预留 IP 地址。

gcloud

  1. 如需在 us-east1 区域中预留静态内部 IP 地址,请使用 gcloud compute addresses create 命令

    gcloud compute addresses create ADDRESS1_NAME  \
       --region=us-east1 \
       --subnet=projects/HOST_PROJECT_ID/regions/us-east1/subnetworks/subnet-us \
       --project=SERVICE_PROJECT_ID
    

    替换以下内容:

    • ADDRESS1_NAME:您要为此 IP 地址分配的名称
    • HOST_PROJECT_ID:分配给宿主项目的 Google Cloud 项目 ID
    • SERVICE_PROJECT_ID:分配给服务项目的 Google Cloud 项目 ID
  2. 如需在 asia-east1 区域中预留静态内部 IP 地址,请使用 gcloud compute addresses create 命令

    gcloud compute addresses create ADDRESS2_NAME  \
       --region=asia-east1 \
       --subnet=projects/HOST_PROJECT_ID/regions/asia-east1/subnetworks/subnet-asia \
       --project=SERVICE_PROJECT_ID
    

    替换以下内容:

    • ADDRESS2_NAME:您要为此 IP 地址分配的名称
    • HOST_PROJECT_ID:分配给宿主项目的 Google Cloud 项目 ID
    • SERVICE_PROJECT_ID:分配给服务项目的 Google Cloud 项目 ID
  3. 使用 gcloud compute addresses describe 命令可以查看结果:

    gcloud compute addresses describe ADDRESS1_NAME \
       --project=SERVICE_PROJECT_ID
    
    gcloud compute addresses describe ADDRESS2_NAME \
       --project=SERVICE_PROJECT_ID
    

    替换以下内容:

    • ADDRESS1_NAMEADDRESS2_NAME:您为 IP 地址分配的名称
    • SERVICE_PROJECT_ID:分配给服务项目的 Google Cloud 项目 ID

    返回的 IP 地址在以下部分中称为 RESERVED_IP_ADDRESS

设置 SSL 证书资源

对于使用 HTTPS 作为请求和响应协议的跨区域内部应用负载均衡器,请按照以下其中一个文档中的说明使用 Certificate Manager 创建 SSL 证书资源:

创建证书后,您可以将证书附加到 HTTPS 目标代理。

我们建议您使用 Google 管理的证书。

使用后端存储桶配置负载均衡器

本部分介绍了如何为跨区域内部应用负载均衡器创建以下资源:

在此示例中,您可以使用 HTTP 或 HTTPS 作为客户端与负载均衡器之间的请求和响应协议。如需创建 HTTPS 负载均衡器,您必须向该负载均衡器的前端添加 SSL 证书资源。

如需使用 gcloud CLI 创建上述负载均衡组件,请按照以下步骤操作:

  1. 使用 gcloud compute backend-buckets create 命令创建两个后端存储分区,每个 Cloud Storage 存储桶一个。 后端存储桶的负载均衡方案为 INTERNAL_MANAGED

    在此示例中,后端存储分区的名称为 backend-bucket-catsbackend-bucket-dogs,表示 Cloud Storage 存储分区中的内容。

    gcloud compute backend-buckets create backend-bucket-cats \
        --gcs-bucket-name=BUCKET1_NAME \
        --load-balancing-scheme=INTERNAL_MANAGED \
        --project=SERVICE_PROJECT_ID
    
    gcloud compute backend-buckets create backend-bucket-dogs \
        --gcs-bucket-name=BUCKET2_NAME \
        --load-balancing-scheme=INTERNAL_MANAGED \
        --project=SERVICE_PROJECT_ID
    

    替换以下内容:

    • BUCKET1_NAMEBUCKET2_NAME: Cloud Storage 存储桶名称

    • SERVICE_PROJECT_ID:分配给服务项目的 Google Cloud 项目 ID

  2. 使用 gcloud compute url-maps create 命令创建网址映射,以将传入请求路由到后端存储桶。

    在此示例中,网址映射的名称为 lb-map

    gcloud compute url-maps create lb-map \
        --default-backend-bucket=backend-bucket-cats \
        --global \
        --project=SERVICE_PROJECT_ID
    

    SERVICE_PROJECT_ID 替换为分配给服务项目的Google Cloud 项目 ID。

  3. 使用 gcloud compute url-maps add-path-matcher 命令配置网址映射的主机和路径规则。

    在此示例中,默认后端存储桶为 backend-bucket-cats,它会处理其中存在的所有路径。不过,任何以 http://FORWARDING_RULE_IP_ADDRESS/love-to-fetch/two-dogs.jpg 为目标的请求都会使用 backend-bucket-dogs 后端。例如,如果默认后端 (backend-bucket-cats) 中也存在 /love-to-fetch/ 文件夹,负载均衡器会优先使用 backend-bucket-dogs 后端,因为 /love-to-fetch/* 有特定的路径规则。

    gcloud compute url-maps add-path-matcher lb-map \
        --path-matcher-name=path-matcher-pets \
        --new-hosts=* \
        --backend-bucket-path-rules="/love-to-fetch/*=backend-bucket-dogs" \
        --default-backend-bucket=backend-bucket-cats
        --project=SERVICE_PROJECT_ID
    

    SERVICE_PROJECT_ID 替换为分配给服务项目的Google Cloud 项目 ID。

  4. 使用 gcloud compute target-http-proxies create 命令创建目标代理。

    对于 HTTP 流量,请创建一个名为 http-proxy 的目标 HTTP 代理,以将请求路由到网址映射:

    gcloud compute target-http-proxies create http-proxy \
        --url-map=lb-map \
        --global \
        --project=SERVICE_PROJECT_ID
    

    SERVICE_PROJECT_ID 替换为分配给服务项目的Google Cloud 项目 ID。

    对于 HTTPS 流量,请创建名为 https-proxy 的目标 HTTPS 代理,以将请求路由到网址映射。该代理属于负载均衡器,包含用于 HTTPS 负载均衡器的 SSL 证书。创建证书后,您可以将该证书附加到 HTTPS 目标代理。

    gcloud compute target-https-proxies create https-proxy \
        --url-map=lb-map \
        --certificate-manager-certificates=CERTIFICATE_NAME \
        --global \
        --project=SERVICE_PROJECT_ID
    

    替换以下内容:

  5. 使用 gcloud compute forwarding-rules create 命令创建两条全球转发规则:一条规则使用 us-east1 区域中的 IP 地址,另一条规则使用 asia-east1 区域中的 IP 地址。

    对于 HTTP 流量,请创建全球转发规则(http-fw-rule-1http-fw-rule-2)以将传入请求路由到 HTTP 目标代理:

    gcloud compute forwarding-rules create http-fw-rule-1 \
        --load-balancing-scheme=INTERNAL_MANAGED \
        --network=projects/HOST_PROJECT_ID/global/networks/lb-network \
        --subnet=projects/HOST_PROJECT_ID/regions/us-east1/subnetworks/subnet-us \
        --subnet-region=us-east1 \
        --address=RESERVED_IP_ADDRESS \
        --ports=80 \
        --target-http-proxy=http-proxy \
        --global-target-http-proxy \
        --global \
        --project=SERVICE_PROJECT_ID
    
    gcloud compute forwarding-rules create http-fw-rule-2 \
        --load-balancing-scheme=INTERNAL_MANAGED \
        --network=projects/HOST_PROJECT_ID/global/networks/lb-network \
        --subnet=projects/HOST_PROJECT_ID/regions/asia-east1/subnetworks/subnet-asia \
        --subnet-region=asia-east1 \
        --address=RESERVED_IP_ADDRESS \
        --ports=80 \
        --target-http-proxy=http-proxy \
        --global-target-http-proxy \
        --global \
        --project=SERVICE_PROJECT_ID
    

    替换以下内容:

    • HOST_PROJECT_ID:分配给宿主项目的 Google Cloud 项目 ID
    • RESERVED_IP_ADDRESS:您预留的 IP 地址
    • SERVICE_PROJECT_ID:分配给服务项目的 Google Cloud 项目 ID

    对于 HTTPS 流量,请创建全球转发规则(https-fw-rule-1https-fw-rule-2)以将传入请求路由到 HTTPS 目标代理:

    gcloud compute forwarding-rules create https-fw-rule-1 \
        --load-balancing-scheme=INTERNAL_MANAGED \
        --network=projects/HOST_PROJECT_ID/global/networks/lb-network \
        --subnet=projects/HOST_PROJECT_ID/regions/us-east1/subnetworks/subnet-us \
        --subnet-region=us-east1 \
        --address=RESERVED_IP_ADDRESS \
        --ports=443 \
        --target-https-proxy=https-proxy \
        --global-target-https-proxy \
        --global \
        --project=SERVICE_PROJECT_ID
    
    gcloud compute forwarding-rules create https-fw-rule-2 \
        --load-balancing-scheme=INTERNAL_MANAGED \
        --network=projects/HOST_PROJECT_ID/global/networks/lb-network \
        --subnet=projects/HOST_PROJECT_ID/regions/asia-east1/subnetworks/subnet-asia \
        --subnet-region=asia-east1 \
        --address=RESERVED_IP_ADDRESS \
        --ports=443 \
        --target-https-proxy=https-proxy \
        --global-target-https-proxy \
        --global \
        --project=SERVICE_PROJECT_ID
    

    替换以下内容:

    • HOST_PROJECT_ID:分配给宿主项目的 Google Cloud 项目 ID
    • RESERVED_IP_ADDRESS:您预留的 IP 地址
    • SERVICE_PROJECT_ID:分配给服务项目的 Google Cloud 项目 ID

向负载均衡器发送 HTTP 请求

从内部客户端虚拟机向负载均衡器的转发规则发送请求。

获取负载均衡器转发规则的 IP 地址

如需获取负载均衡器转发规则的 IP 地址,请完成以下步骤:

  1. 获取负载均衡器转发规则 (http-fw-rule-1) 的 IP 地址,该 IP 地址位于 us-east1 区域。

    gcloud compute forwarding-rules describe http-fw-rule-1 \
        --global \
        --project=SERVICE_PROJECT_ID
    
  2. 获取负载均衡器转发规则 (http-fw-rule-2) 的 IP 地址,该 IP 地址位于 asia-east1 区域。

    gcloud compute forwarding-rules describe http-fw-rule-2 \
        --global \
        --project=SERVICE_PROJECT_ID
    

    SERVICE_PROJECT_ID 替换为分配给服务项目的Google Cloud 项目 ID。

    复制返回的 IP 地址,以便在后续步骤中用作 FORWARDING_RULE_IP_ADDRESS

创建客户端虚拟机以测试连接性

如需创建客户端虚拟机以测试连接性,请完成以下步骤:

  1. us-east1 区域中创建一个名为 client-a 的客户端虚拟机。

    gcloud compute instances create client-a \
        --image-family=debian-12 \
        --image-project=debian-cloud \
        --network=projects/HOST_PROJECT_ID/global/networks/lb-network \
        --subnet=projects/HOST_PROJECT_ID/regions/us-east1/subnetworks/subnet-us \
        --zone=us-east1-c \
        --tags=allow-ssh \
        --project=SERVICE_PROJECT_ID
    

    替换以下内容:

    • HOST_PROJECT_ID:分配给宿主项目的 Google Cloud 项目 ID
    • SERVICE_PROJECT_ID:分配给服务项目的 Google Cloud 项目 ID
  2. 建立与客户端虚拟机的 SSH 连接。

     gcloud compute ssh client-a \
         --zone=us-east1-c \
         --project=SERVICE_PROJECT_ID
    

    SERVICE_PROJECT_ID 替换为分配给服务项目的Google Cloud 项目 ID。

  3. 在此示例中,跨区域内部应用负载均衡器在 VPC 网络的 us-east1asia-east1 区域中都具有前端虚拟 IP 地址 (VIP)。使用 curl 向任一区域中的 VIP 发出 HTTP 请求。

    curl http://FORWARDING_RULE_IP_ADDRESS/love-to-fetch/two-dogs.jpg --output two-dogs.jpg
    
    curl http://FORWARDING_RULE_IP_ADDRESS/love-to-purr/three-cats.jpg --output three-cats.jpg
    

    FORWARDING_RULE_IP_ADDRESS 替换为负载均衡器转发规则的 IP 地址。

测试高可用性

如需测试高可用性,请完成以下步骤:

  1. 删除 us-east1 区域中的转发规则 (http-fw-rule-1) 以模拟区域级服务中断,并检查 us-east 区域中的客户端是否仍然可以从后端存储桶访问数据。

    gcloud compute forwarding-rules delete http-fw-rule-1 \
        --global \
        --project=SERVICE_PROJECT_ID
    

    SERVICE_PROJECT_ID 替换为分配给服务项目的Google Cloud 项目 ID。

  2. 使用 curl 向任一区域的转发规则的 VIP 发出 HTTP 请求。

    curl http://FORWARDING_RULE_IP_ADDRESS/love-to-fetch/two-dogs.jpg --output two-dogs.jpg
    
    curl http://FORWARDING_RULE_IP_ADDRESS/love-to-purr/three-cats.jpg --output three-cats.jpg
    

    FORWARDING_RULE_IP_ADDRESS 替换为转发规则的 IP 地址。

    如果您向 us-east1 区域中的 VIP 发出 HTTP 请求,DNS 路由政策会检测到该 VIP 没有响应,并向客户端返回下一个最佳 VIP(在此示例中为 asia-east1)。此行为有助于确保应用在区域级服务中断期间仍然正常运行。

配置具有跨项目配置的负载均衡器

本页面上的上一个示例展示了如何设置共享 VPC 部署,其中所有负载均衡器组件及其后端都在服务项目中创建。

借助跨区域内部应用负载平衡器,您还可以配置共享 VPC 部署,其中,一个宿主项目或服务项目中的网址映射可引用位于共享 VPC 环境中的多个服务项目的后端存储分区。

您可以参考本部分中的步骤来配置此处列出的任何受支持组合:

  • 宿主项目中的转发规则、目标代理和网址映射,以及服务项目中的后端存储桶
  • 服务项目中的转发规则、目标代理和网址映射,以及另一个服务项目中的后端存储桶

本部分将以第二种配置为例进行说明。

设置概览

此示例在两个不同的服务项目中配置负载均衡器及其前端和后端。

如果尚未执行此操作,您必须完成设置共享 VPC 的所有必要步骤,并配置此示例所需的网络、子网和防火墙规则。如需查看相关说明,请参阅本页面开头的以下部分:

图 2.不同服务项目中的负载均衡器前端和后端
图 2. 不同服务项目中的负载均衡器前端和后端

在服务项目 B 中配置 Cloud Storage 存储分区和后端存储分区

本部分中的所有步骤都必须在服务项目 B 中执行

如需创建后端存储桶,您需要执行以下操作:

  1. 创建 Cloud Storage 存储分区
  2. 将内容复制到 Cloud Storage 存储分区
  3. 将 Cloud Storage 存储分区设为可公开访问
  4. 创建后端存储分区并将其指向 Cloud Storage 存储分区

创建 Cloud Storage 存储桶

在此示例中,您将创建两个 Cloud Storage 存储分区:一个在 us-east1 区域,另一个在 asia-east1 区域。对于生产部署,我们建议您选择一个多区域存储桶,该存储桶会自动跨多个 Google Cloud 区域复制对象。这可以提高内容的可用性,并提高应用的故障容忍度。

控制台

  1. 在 Google Cloud 控制台中,转到 Cloud Storage 存储桶页面。

    进入“存储桶”

  2. 点击 创建

  3. 开始使用部分中,输入遵循命名准则的全局唯一名称。

  4. 点击选择数据存储位置

  5. 位置类型设置为区域

  6. 从区域列表中选择 us-east1

  7. 点击创建

  8. 点击存储桶以返回“Cloud Storage 存储桶”页面。按照上述说明创建第二个存储桶,但将位置设置为 asia-east1

gcloud

  1. 使用 gcloud storage buckets create 命令us-east1 区域中创建第一个存储桶。

    gcloud storage buckets create gs://BUCKET1_NAME \
        --default-storage-class=standard \
        --location=us-east1 \
        --uniform-bucket-level-access \
        --project=SERVICE_PROJECT_B_ID
    
  2. 使用 gcloud storage buckets create 命令asia-east1 区域中创建第二个存储桶。

    gcloud storage buckets create gs://BUCKET2_NAME \
        --default-storage-class=standard \
        --location=asia-east1 \
        --uniform-bucket-level-access \
        --project=SERVICE_PROJECT_B_ID
    

替换以下内容:

  • BUCKET1_NAMEBUCKET2_NAME:Cloud Storage 存储桶名称。

  • SERVICE_PROJECT_B_ID:分配给服务项目 B 的 Google Cloud 项目 ID。

将内容复制到 Cloud Storage 存储分区

如需填充 Cloud Storage 存储桶,请将图形文件从公共 Cloud Storage 存储桶复制到您自己的 Cloud Storage 存储桶。

在 Cloud Shell 中运行以下命令,将存储桶名称变量替换为您的唯一 Cloud Storage 存储桶名称:

  gcloud storage cp gs://gcp-external-http-lb-with-bucket/three-cats.jpg gs://BUCKET1_NAME/love-to-purr/
  
  gcloud storage cp gs://gcp-external-http-lb-with-bucket/two-dogs.jpg gs://BUCKET2_NAME/love-to-fetch/
  

BUCKET1_NAMEBUCKET2_NAME 替换为 Cloud Storage 存储桶名称。

将 Cloud Storage 存储分区设为可公开访问

如需将存储桶中的所有对象设为可供公共互联网上的所有人读取,请为主账号 allUsers 授予 Storage Object Viewer 角色 (roles/storage.objectViewer)。

控制台

要授予所有用户查看存储桶中对象的权限,请对每个存储桶重复执行以下过程:

  1. 在 Google Cloud 控制台中,转到 Cloud Storage 存储桶页面。

    进入“存储桶”

  2. 在存储桶列表中,点击您要设为公开的存储桶的名称。

  3. 选择权限标签页。

  4. 权限部分中,点击 授予访问权限按钮。 系统会显示授予访问权限对话框。

  5. 新的主账号字段中,输入 allUsers

  6. 选择角色字段的过滤条件框中输入 Storage Object Viewer,然后从过滤后的结果中选择 Storage Object Viewer

  7. 点击保存

  8. 点击允许公开访问

gcloud

如需授予所有用户查看存储桶中对象的权限,请运行 gcloud storage buckets add-iam-policy-binding 命令

gcloud storage buckets add-iam-policy-binding gs://BUCKET1_NAME --member=allUsers --role=roles/storage.objectViewer
gcloud storage buckets add-iam-policy-binding gs://BUCKET2_NAME --member=allUsers --role=roles/storage.objectViewer

BUCKET1_NAMEBUCKET2_NAME 替换为 Cloud Storage 存储桶名称。

使用后端存储桶配置负载均衡器

如需创建后端存储分区,请按以下步骤操作:

  1. 使用 gcloud compute backend-buckets create 命令创建两个后端存储桶,每个 Cloud Storage 存储桶一个。 后端存储桶的负载均衡方案为 INTERNAL_MANAGED

    在此示例中,后端存储分区的名称为 backend-bucket-catsbackend-bucket-dogs,表示 Cloud Storage 存储分区中的内容。

    gcloud compute backend-buckets create backend-bucket-cats \
        --gcs-bucket-name=BUCKET1_NAME \
        --load-balancing-scheme=INTERNAL_MANAGED \
        --project=SERVICE_PROJECT_B_ID
    
    gcloud compute backend-buckets create backend-bucket-dogs \
        --gcs-bucket-name=BUCKET2_NAME \
        --load-balancing-scheme=INTERNAL_MANAGED \
        --project=SERVICE_PROJECT_B_ID
    

    替换以下内容:

    • BUCKET1_NAMEBUCKET2_NAME:Cloud Storage 存储桶名称。

    • SERVICE_PROJECT_B_ID:分配给服务项目 B 的 Google Cloud 项目 ID。

在服务项目 A 中配置负载均衡器的前端组件

本部分中的所有步骤都必须在服务项目 A 中执行

在服务项目 A 中,您需要创建以下前端负载均衡组件:

  • 附加到目标代理的 SSL 证书资源。 您可以按照前一部分中概述的步骤创建 SSL 证书。
  • 负载均衡器的两个转发规则的两个 IP 地址。 您可以按照前一部分中列出的步骤为转发规则创建 IP 地址。
  • 引用服务项目 B 中的后端存储分区的网址映射
  • 目标代理
  • 两条转发规则,每条规则都具有区域级 IP 地址。

如需创建前端组件,请执行以下操作:

  1. 使用 gcloud compute url-maps create 命令创建网址映射,以将传入请求路由到后端存储桶。

    在此示例中,网址映射的名称为 lb-map

    gcloud compute url-maps create lb-map \
        --default-backend-bucket=projects/SERVICE_PROJECT_B_ID/global/backendBuckets/backend-bucket-cats \
        --global \
        --project=SERVICE_PROJECT_A_ID
    

    替换以下内容:

    • SERVICE_PROJECT_B_ID:分配给服务项目 B 的 Google Cloud 项目 ID

    • SERVICE_PROJECT_A_ID:分配给服务项目 A 的 Google Cloud 项目 ID

  2. 使用 gcloud compute url-maps add-path-matcher 命令配置网址映射的主机和路径规则。

    在此示例中,默认后端存储桶为 backend-bucket-cats,它会处理其中存在的所有路径。不过,任何以 http://FORWARDING_RULE_IP_ADDRESS/love-to-fetch/two-dogs.jpg 为目标的请求都会使用 backend-bucket-dogs 后端。例如,如果默认后端 (backend-bucket-cats) 中也存在 /love-to-fetch/ 文件夹,负载均衡器会优先使用 backend-bucket-dogs 后端,因为 /love-to-fetch/* 有特定的路径规则。

    gcloud compute url-maps add-path-matcher lb-map \
        --path-matcher-name=path-matcher-pets \
        --new-hosts=* \
        --backend-bucket-path-rules="/love-to-fetch/*=projects/SERVICE_PROJECT_B_ID/global/backendBuckets/backend-bucket-dogs" \
        --default-backend-bucket=projects/SERVICE_PROJECT_B_ID/global/backendBuckets/backend-bucket-cats \
        --project=SERVICE_PROJECT_A_ID
    

    替换以下内容:

    • SERVICE_PROJECT_B_ID:分配给服务项目 B 的 Google Cloud 项目 ID

    • SERVICE_PROJECT_A_ID:分配给服务项目 A 的 Google Cloud 项目 ID

  3. 使用 gcloud compute target-http-proxies create 命令创建目标代理。

    对于 HTTP 流量,请创建一个名为 http-proxy 的目标 HTTP 代理,以将请求路由到网址映射:

    gcloud compute target-http-proxies create http-proxy \
        --url-map=lb-map \
        --global \
        --project=SERVICE_PROJECT_A_ID
    

    SERVICE_PROJECT_A_ID 替换为分配给服务项目 A 的Google Cloud 项目 ID。

    对于 HTTPS 流量,请创建名为 https-proxy 的目标 HTTPS 代理,以将请求路由到网址映射。该代理属于负载均衡器,包含用于 HTTPS 负载均衡器的 SSL 证书。创建证书后,您可以将该证书附加到 HTTPS 目标代理。

    gcloud compute target-https-proxies create https-proxy \
        --url-map=lb-map \
        --certificate-manager-certificates=CERTIFICATE_NAME \
        --global \
        --project=SERVICE_PROJECT_A_ID
    

    替换以下内容:

  4. 使用 gcloud compute forwarding-rules create 命令创建两条全球转发规则:一条规则使用 us-east1 区域中的 IP 地址,另一条规则使用 asia-east1 区域中的 IP 地址。

    对于 HTTP 流量,请创建全球转发规则(http-fw-rule-1http-fw-rule-2)以将传入请求路由到 HTTP 目标代理:

      gcloud compute forwarding-rules create http-fw-rule-1 \
          --load-balancing-scheme=INTERNAL_MANAGED \
          --network=projects/HOST_PROJECT_ID/global/networks/lb-network \
          --subnet=projects/HOST_PROJECT_ID/regions/us-east1/subnetworks/subnet-us \
          --subnet-region=us-east1 \
          --address=RESERVED_IP_ADDRESS \
          --ports=80 \
          --target-http-proxy=http-proxy \
          --global-target-http-proxy \
          --global \
          --project=SERVICE_PROJECT_A_ID
    
      gcloud compute forwarding-rules create http-fw-rule-2 \
          --load-balancing-scheme=INTERNAL_MANAGED \
          --network=projects/HOST_PROJECT_ID/global/networks/lb-network \
          --subnet=projects/HOST_PROJECT_ID/regions/asia-east1/subnetworks/subnet-asia \
          --subnet-region=asia-east1 \
          --address=RESERVED_IP_ADDRESS \
          --ports=80 \
          --target-http-proxy=http-proxy \
          --global-target-http-proxy \
          --global \
          --project=SERVICE_PROJECT_A_ID
    

    替换以下内容:

    • HOST_PROJECT_ID:分配给宿主项目的 Google Cloud 项目 ID
    • RESERVED_IP_ADDRESS:您预留的 IP 地址
    • SERVICE_PROJECT_A_ID:分配给服务项目 A 的 Google Cloud 项目 ID

    对于 HTTPS 流量,请创建全球转发规则(https-fw-rule-1https-fw-rule-2)以将传入请求路由到 HTTPS 目标代理:

    gcloud compute forwarding-rules create https-fw-rule-1 \
        --load-balancing-scheme=INTERNAL_MANAGED \
        --network=projects/HOST_PROJECT_ID/global/networks/lb-network \
        --subnet=projects/HOST_PROJECT_ID/regions/us-east1/subnetworks/subnet-us \
        --subnet-region=us-east1 \
        --address=RESERVED_IP_ADDRESS \
        --ports=443 \
        --target-https-proxy=https-proxy \
        --global-target-https-proxy \
        --global \
        --project=SERVICE_PROJECT_A_ID
    
    gcloud compute forwarding-rules create https-fw-rule-2 \
        --load-balancing-scheme=INTERNAL_MANAGED \
        --network=projects/HOST_PROJECT_ID/global/networks/lb-network \
        --subnet=projects/HOST_PROJECT_ID/regions/asia-east1/subnetworks/subnet-asia \
        --subnet-region=asia-east1 \
        --address=RESERVED_IP_ADDRESS \
        --ports=443 \
        --target-https-proxy=https-proxy \
        --global-target-https-proxy \
        --global \
        --project=SERVICE_PROJECT_A_ID
    

    替换以下内容:

    • HOST_PROJECT_ID:分配给宿主项目的 Google Cloud 项目 ID
    • RESERVED_IP_ADDRESS:您预留的 IP 地址
    • SERVICE_PROJECT_A_ID:分配给服务项目 A 的 Google Cloud 项目 ID

向负载平衡器管理员授予使用后端存储桶的权限

如果您希望负载均衡器引用其他服务项目中的后端存储分区,则负载均衡器管理员必须具有 compute.backendBuckets.use 权限。如需授予此权限,您可以使用名为 Compute Load Balancer Services User (roles/compute.loadBalancerServiceUser) 的预定义 IAM 角色。此角色必须由服务项目管理员授予,可以在服务项目级层或个别后端存储桶级层应用。

在此示例中,服务项目 B 中的 Service Project Admin 必须运行以下任一命令,以向服务项目 A 中的 Load Balancer Admin 授予 compute.backendBuckets.use 权限。可以在项目级层(针对项目中的所有后端存储桶)授予该权限,也可以针对个别后端存储桶授予该权限。

控制台

项目级权限

请按照以下步骤授予对项目中所有后端存储分区的权限。

您需要拥有 compute.backendBuckets.setIamPolicyresourcemanager.projects.setIamPolicy 权限才能完成此步骤。

  1. 在 Google Cloud 控制台中,前往 IAM 页面。

    转到 IAM

  2. 选择您的项目。

  3. 点击授予访问权限

  4. 新的主账号字段中,输入主账号的电子邮件地址或其他标识符。

  5. 分配角色部分,点击添加角色

  6. 选择角色对话框的搜索角色字段中,输入 Compute Load Balancer Services User

  7. 选中 Compute Load Balancer Services User 复选框。

  8. 点击应用

  9. 可选:为角色添加条件

  10. 点击保存

针对个别后端存储分区的资源级权限

请按照以下步骤授予对项目中个别后端存储分区的权限。

您需要拥有 compute.backendBuckets.setIamPolicy 权限才能完成此步骤。

  1. 在 Google Cloud 控制台中,前往后端页面。

    前往“后端”

  2. 从后端列表中,选择要授予访问权限的后端存储桶,然后点击权限

  3. 点击添加主账号

  4. 新的主账号字段中,输入主账号的电子邮件地址或其他标识符。

  5. 选择角色列表中,选择 Compute Load Balancer Services User

  6. 点击保存

gcloud

项目级权限

请按照以下步骤授予对项目中所有后端存储分区的权限。

您需要拥有 compute.backendBuckets.setIamPolicyresourcemanager.projects.setIamPolicy 权限才能完成此步骤。

  gcloud projects add-iam-policy-binding SERVICE_PROJECT_B_ID \
      --member="user:LOAD_BALANCER_ADMIN" \
      --role="roles/compute.loadBalancerServiceUser"

替换以下内容:

  • SERVICE_PROJECT_B_ID:分配给服务项目 B 的 Google Cloud项目 ID
  • LOAD_BALANCER_ADMIN:要添加绑定的主账号

针对个别后端存储分区的资源级权限

在后端存储桶级层,服务项目管理员可以使用以下任一命令来授予 Compute Load Balancer Services User 角色 (roles/compute.loadBalancerServiceUser)

使用 gcloud projects add-iam-policy-binding 命令授予 Compute Load Balancer Services User 角色。

您需要拥有 compute.backendBuckets.setIamPolicy 权限才能完成此步骤。

  gcloud projects add-iam-policy-binding SERVICE_PROJECT_B_ID \
      --member="user:LOAD_BALANCER_ADMIN" \
      --role="roles/compute.loadBalancerServiceUser" \
      --condition='expression=resource.name=="projects/SERVICE_PROJECT_B_ID/global/backendBuckets/BACKEND_BUCKET_NAME",title=Shared VPC condition'
替换以下内容:
  • SERVICE_PROJECT_B_ID:分配给服务项目 B 的 Google Cloud项目 ID
  • LOAD_BALANCER_ADMIN:要添加绑定的主账号
  • BACKEND_BUCKET_NAME:后端存储桶的名称
或者,您也可以使用 gcloud compute backend-buckets add-iam-policy-binding 命令来授予 Compute Load Balancer Services User 角色。
  gcloud compute backend-buckets add-iam-policy-binding BACKEND_BUCKET_NAME \
      --member="user:LOAD_BALANCER_ADMIN" \
      --role="roles/compute.loadBalancerServiceUser" \
      --project=SERVICE_PROJECT_B_ID \

向负载均衡器发送 HTTP 请求

从内部客户端虚拟机向负载均衡器的转发规则发送请求。

获取负载均衡器转发规则的 IP 地址

如需获取负载均衡器转发规则的 IP 地址,请完成以下步骤:

  1. 获取负载均衡器转发规则 (http-fw-rule-1) 的 IP 地址,该 IP 地址位于 us-east1 区域。

    gcloud compute forwarding-rules describe http-fw-rule-1 \
        --global \
        --project=SERVICE_PROJECT_A_ID
    
  2. 获取负载均衡器转发规则 (http-fw-rule-2) 的 IP 地址,该 IP 地址位于 asia-east1 区域。

    gcloud compute forwarding-rules describe http-fw-rule-2 \
        --global \
        --project=SERVICE_PROJECT_A_ID
    

    SERVICE_PROJECT_A_ID 替换为分配给服务项目 A 的Google Cloud 项目 ID。

    复制返回的 IP 地址,以便在后续步骤中用作 FORWARDING_RULE_IP_ADDRESS

创建客户端虚拟机以测试连接性

如需创建客户端虚拟机以测试连接性,请完成以下步骤:

  1. us-east1 区域中创建一个名为 client-a 的客户端虚拟机。

    gcloud compute instances create client-a \
        --image-family=debian-12 \
        --image-project=debian-cloud \
        --network=projects/HOST_PROJECT_ID/global/networks/lb-network \
        --subnet=projects/HOST_PROJECT_ID/regions/us-east1/subnetworks/subnet-us \
        --zone=us-east1-c \
        --tags=allow-ssh \
        --project=SERVICE_PROJECT_A_ID
    

    替换以下内容:

    • HOST_PROJECT_ID:分配给宿主项目的 Google Cloud 项目 ID
    • SERVICE_PROJECT_A_ID:分配给服务项目 A 的 Google Cloud 项目 ID
  2. 建立与客户端虚拟机的 SSH 连接。

     gcloud compute ssh client-a \
         --zone=us-east1-c \
         --project=SERVICE_PROJECT_A_ID
    

    SERVICE_PROJECT_A_ID 替换为分配给服务项目 A 的Google Cloud 项目 ID。

  3. 在此示例中,跨区域内部应用负载均衡器在 VPC 网络的 us-east1asia-east1 区域中都具有前端虚拟 IP 地址 (VIP)。使用 curl 向任一区域中的 VIP 发出 HTTP 请求。

    curl http://FORWARDING_RULE_IP_ADDRESS/love-to-fetch/two-dogs.jpg --output two-dogs.jpg
    
    curl http://FORWARDING_RULE_IP_ADDRESS/love-to-purr/three-cats.jpg --output three-cats.jpg
    

    FORWARDING_RULE_IP_ADDRESS 替换为负载均衡器转发规则的 IP 地址。

如需测试高可用性,请参阅本文档中的测试高可用性部分。

后续步骤