本页包含两个传统应用负载均衡器的示例:
如需为全球级外部应用负载均衡器和区域级外部应用负载均衡器配置流量管理,请参阅以下页面:
准备工作
- 阅读外部应用负载均衡器的流量管理概览。
- 熟悉网址映射 API。
设置基于查询参数的路由
此示例演示了如何使用查询参数通过与查询字符串匹配来执行 A/B 测试。
添加两个后端实例组
要使路由生效,您必须有多个后端。
要设置两个后端,您的虚拟机需要位于两个实例组中。本指南介绍如何创建运行 Apache 的 Linux 虚拟机的代管式实例组,然后设置负载均衡。
代管式实例组提供运行外部 HTTP 负载均衡器的后端服务器的虚拟机。出于演示目的,后端会传送其各自的主机名。
为简单起见,后端位于同一区域。如果您需要多区域设置,则必须为第二个区域设置实例模板。
控制台
创建实例模板。在 Google Cloud 控制台中,转到实例模板页面。
- 点击创建实例模板。
- 对于名称,输入
lb-backend-template
。 - 确保启动磁盘已设置为 Debian 映像,例如 Debian GNU/Linux 12 (bookworm)。本文中的说明使用仅 Debian 支持的命令,例如
apt-get
。 - 点击高级选项。
- 点击网络并配置以下字段:
- 对于网络标记,请输入
allow-health-check
。
- 对于网络标记,请输入
点击管理。将以下脚本输入启动脚本字段。
#! /bin/bash apt-get update apt-get install apache2 -y a2ensite default-ssl a2enmod ssl vm_hostname="$(curl -H "Metadata-Flavor:Google" \ http://metadata.google.internal/computeMetadata/v1/instance/name)" echo "Page served from: $vm_hostname" | \ tee /var/www/html/index.html systemctl restart apache2
点击创建。
创建托管式实例组。转到 Google Cloud 控制台中的实例组页面。
- 点击创建实例组。
- 选择 New managed instance group (stateless)(新的托管式实例组 [无状态])。如需了解详情,请参阅无状态或有状态 MIG。
- 对于名称,输入
first-example-ig
。 - 在位置下方,选择单个可用区。
- 对于区域,选择您的首选区域。本示例使用
us-east1
。 - 对于可用区,选择
us-east1-b
。 - 在实例模板下方,选择实例模板
lb-backend-template
。 - 在实例数上限下,输入
2
。 - 在自动扩缩模式下,选择
Off:do not autoscale
。 - 点击创建。
按同样的方法创建另一个托管式实例组。将第二个命名为 second-example-ig
,并使其基于 lb-backend-template
模板。
gcloud
创建实例模板。
gcloud compute instance-templates create `lb-backend-template` \ --region=us-east1 \ --network=default \ --subnet=default \ --tags=allow-health-check \ --image-family=debian-12 \ --image-project=debian-cloud \ --metadata=startup-script='#! /bin/bash apt-get update apt-get install apache2 -y a2ensite default-ssl a2enmod ssl vm_hostname="$(curl -H "Metadata-Flavor:Google" \ http://metadata.google.internal/computeMetadata/v1/instance/name)" echo "Page served from: $vm_hostname" | \ tee /var/www/html/index.html systemctl restart apache2'
基于模板创建第一个托管式实例组。
gcloud compute instance-groups managed create first-example-ig \ --template=lb-backend-template --size=2 --zone=us-east1-b
基于模板创建第二个托管式实例组。
gcloud compute instance-groups managed create second-example-ig \ --template=lb-backend-template --size=2 --zone=us-east1-c
配置防火墙规则
在此示例中,您将创建 fw-allow-health-check
防火墙规则。这是一种入站流量规则,允许来自 Google Cloud 健康检查系统(130.211.0.0/22
和 35.191.0.0/16
)的流量。此示例使用目标标记 allow-health-check
来标识虚拟机。
控制台
- 在 Google Cloud 控制台中,转到防火墙页面。
前往“防火墙政策” - 点击创建防火墙规则以创建第二条防火墙规则:
- 输入
fw-allow-health-check
作为名称。 - 在网络下,选择
Default
。 - 在目标下,选择指定的目标标记。
- 使用
allow-health-check
填充目标标记字段。 - 将来源过滤条件设置为 IPv4 范围。
- 将来源 IPv4 范围设置为
130.211.0.0/22
和35.191.0.0/16
。 - 在协议和端口下,选择指定的协议和端口。
- 选中 TCP 复选框,然后输入
80
作为端口号。 - 点击创建。
gcloud
gcloud compute firewall-rules create fw-allow-health-check \ --network=default \ --action=allow \ --direction=ingress \ --source-ranges=130.211.0.0/22,35.191.0.0/16 \ --target-tags=allow-health-check \ --rules=tcp
预留外部 IP 地址
现在您的实例已启动并正在运行,接下来请设置一个全局静态外部 IP 地址,以供客户用来访问您的负载均衡器。
控制台
- 转到 Google Cloud 控制台中的“外部 IP 地址”页面。
转到“外部 IP 地址”页面 - 点击预留静态地址以预留 IPv4 地址。
- 指定名称
lb-ipv4-1
。 - 将网络层级设置为标准。
- 将 IP 版本设置为 IPv4。
- 将类型设置为全局。
- 点击预留。
- 确保将类型设置为全局。
- 点击预留。
gcloud
gcloud compute addresses create lb-ipv4-1 \ --ip-version=IPV4 \ --network-tier=PREMIUM \ --global
请记下预留的 IPv4 地址:
gcloud compute addresses describe lb-ipv4-1 \ --format="get(address)" \ --global
设置负载均衡器后端
控制台
Google Cloud 控制台目前不支持设置基于标头和基于参数的路由。请改用 gcloud
或 API。
gcloud
- 创建健康检查。
gcloud compute health-checks create http http-basic-check \ --port 80
- 创建第一个后端服务。
-
对于全球外部应用负载均衡器,请将 gcloud CLI 命令与
load-balancing-scheme=EXTERNAL_MANAGED
结合使用。此设置提供了高级流量管理功能。 - 对于经典版应用负载均衡器,请使用
load-balancing-scheme=EXTERNAL
。
gcloud compute backend-services create service-a \ --load-balancing-scheme=LOAD_BALANCING_SCHEME \ --global-health-checks \ --protocol HTTP \ --health-checks http-basic-check \ --global
-
对于全球外部应用负载均衡器,请将 gcloud CLI 命令与
- 创建第二个后端服务。
gcloud compute backend-services create service-b \ --load-balancing-scheme=LOAD_BALANCING_SCHEME \ --global-health-checks \ --protocol HTTP \ --health-checks http-basic-check \ --global
- 将第一个实例组作为后端添加到第一个后端服务。
gcloud compute backend-services add-backend service-a \ --balancing-mode=UTILIZATION \ --max-utilization=0.8 \ --capacity-scaler=1 \ --instance-group=first-example-ig \ --instance-group-zone=us-east1-b \ --global
- 将第二个实例组作为后端添加到第二个后端服务。
gcloud compute backend-services add-backend service-b \ --balancing-mode=UTILIZATION \ --max-utilization=0.8 \ --capacity-scaler=1 \ --instance-group=second-example-ig \ --instance-group-zone=us-east1-c \ --global
创建网址映射
控制台
Google Cloud 控制台目前不支持设置基于标头和基于参数的路由。请改用 gcloud
或 API。
gcloud
创建 YAML 文件
/tmp/web-map-http.yaml
。将PROJECT_ID
替换为您的项目 ID。defaultService: https://www.googleapis.com/compute/v1/projects/PROJECT_ID/global/backendServices/service-a hostRules: - hosts: - '*' pathMatcher: path-matcher-1 name: web-map-http pathMatchers: - defaultService: https://www.googleapis.com/compute/v1/projects/PROJECT_ID/global/backendServices/service-a name: path-matcher-1 routeRules: - matchRules: - prefixMatch: / queryParameterMatches: - name: ABTest exactMatch: A priority: 0 service: https://www.googleapis.com/compute/v1/projects/PROJECT_ID/global/backendServices/service-a - matchRules: - prefixMatch: / queryParameterMatches: - name: ABTest exactMatch: B priority: 1 service: https://www.googleapis.com/compute/v1/projects/PROJECT_ID/global/backendServices/service-b selfLink: https://www.googleapis.com/compute/v1/projects/PROJECT_ID/global/urlMaps/web-map-http tests: - description: Test routing for query ABTest with A host: example.com path: /?ABTest=A service: https://www.googleapis.com/compute/v1/projects/PROJECT_ID/global/backendServices/service-a expectedOutputUrl: http://example.com/?ABTest=A - description: Test routing for query ABTest with B host: example.com path: /?ABTest=B service: https://www.googleapis.com/compute/v1/projects/PROJECT_ID/global/backendServices/service-b expectedOutputUrl: http://example.com/?ABTest=B
验证网址映射。
gcloud compute url-maps validate --source /tmp/web-map-http.yaml
如果测试通过并且命令输出成功消息,请将更改保存到网址映射。
更新网址映射。
gcloud compute url-maps import web-map-http \ --source /tmp/web-map-http.yaml \ --global
创建目标代理和转发规则
控制台
Google Cloud 控制台目前不支持设置基于标头和基于参数的路由。请改用 gcloud
或 API。
gcloud
- 创建目标 HTTP 代理以将请求路由到您的网址映射。
gcloud compute target-http-proxies create http-lb-proxy \ --url-map web-map-http
- 创建全局转发规则以将传入请求路由到代理。
-
对于全球外部应用负载均衡器,请将 gcloud CLI 命令与
load-balancing-scheme=EXTERNAL_MANAGED
结合使用。此设置提供了高级流量管理功能。 - 对于经典版应用负载均衡器,请使用
load-balancing-scheme=EXTERNAL
。
gcloud compute forwarding-rules create http-content-rule \ --load-balancing-scheme=LOAD_BALANCING_SCHEME \ --network-tier=PREMIUM \ --address=lb-ipv4-1 \ --global \ --target-http-proxy=http-lb-proxy \ --ports=80
-
对于全球外部应用负载均衡器,请将 gcloud CLI 命令与
测试
请记下预留的 IPv4 地址:
gcloud compute addresses describe lb-ipv4-1 \ --format="get(address)" \ --global
通过运行以下命令来测试此设置:
curl http://IP_ADDRESS?ABTest=A
curl http://IP_ADDRESS?ABTest=B
在浏览器中,打开 http://IP_ADDRESS?ABTest=A
和 http://IP_ADDRESS?ABTest=B
。
设置基于 HTTP 标头的路由
此示例演示了如何添加和移除 HTTP 标头以进行智能路由。
准备工作
您可以使用现有的外部应用负载均衡器,也可以新建一个。
您可以将此功能用于任何受支持的后端类型。此示例假定您在实例组中使用虚拟机。
如需设置简单的负载均衡器,请参阅上面的基于查询参数的示例。
更新网址映射
控制台
Google Cloud 控制台目前不支持设置基于标头和基于参数的路由。请改用 gcloud
或 API。
gcloud
此示例演示了通过匹配请求的 HTTP 标头中的值来使用 HTTP 请求标头执行 A/B 测试。
创建 YAML 文件
/tmp/web-map-http.yaml
。将PROJECT_ID
替换为您的项目 ID。defaultService: https://www.googleapis.com/compute/v1/projects/PROJECT_ID/global/backendServices/service-a kind: compute#urlMap name: web-map-http hostRules: - hosts: - '*' pathMatcher: path-matcher-1 pathMatchers: - defaultService: https://www.googleapis.com/compute/v1/projects/PROJECT_ID/global/backendServices/service-a name: path-matcher-1 routeRules: - matchRules: - prefixMatch: / headerMatches: - headerName: ABTest exactMatch: A priority: 0 service: https://www.googleapis.com/compute/v1/projects/PROJECT_ID/global/backendServices/service-a - matchRules: - prefixMatch: / headerMatches: - headerName: ABTest exactMatch: B priority: 1 service: https://www.googleapis.com/compute/v1/projects/PROJECT_ID/global/backendServices/service-b tests: - description: Test routing for query ABTest with A host: example.com path: / headers: - name: ABTest value: A service: https://www.googleapis.com/compute/v1/projects/PROJECT_ID/global/backendServices/service-a - description: Test routing for query ABTest with B host: example.com path: / headers: - name: ABTest value: B service: https://www.googleapis.com/compute/v1/projects/PROJECT_ID/global/backendServices/service-b
验证网址映射。
gcloud compute url-maps validate --source /tmp/web-map-http.yaml
如果测试通过并且命令输出成功消息,请将更改保存到网址映射。
更新网址映射。
gcloud compute url-maps import web-map-http \ --source /tmp/web-map-http.yaml \ --global
测试
使用关联负载均衡器的 IPv4 地址,通过运行以下命令来测试此设置:
curl http://IP_ADDRESS -H "ABTest: A"
curl http://IP_ADDRESS -H "ABTest: B"