本文档介绍了如何创建跨区域内部应用负载均衡器,以将针对静态内容的请求路由到 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 作为请求和响应协议的跨区域内部应用负载均衡器,请按照以下其中一个文档中的说明使用 Certificate Manager 创建 SSL 证书资源:
创建证书后,您可以将证书附加到 HTTPS 目标代理。
我们建议您使用 Google 管理的证书。
限制
当 Cloud Storage 存储桶用作跨区域内部应用负载均衡器的后端时,会受到以下限制:
- 不支持专用存储桶访问,因此后端存储桶必须可通过互联网公开访问。 
- 不支持签名网址。 
- 为跨区域内部应用负载均衡器创建后端存储桶时,无法使用 Cloud CDN 集成。 
- 使用跨区域内部应用负载均衡器访问后端存储桶时,仅支持 HTTP - GET方法。您可以从存储桶下载内容,但无法通过跨区域内部应用负载均衡器将内容上传到存储桶。
- 您无法在共享 VPC 环境中设置具有 Cloud Storage 存储桶的跨区域内部应用负载均衡器。 
设置概览
您可以在多个区域配置跨区域内部应用负载均衡器,如下图所示:
如架构图所示,此示例在虚拟私有云 (VPC) 网络中创建跨区域内部应用负载均衡器,其中包含两个后端存储桶,每个后端存储桶都引用一个 Cloud Storage 存储桶。Cloud Storage 存储桶位于 us-east1 和 asia-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 中的任何区域访问跨区域内部应用负载均衡器。因此,来自任何区域的客户端都可以在全球范围内访问负载均衡器后端。
为负载均衡器的转发规则配置子网
控制台
- 在 Google Cloud 控制台中,前往 VPC 网络页面。 
- 点击创建 VPC 网络。 
- 对于名称,输入 - lb-network。
- 在子网部分中,将子网创建模式设置为自定义。 
- 在新子网部分中,输入以下信息: - 名称:subnet-us
- 选择区域:us-east1
- IP 地址范围:10.1.2.0/24
 
- 名称:
- 点击完成。 
- 点击添加子网。 
- 在其他区域为负载均衡器的转发规则创建另一个子网。在新子网部分中,输入以下信息: - 名称:subnet-asia
- 区域:asia-east1
- IP 地址范围:10.1.3.0/24
 
- 名称:
- 点击完成。 
- 点击创建。 
gcloud
- 使用 - gcloud compute networks create命令创建一个名为- lb-network的自定义 VPC 网络。- gcloud compute networks create lb-network --subnet-mode=custom 
- 使用 - gcloud compute networks subnets create命令在- us-east1区域的- lb-networkVPC 网络中创建子网。- gcloud compute networks subnets create subnet-us \ --network=lb-network \ --range=10.1.2.0/24 \ --region=us-east1
- 使用 - gcloud compute networks subnets create命令在- asia-east1区域的- lb-networkVPC 网络中创建子网。- 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 的区域级负载均衡器。在每个网络中,每个区域只能有一个活跃代理专用子网用于给定用途。在此示例中,我们创建两个代理专用子网,一个位于 us-east1 区域,另一个位于 asia-east1 区域。
控制台
- 在 Google Cloud 控制台中,前往 VPC 网络页面。 
- 点击您创建的 VPC 网络的名称。 
- 在子网标签页中,点击添加子网。 
- 请输入以下信息: - 对于名称,输入 proxy-only-subnet-us。
- 对于区域,输入 us-east1。
- 对于用途,选择跨区域托管式代理。
- 对于 IP 地址范围,输入 10.129.0.0/23。
 
- 对于名称,输入 
- 点击添加。 
- 在 - asia-east1区域中创建另一个代理专用子网。 在子网标签页中,点击添加子网。
- 请输入以下信息: - 对于名称,输入 proxy-only-subnet-asia。
- 对于区域,输入 asia-east1。
- 对于用途,选择跨区域托管式代理。
- 对于 IP 地址范围,输入 10.130.0.0/23。
 
