使用 Cloud Storage 存储分区设置跨区域内部应用负载平衡器

本文档介绍了如何创建跨区域内部应用负载平衡器,以将针对静态内容的请求路由到 Cloud Storage 存储分区

准备工作

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

安装 Google Cloud CLI

对于预览版,本指南中的部分说明只能使用 Google Cloud CLI 执行。如需安装该工具,请参阅文档安装 gcloud CLI

您可以在 API 和 gcloud CLI 参考文档中找到与负载均衡相关的命令。

权限

若要按照本指南操作,您需要在项目中创建 Cloud Storage 存储分区和网络资源。您必须是项目的 Owner 或 Editor,或者必须拥有以下 Compute Engine IAM 角色

任务 所需角色
创建网络、子网和负载均衡器组件 Compute Network Admin 角色 (roles/compute.networkAdmin)
添加和移除防火墙规则 Compute Security Admin 角色 (roles/compute.securityAdmin)
创建 Cloud Storage 存储桶 Storage Object Admin 角色 (roles/storage.objectAdmin)

如需了解详情,请参阅以下指南:

设置 SSL 证书资源

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

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

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

限制

当 Cloud Storage 存储分区用作跨区域内部应用负载平衡器的后端时,会受到以下限制:

  • 不支持对私有存储分区的访问,因此后端存储分区必须可通过互联网公开访问。

  • 不支持已签名的网址

  • 为跨区域内部应用负载平衡器创建后端存储分区时,无法使用 Cloud CDN 集成。

  • 使用跨区域内部应用负载平衡器访问后端存储分区时,仅支持 HTTP GET 方法。您可以从存储分区下载内容,但无法通过跨区域内部应用负载平衡器将内容上传到存储分区。

设置概览

您可以在多个区域中配置跨区域内部应用负载平衡器,如下图所示:

跨区域内部应用负载平衡器将流量发送到 Cloud Storage 后端。
将流量分配到 Cloud Storage(点击可放大)。

如架构图所示,此示例在虚拟私有云 (VPC) 网络中创建了一个跨区域内部应用负载平衡器,其中包含两个后端存储分区,每个后端存储分区都引用一个 Cloud Storage 存储分区。Cloud Storage 存储分区位于 us-east1asia-east1 区域。

此部署架构可提供高可用性。如果某个区域中的跨区域内部应用负载平衡器发生故障,则 DNS 路由政策会将流量路由到另一个区域中的跨区域内部应用负载平衡器。

配置网络和子网

在 VPC 网络中,在要配置负载平衡器转发规则的每个区域中配置一个子网。此外,请在要配置负载平衡器的每个区域中配置 proxy-only-subnet

本示例使用以下 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 地址范围。

您可以从 VPC 中的任何区域访问跨区域内部应用负载平衡器。因此,来自任何区域的客户端都可以在全球范围内访问负载平衡器后端。

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

控制台

  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
    
  2. 使用 gcloud compute networks subnets create 命令us-east1 区域的 lb-network VPC 网络中创建子网。

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

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

配置代理专用子网

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

此代理专用子网用于与 VPC 网络位于同一区域的所有基于 Envoy 的区域级负载平衡器。在每个网络中,每个区域只能有一个活跃代理专用子网用于给定目的。

控制台

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

    进入 VPC 网络页面

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

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

  4. 请输入以下信息:

    • 名称proxy-only-subnet-us
    • 区域us-east1
    • IP 地址范围10.129.0.0/23
  5. 点击添加

  6. 在其他区域为负载平衡器的转发规则创建另一个子网。在子网标签页中,点击添加子网

  7. 请输入以下信息:

    • 名称proxy-only-subnet-asia
    • 区域asia-east1
    • IP 地址范围10.130.0.0/23
  8. 点击添加

gcloud

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

    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
    
  2. 使用 gcloud compute networks subnets create 命令asia-east1 区域中创建代理专用子网。

    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
    

配置防火墙规则

此示例使用以下防火墙规则:

  • 允许通过端口 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. 创建 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
    

配置 Cloud Storage 存储分区

配置 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
    
  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
    

将变量 BUCKET1_NAMEBUCKET2_NAME 替换为您的 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/never-fetch/
gcloud storage cp gs://gcp-external-http-lb-with-bucket/two-dogs.jpg gs://BUCKET2_NAME/love-to-fetch/

将 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

如需向所有用户授予查看存储分区中对象的权限,请运行 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

