目标
- 部署多个启用了自动调节功能的区域 Compute Engine 托管实例组。
- 创建跨区域负载平衡器。
- 生成来自全球不同区域的测试流量。
- 使用 Google Cloud Platform Console 直观地呈现负载平衡器如何路由请求以及实例组如何自动调节以满足需求。
费用
本教程使用 GCP 的可计费组件,包括:- Compute Engine
准备工作
-
选择或创建 Google Cloud Platform 项目。
-
确保您的 Google Cloud Platform 项目已启用结算功能。
- 启用Compute Engine API。
应用架构
应用包括以下 Compute Engine 组件:
- 实例模板:用于在实例组中创建每个实例的模板。
- 实例组:根据传入流量进行自动调节的多个实例组。
- 负载平衡器:在实例组之间分配流量的 HTTP 负载平衡器。
- 实例:生成来自全球不同区域的测试流量的多个测试实例。
设置网络服务
创建实例组
Console
为实例组创建网络。
- 转到 GCP Console 中的 VPC 网络页面。
转到“VPC 网络”页面 - 点击创建 VPC 网络。
- 将名称设置为
fortressnet
。 - 将子网创建模式设置为自动。
- 点击该页面底部的创建。
- 转到 GCP Console 中的 VPC 网络页面。
为该网络创建防火墙规则。此规则将允许发送到您的实例的所有 HTTP 请求。
- 转到 GCP Console 中的防火墙规则页面。
转到“防火墙规则”页面 - 点击创建防火墙规则。
- 将名称设置为
fortressnet-allow-http
。 - 在网络部分,请选择
fortressnet
。 - 在目标部分,请选择
All instances in the network
。 - 将来源 IP 地址范围设置为
0.0.0.0/0
。 - 在协议和端口下,选择 tcp 并输入
80
。 - 点击创建。
- 转到 GCP Console 中的防火墙规则页面。
创建实例模板。包含在每个实例上启动一个简单的 Apache 网络服务器的启动脚本。
- 转到 GCP Console 中的实例模板页面。
转到“实例模板”页面 - 点击创建实例模板。
- 将名称设置为
fort-template
。 - 在机器配置部分,请选择
micro
(f1-micro)。 - 点击管理、安全、磁盘、网络、单独租用以显示高级设置。您应该会看到许多标签。
- 点击网络标签。
- 在网络部分,请选择
fortressnet
。 - 点击管理标签。
在自动化作业下,输入以下启动脚本:
apt-get update && apt-get install -y apache2
点击该页面底部的创建。
- 转到 GCP Console 中的实例模板页面。
使用实例模板创建多个区域托管实例组。为每个实例组配置自动扩缩。
- 转到 GCP Console 中的实例组页面。
转到“实例组”页面 - 点击创建实例组模板。
- 将名称设置为
us-central1-pool
。 - 在位置部分,请选择
Multi-zone
。 - 在区域部分,请选择
us-central1
。 - 在实例模板部分,请选择
fort-template
。 - 对于自动调节,请选择开启。
- 在自动扩缩的依据部分,请选择
HTTP load balancing usage
。 - 将目标负载平衡使用率设置为
80
。 - 将最小实例数设置为
1
。 - 将最大实例数设置为
5
。 - 点击创建。
- 重复这些步骤,创建另外两个具有不同名称的实例组:
- 创建一个名称为
europe-west1-pool
且区域为europe-west1
的组。 - 创建一个名称为
asia-east1-pool
且区域为asia-east1
的组。
- 创建一个名称为
- 转到 GCP Console 中的实例组页面。
(可选)验证实例是否正常运行并且传送 HTTP 流量。测试一个或多个实例的外部 IP 地址。您可能需要等待一分钟,让实例完成启动过程。
- 转到 GCP Console 中的虚拟机实例页面。
转到“虚拟机实例”页面。 - 验证每个正在运行的实例在名称列下是否有绿色的对勾标记。
- 复制实例的外部 IP 并将其粘贴到网络浏览器中。
您应该会看到“Apache2 Debian Default Page”网页。
如果未出现该内容,请等待片刻。
- 转到 GCP Console 中的虚拟机实例页面。
gcloud
为实例组创建网络。
gcloud compute networks create fortressnet --subnet-mode auto
为该网络创建防火墙规则。此规则将允许发送到您的实例的所有 HTTP 请求。
gcloud compute firewall-rules create fortressnet-allow-http \ --network fortressnet \ --allow tcp:80
创建实例模板。包含在每个实例上启动一个简单的 Apache 网络服务器的启动脚本。
gcloud compute instance-templates create fort-template \ --machine-type f1-micro \ --network fortressnet \ --metadata startup-script='apt-get update && apt-get install -y apache2'
使用实例模板创建多个区域托管实例组。为每个实例组配置自动扩缩。
gcloud compute instance-groups managed create us-central1-pool \ --region us-central1 \ --template fort-template \ --size 1 gcloud compute instance-groups managed set-autoscaling us-central1-pool \ --region us-central1 \ --min-num-replicas 1 \ --max-num-replicas 5 \ --scale-based-on-load-balancing \ --target-load-balancing-utilization .8
gcloud compute instance-groups managed create europe-west1-pool \ --region europe-west1 \ --template fort-template \ --size 1 gcloud compute instance-groups managed set-autoscaling europe-west1-pool \ --region europe-west1 \ --min-num-replicas 1 \ --max-num-replicas 5 \ --scale-based-on-load-balancing \ --target-load-balancing-utilization .8
gcloud compute instance-groups managed create asia-east1-pool \ --region asia-east1 \ --template fort-template \ --size 1 gcloud compute instance-groups managed set-autoscaling asia-east1-pool \ --region asia-east1 \ --min-num-replicas 1 \ --max-num-replicas 5 \ --scale-based-on-load-balancing \ --target-load-balancing-utilization .8
(可选)验证实例是否正常运行并且传送 HTTP 流量。测试一个或多个实例的外部 IP 地址。您可能需要等待一分钟,让实例完成启动过程。
列出您的实例。
gcloud compute instances list
在
STATUS
列验证实例是否RUNNING
。通过在
EXTERNAL_IP
列查询实例的 IP 地址来检查实例。curl http://[EXTERNAL_IP] | head
您应该会看到一些 HTML 文本,包括行
<title>Apache2 Debian Default Page: It works</title>
。如果未出现该内容,请等待片刻。
配置负载平衡器
负载平衡器将在您的多个后端之间分配客户端请求。
Console
开始配置负载平衡器
- 转到 GCP Console 中的负载平衡页面。
转到“负载平衡”页面。 - 点击创建负载平衡器。
- 在 HTTP(S) 负载平衡下,点击开始配置。
- 将名称设置为
fortressnet-balancer
。
后端配置
- 在新建 HTTP(S) 负载平衡器页面上,点击后端配置。
- 在创建或选择后端服务和后端存储分区下拉菜单中,选择后端服务,然后选择创建后端服务。您应该会看到创建后端服务对话框。
- 将后端服务的名称设置为
fortressnet-backend-service
。 - 在新建后端对话框下,将实例组设置为
asia-east1-pool
。 - 对于平衡模式,请选择速率。
- 将 RPS 上限设置为每个实例
100
RPS。 - 点击完成。
- 点击添加后端。
- 在新建后端对话框下,将实例组设置为
europe-west1-pool
。 - 对于平衡模式,请选择速率。
- 将 RPS 上限设置为每个实例
100
RPS。 - 点击完成。
- 点击添加后端。
- 在新建后端对话框下,将实例组设置为
us-central1-pool
。 - 对于平衡模式,请选择速率。
- 将 RPS 上限设置为每个实例
100
RPS。 - 点击完成。
- 在运行状况检查中,选择创建运行状况检查。
- 将名称设置为
http-basic-check
。 - 在协议部分,请选择
HTTP
。 - 将端口设置为
80
。 - 点击保存并继续。
- 点击创建。
主机和路径规则
- 在新建 HTTP(S) 负载平衡器页面的左侧面板上,点击主机和路径规则。
在本例中,由于所有流量均将采用默认规则,我们无需配置任何主机或路径规则。因此,我们可以接受预填充的默认值。
前端配置
- 在新建 HTTP(S) 负载平衡器页面的左侧面板上,点击前端配置。
- 将名称设置为
fortressnet-http-rule
。 - 对于 IP 版本,请选择 IPv4。
- 对于 IP 地址,请选择创建 IP 地址。
- 在保留新的静态 IP 对话框中,将名称设置为
fortressnet-ip
。 - 点击保留并稍等片刻。
- 点击新建前端 IP 和端口对话框底部的完成。
- 点击添加前端 IP 和端口。
- 将名称设置为
fortressnet-http-ipv6-rule
。 - 对于 IP 版本,请选择 IPv6。
- 对于 IP 地址,请选择创建 IP 地址。
- 在对话框中,将名称设置为
fortressnet-ipv6
。 - 点击保留并稍等片刻。
- 点击新建前端 IP 和端口对话框底部的完成。
检查并最终确定
- 在新建 HTTP(S) 负载平衡器页面的左侧面板上,点击检查并最终确定。
- 将设置与您打算创建的内容进行比较。
- 如果设置正确,请点击左侧面板底部的创建。您将返回到“负载平衡”屏幕。创建负载平衡器后,其旁边的绿色对勾标记表示它正在运行。
gcloud
后端配置
创建基本运行状况检查。这将检查负载平衡器后端是否对 HTTP 请求做出响应。
gcloud compute health-checks create http http-basic-check
创建全局后端服务。此后端服务将接收来自负载平衡器的 HTTP 流量。
gcloud compute backend-services create fortressnet-backend-service
--protocol HTTP
--health-checks http-basic-check
--global将实例组添加为后端服务的区域后端。此配置将根据每个实例的最大每秒请求数 (RPS) 在后端之间分配流量。
gcloud compute backend-services add-backend fortressnet-backend-service
--balancing-mode RATE
--max-rate-per-instance 100
--instance-group us-central1-pool
--instance-group-region us-central1
--global gcloud compute backend-services add-backend fortressnet-backend-service
--balancing-mode RATE
--max-rate-per-instance 100
--instance-group europe-west1-pool
--instance-group-region europe-west1
--global gcloud compute backend-services add-backend fortressnet-backend-service
--balancing-mode RATE
--max-rate-per-instance 100
--instance-group asia-east1-pool
--instance-group-region asia-east1
--global
主机和路径规则
定义网址映射。网址映射会将不同的网址路由到不同的后端服务。由于我们只有一个后端服务,因此我们只需将该后端服务设置为所有网址的默认服务即可。
gcloud compute url-maps create fortressnet-balancer
--default-service fortressnet-backend-service创建 HTTP 代理路由。HTTP 代理路由接受 HTTP 请求,并根据您的网址映射路由它们。在这种情况下,它会将所有请求发送到您的单个后端服务。
gcloud compute target-http-proxies create fortressnet-http-proxy
--url-map fortressnet-balancer
前端配置
创建两个全局静态外部 IP 地址:一个用于 IPV4,另一个用于 IPV6。它们将成为负载平衡器的全局外部 IP 地址。
gcloud compute addresses create fortressnet-ip
--ip-version IPV4
--global gcloud compute addresses create fortressnet-ipv6
--ip-version IPV6
--global查询负载平衡器的外部 IP 地址。
gcloud compute addresses list
创建外部 IP 地址的全局转发规则。这会将 IPV4 和 IVP6 HTTP 请求均转发到您的 HTTP 代理。
gcloud compute forwarding-rules create fortressnet-http-rule
--global
--target-http-proxy fortressnet-http-proxy
--ports 80
--address [LOAD_BALANCER_IP_ADDRESS]gcloud compute forwarding-rules create fortressnet-http-ipv6-rule
--global
--target-http-proxy fortressnet-http-proxy
--ports 80
--address [LOAD_BALANCER_IPV6_ADDRESS]
(可选)验证负载平衡器是否正常工作。您可能需要等待一到三分钟。
Console
- 转到 GCP Console 中的负载平衡页面。
转到“负载平衡”页面。 - 等待
fortressnet-balancer
在后端列下出现一个绿色的对勾标记。 - 点击
fortressnet-balancer
。 - 在前端下复制 IP:端口列下的 IPV4 地址。(IPV4 地址的格式为
www.xxx.yyy.zzz
。您不需要末尾的端口号:nn
。)如果缺少前端部分,请等待片刻,然后重新加载该网页。 - 在网络浏览器中输入 IP 地址。
您应该会看到“Apache2 Debian Default Page”网页。
如果显示“错误 404(找不到)”网页,请再等待几分钟。
gcloud
查询负载平衡器的外部 IP 地址。
gcloud compute addresses list
查询 IPV4 地址。(IPV4 地址的格式为
www.xxx.yyy.zzz
。)curl http://[LOAD_BALANCER_IP_ADDRESS] | head
您应该会看到一些 HTML 文本,包括行 <title>Apache2 Debian Default Page: It works</title>
。
如果显示 <title>Error 404 (Not Found)!!1</title>
,请再等待几分钟。
最佳做法:创建安全防火墙,仅允许来自负载平衡器和运行状况检查的内部流量。然后删除允许任何 HTTP 请求的原始防火墙。这可以防止外部客户端访问各个实例。
Console
创建新的防火墙,仅允许来自负载平衡器和运行状况检查的流量。
- 转到 GCP Console 中的防火墙规则页面。
转到“防火墙规则”页面 - 点击创建防火墙规则。
- 将名称设置为
fortressnet-allow-load-balancer
。 - 在网络部分,请选择
fortressnet
。 - 在目标部分,请选择
All instances in the network
。 - 在来源 IP 地址范围部分,键入
130.211.0.0/22
并按 Enter 键,然后键入35.191.0.0/16
并再次按 Enter 键。 - 在协议和端口下,选择 tcp 并输入
80
。 - 点击创建。
- 转到 GCP Console 中的防火墙规则页面。
删除旧的全部允许防火墙。
- 选中
fortressnet-allow-http
旁的对勾标记。 - 点击页面顶部的删除。
- 在对话框中,点击删除。
- 选中
gcloud
创建新的防火墙,仅允许来自负载平衡器和运行状况检查的流量。
gcloud compute firewall-rules create fortressnet-allow-load-balancer
--network fortressnet
--source-ranges 130.211.0.0/22,35.191.0.0/16
--allow tcp:80删除旧的全部允许防火墙。
gcloud compute firewall-rules delete fortressnet-allow-http -q
(可选)验证自动调节和负载平衡功能是否正常运行
生成一些测试流量
假设现在是欧洲的早晨,您的网络服务突然人气暴增。从欧洲突然生成大量客户端请求。
Console
创建安装了 Siege 负载测试工具的实例。
- 转到 GCP Console 中的虚拟机实例页面。
转到“虚拟机实例”页面。 - 点击创建实例。
- 将名称设置为
europe-loadtest
。 - 在区域部分,请选择
europe-west1
。 - 点击管理、安全、磁盘、网络、单独租用以显示高级设置。您应该会看到许多标签。
- 点击管理标签。
在自动化作业下,输入以下启动脚本:
apt-get install -y siege
点击该页面底部的创建。
- 转到 GCP Console 中的虚拟机实例页面。
获取负载平衡器的 IPV4 地址。
- 转到 GCP Console 中的负载平衡页面。
转到“负载平衡”页面。 - 点击
fortressnet-balancer
。 - 在前端下复制 IP:端口列下的 IPV4 地址。(IPV4 地址的格式为
www.xxx.yyy.zzz
。)
- 转到 GCP Console 中的负载平衡页面。
通过 SSH 连接到负载测试实例。
- 转到 GCP Console 中的虚拟机实例页面。
转到“虚拟机实例”页面。 - 等待
europe-loadtest
实例在名称列下出现一个绿色的对勾标记。 - 点击连接列下
europe-loadtest
上的 SSH。
- 转到 GCP Console 中的虚拟机实例页面。
启动 siege。定位负载平衡器的 IPV4 地址。
siege -c150 http://[LOAD_BALANCER_IP_ADDRESS]
gcloud
创建安装了 Siege 负载测试工具的实例。
gcloud compute instances create europe-loadtest \ --network default \ --zone europe-west1-c \ --metadata startup-script='apt-get -y install siege'
获取负载平衡器的 IPV4 地址。
gcloud compute addresses list
打开新的 shell 会话,其中
gcloud
命令可用。在新的 shell 会话中,通过 SSH 连接到负载测试实例。
gcloud compute ssh --zone europe-west1-c europe-loadtest
启动 siege。定位负载平衡器的 IPV4 地址。
siege -c150 http://[LOAD_BALANCER_IP_ADDRESS]
运行 siege
命令后,您应该会看到输出声明 The server is now under siege...
[alert] Zip encoding disabled; siege requires zlib support to enable it ** SIEGE 4.0.2 ** Preparing 150 concurrent users for battle. The server is now under siege...
监控负载平衡和自动调节
- 转到 GCP Console 中的负载平衡页面。
转到“负载平衡”页面 - 点击名为
fortressnet-balancer
的负载平衡器。 - 点击监控标签。
- 在后端下拉列表中,选择
fortressnet-backend-service
。
最多可能需要十分钟才能显示足够的数据。您应该很快会看到类似如下的显示内容:
这里发生的事情:
负载测试开始一次性发送大量流量。最初,负载平衡器在三个后端之间平均分配请求。请求数量很快超过了您的自动调节限制,甚至可能导致服务器返回
Backend 5xx errors
(这将在监控显示器上显示)。自动调节程序开始根据需要启动更多实例。自动调节通过扩容满足容量需求。为了最大程度降低请求延迟,Compute Engine 负载平衡器尝试将请求路由到最靠近客户端的后端。在这种情况下,由于负载测试流量来自欧洲,因此负载平衡器倾向于将更多请求路由到欧洲后端。因此,自动调节可能会在欧洲后端启动更多实例,以处理更多的请求。
在其他位置生成测试流量
假设您的网络服务在亚洲的午后也人气大增。从亚洲生成大量请求。
Console
创建另一个安装了 Siege 负载测试工具的实例。
- 转到 GCP Console 中的虚拟机实例页面。
转到“虚拟机实例”页面。 - 点击创建实例。
- 将名称设置为
asia-loadtest
。 - 在区域部分,请选择
asia-east1
。 - 点击管理、安全、磁盘、网络、单独租用以显示高级设置。您应该会看到许多标签。
- 点击管理标签。
在自动化作业下,输入以下启动脚本:
apt-get install -y siege
点击该页面底部的创建。
- 转到 GCP Console 中的虚拟机实例页面。
获取负载平衡器的 IP 地址。
- 转到 GCP Console 中的负载平衡页面。
转到“负载平衡”页面。 - 点击
fortressnet-balancer
。 - 在前端下复制 IP:端口列下的 IPV4 地址。(IPV4 地址的格式为
www.xxx.yyy.zzz
。)
- 转到 GCP Console 中的负载平衡页面。
通过 SSH 连接到负载测试实例。
- 等待
asia-loadtest
实例在名称列下出现一个绿色的对勾标记。 - 点击连接列下
asia-loadtest
上的 SSH。
- 等待
启动 siege。定位负载平衡器的 IPV4 地址。
siege -c150 http://[LOAD_BALANCER_IP_ADDRESS]
gcloud
在原始 shell 会话中,创建另一个安装了 Siege 负载测试工具的实例。
gcloud compute instances create asia-loadtest \ --network default \ --zone asia-east1-c \ --metadata startup-script='apt-get -y install siege'
获取负载平衡器的 IPV4 地址。
gcloud compute addresses list
打开新的 shell 会话,其中
gcloud
命令可用。在新的 shell 会话中,通过 SSH 连接到负载测试实例。
gcloud compute ssh --zone asia-east1-c asia-loadtest
启动 siege。定位负载平衡器的 IPV4 地址。
siege -c150 http://[LOAD_BALANCER_IP_ADDRESS]
同样,您应该会看到输出声明 The server is now under siege...
[alert] Zip encoding disabled; siege requires zlib support to enable it ** SIEGE 4.0.2 ** Preparing 150 concurrent users for battle. The server is now under siege...
监控负载平衡和自动调节
返回上次的负载平衡监控显示。最多可能需要十分钟才能显示足够的新数据。您应该很快会看到类似如下的显示内容:
这里发生的事情:
同样,负载测试再次一次性发送大量请求。最初,负载平衡器在现有的三个后端之间平均分配请求。当请求数超过您的自动调节限制时,自动调节程序会根据需要开始启动更多实例。
自动调节通过扩容满足新的容量需求。负载平衡器仍然倾向于尽可能将请求路由到最近的后端。因此,最终亚洲后端将主要接收来自亚洲的请求,欧洲后端将主要接收来自欧洲的请求,美国后端将接收所有剩余的请求。
清理
完成本自动扩缩教程后,您可以清理在 GCP 上创建的资源,以避免这些资源占用配额,日后产生费用。以下部分介绍如何删除或关闭这些资源。
删除项目
若要避免产生费用,最简单的方法是删除您为本教程创建的项目。
如需删除项目,请执行以下操作:
- 在 GCP Console 中,转到项目页面。
- 在项目列表中,选择您要删除的项目,然后点击删除 delete。
- 在对话框中输入项目 ID,然后点击关闭以删除项目。
删除实例
如需删除 Compute Engine 实例,请运行以下命令:
- 在 GCP Console 中,转到虚拟机实例页面。
- 点击要删除的实例。
- 点击页面顶部的删除 delete 以删除实例。
后续步骤
- 使用自定义 Stackdriver 指标进行自动调节。
- 根据负载平衡服务容量进行调节。
- Google Cloud Platform 上的全球负载平衡。
- 在 Google Cloud Platform 上构建可伸缩、弹性佳的网络应用。
- 亲手试用其他 Google Cloud Platform 功能。查阅我们的教程。