- 对于名称,输入 
- 点击添加。 
gcloud
- 使用 - 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
- 使用 - 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。
控制台
- 在 Google Cloud 控制台中,前往防火墙政策页面。 
- 点击创建防火墙规则,以创建允许在客户端虚拟机上进行传入 SSH 连接的规则: - 名称:fw-allow-ssh
- 网络:lb-network
- 流量方向:入站
- 匹配时执行的操作:允许
- 目标:指定的目标标记
- 目标标记:allow-ssh
- 来源过滤条件:IPv4 范围
- 来源 IPv4 范围:0.0.0.0/0
- 协议和端口:- 选择指定的协议和端口。
- 选中 TCP 复选框,然后输入 22作为端口号。
 
 
- 名称:
- 点击创建。 
gcloud
- 创建 - 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 区域复制对象。这可以提高内容的可用性,并提高应用的故障容忍度。
控制台
gcloud
- 使用 - gcloud storage buckets create命令在- us-east1区域中创建第一个存储桶。- gcloud storage buckets create gs://BUCKET1_NAME \ --default-storage-class=standard \ --location=us-east1 \ --uniform-bucket-level-access
- 使用 - 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_NAME 和 BUCKET2_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)。
控制台
要授予所有用户查看存储桶中对象的权限,请对每个存储桶重复执行以下过程:
- 在 Google Cloud 控制台中,转到 Cloud Storage 存储桶页面。
 
- 在存储桶列表中,点击您要设为公开的存储桶的名称。 
- 选择页面顶部附近的权限标签。 
- 在权限部分中,点击 授予访问权限按钮。 系统会显示授予访问权限对话框。 
- 在新的主账号字段中,输入 - allUsers。
- 在选择角色字段的过滤条件框中输入 - Storage Object Viewer,然后从过滤后的结果中选择 Storage Object Viewer。
- 点击保存。 
- 点击允许公开访问。 
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 存储桶名称。
使用后端存储桶配置负载均衡器
本部分介绍了如何为跨区域内部应用负载均衡器创建以下资源:
- 两个后端存储桶。后端存储桶充当您之前创建的 Cloud Storage 存储桶的封装容器。
- 网址映射
- 目标代理
- 两条使用区域级 IP 地址的全球转发规则。转发规则会从为负载均衡器的转发规则创建的子网中分配 IP 地址。如果您尝试为代理专用子网中的转发规则分配 IP 地址,则无法创建转发规则。
在此示例中,您可以使用 HTTP 或 HTTPS 作为客户端与负载均衡器之间的请求和响应协议。如需创建 HTTPS 负载均衡器,您必须向该负载均衡器的前端添加 SSL 证书资源。
如需使用 gcloud CLI 创建上述负载均衡组件,请按照以下步骤操作:
- 使用 - gcloud compute backend-buckets create命令创建两个后端存储桶,每个 Cloud Storage 存储桶一个。 后端存储桶的负载均衡方案为- INTERNAL_MANAGED。- gcloud compute backend-buckets create backend-bucket-cats \ --gcs-bucket-name=BUCKET1_NAME \ --load-balancing-scheme=INTERNAL_MANAGED- gcloud compute backend-buckets create backend-bucket-dogs \ --gcs-bucket-name=BUCKET2_NAME \ --load-balancing-scheme=INTERNAL_MANAGED
- 使用 - gcloud compute url-maps create命令创建网址映射,以将传入请求路由到后端存储桶。- gcloud compute url-maps create lb-map \ --default-backend-bucket=backend-bucket-cats \ --global
- 使用 - 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
- 使用 - 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 证书的名称。
- 使用 - gcloud compute forwarding-rules create命令创建两条全球转发规则:一条规则使用- us-east1区域中的 IP 地址,另一条规则使用- asia-east1区域中的 IP 地址。- 如果您要为负载均衡器的转发规则预留静态内部 IP 地址,请参阅预留静态内部 IP 地址。 对于 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 地址
- 获取负载均衡器转发规则 ( - http-fw-rule-1) 的 IP 地址,该 IP 地址位于- us-east1区域。- gcloud compute forwarding-rules describe http-fw-rule-1 \ --global
- 获取负载均衡器转发规则 ( - http-fw-rule-2) 的 IP 地址,该 IP 地址位于- asia-east1区域。- gcloud compute forwarding-rules describe http-fw-rule-2 \ --global
创建客户端虚拟机以测试连接性
- 在 - 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
- 建立与客户端虚拟机的 SSH 连接。 - gcloud compute ssh client-a --zone=us-east1-c 
- 在此示例中,跨区域内部应用负载均衡器在 VPC 网络的 - us-east1和- asia-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 
测试高可用性
- 删除 - us-east1区域中的转发规则 (- http-fw-rule-1) 以模拟区域级服务中断,并检查- us-east区域中的客户端是否仍然可以从后端存储桶访问数据。- gcloud compute forwarding-rules delete http-fw-rule-1 \ --global
- 使用 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)。此行为有助于确保应用在区域级服务中断期间仍然正常运行。