本文档介绍了如何创建跨区域内部应用负载平衡器,以将针对静态内容的请求路由到 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
方法。您可以从存储分区下载内容,但无法通过跨区域内部应用负载平衡器将内容上传到存储分区。
设置概览
您可以在多个区域中配置跨区域内部应用负载平衡器,如下图所示:
如架构图所示,此示例在虚拟私有云 (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-network
VPC 网络中创建子网。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-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 的区域级负载平衡器。在每个网络中,每个区域只能有一个活跃代理专用子网用于给定目的。
控制台
在 Google Cloud 控制台中,进入 VPC 网络页面。
点击您创建的 VPC 网络的名称。
在子网标签页中,点击添加子网。
请输入以下信息:
- 名称:
proxy-only-subnet-us
- 区域:
us-east1
- IP 地址范围:
10.129.0.0/23
- 名称:
点击添加。
在其他区域为负载平衡器的转发规则创建另一个子网。在子网标签页中,点击添加子网。
请输入以下信息:
- 名称:
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 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
使用
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
后端。例如,如果/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
使用
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 地址,请参阅预留新的静态内部 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 地址
获取负载平衡器转发规则 (
http-fw-rule-1
) 的 IP 地址(位于us-east1
区域)。gcloud compute forwarding-rules describe http-fw-rule-1 \ --global
获取负载平衡器转发规则 (
http-fw-rule-2
) 的 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
),从而确保应用在区域级服务中断期间仍然正常运行。