将存储分区名称变量替换为您的 Cloud Storage 存储分区的唯一名称。

使用后端存储分区配置负载平衡器

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

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

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

  1. 使用 gcloud beta compute backend-buckets create 命令创建两个后端存储分区,一个在 us-east1 区域,另一个在 asia-east1 区域。后端存储分区的负载均衡方案为 INTERNAL_MANAGED

    gcloud beta compute backend-buckets create backend-bucket-cats \
        --gcs-bucket-name=BUCKET1_NAME \
        --load-balancing-scheme=INTERNAL_MANAGED
    
    gcloud beta compute backend-buckets create backend-bucket-dogs \
        --gcs-bucket-name=BUCKET2_NAME \
        --load-balancing-scheme=INTERNAL_MANAGED
    
  2. 使用 gcloud compute url-maps create 命令创建网址映射,以将传入请求路由到后端存储分区。

    gcloud compute url-maps create lb-map \
        --default-backend-bucket=backend-bucket-cats \
        --global
    
  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 后端。例如,如果 /love-to-fetch/ 文件夹也存在于默认后端 (backend-bucket-cats) 中,则负载平衡器会优先选择 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
    
  4. 使用 gcloud compute target-http-proxies create 命令创建目标代理。

    对于 HTTP 流量,请创建目标 HTTP 代理以将请求路由到网址映射:

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

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

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

    CERTIFICATE_NAME 替换为您使用 Certificate Manager 创建的 SSL 证书的名称。

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

    如果您想为负载平衡器的转发规则预留静态内部 IP 地址,请参阅预留新的静态内部 IPv4 或 IPv6 地址。为 HTTP 转发规则预留 IP 地址是可选的;但是,您需要为 HTTPS 转发规则预留 IP 地址。

    在此示例中,临时 IP 地址与负载平衡器的 HTTP 转发规则相关联。转发规则存在时,临时 IP 地址保持不变。如果您需要删除转发规则并重新创建,则转发规则可能会收到新的 IP 地址。

    对于 HTTP 流量,请创建全局转发规则以将传入请求路由到 HTTP 目标代理:

    gcloud compute forwarding-rules create http-fw-rule-1 \
        --load-balancing-scheme=INTERNAL_MANAGED \
        --network=lb-network \
        --subnet=subnet-us \
        --subnet-region=us-east1 \
        --ports=80 \
        --target-http-proxy=http-proxy \
        --global-target-http-proxy \
        --global
    
    gcloud compute forwarding-rules create http-fw-rule-2 \
        --load-balancing-scheme=INTERNAL_MANAGED \
        --network=lb-network \
        --subnet=subnet-asia \
        --subnet-region=asia-east1 \
        --ports=80 \
        --target-http-proxy=http-proxy \
        --global-target-http-proxy \
        --global
    

    对于 HTTPS 流量,请创建全局转发规则以将传入请求路由到 HTTPS 目标代理:

    gcloud compute forwarding-rules create https-fw-rule-1 \
        --load-balancing-scheme=INTERNAL_MANAGED \
        --network=lb-network \
        --subnet=subnet-us \
        --subnet-region=us-east1 \
        --address=RESERVED_IP_ADDRESS \
        --ports=443 \
        --target-https-proxy=https-proxy \
        --global-target-https-proxy \
        --global
    
    gcloud compute forwarding-rules create https-fw-rule-2 \
        --load-balancing-scheme=INTERNAL_MANAGED \
        --network=lb-network \
        --subnet=subnet-asia \
        --subnet-region=asia-east1 \
        --address=RESERVED_IP_ADDRESS \
        --ports=443 \
        --target-https-proxy=https-proxy \
        --global-target-https-proxy \
        --global
    

向负载平衡器发送 HTTP 请求

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

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

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

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

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

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

  1. us-east1 区域中创建客户端虚拟机。

    gcloud compute instances create client-a \
        --image-family=debian-12 \
        --image-project=debian-cloud \
        --network=lb-network \
        --subnet=subnet-us \
        --zone=us-east1-c \
        --tags=allow-ssh
    
  2. 与客户端虚拟机建立 SSH 连接。

    gcloud compute ssh client-a --zone=us-east1-c
    
  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/never-fetch/three-cats.jpg --output three-cats.jpg
    

测试高可用性

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

    gcloud compute forwarding-rules delete http-fw-rule-1 \
        --global
    
  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/never-fetch/three-cats.jpg --output three-cats.jpg
    

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

后续步骤