全球范围内自动扩缩 Compute Engine 上的 Web 服务


本教程介绍了如何使用可自动扩缩以满足容量需求的区域级 Compute Engine 托管式实例组来设置可在全球范围内使用的 Web 服务。您可以使用本教程中所述的技术在 Compute Engine 上实现您自己的全球分布式可扩缩项目。

目标

  • 部署多个启用了自动调节功能的区域 Compute Engine 托管实例组。
  • 创建跨区域负载均衡器。
  • 生成来自全球不同区域的测试流量。
  • 使用 Google Cloud 控制台直观呈现负载均衡器如何路由请求以及实例组如何通过自动扩缩来满足需求。

费用

本教程使用 Google Cloud 的计费组件,包括:

  • Compute Engine

准备工作

  1. 在 Google Cloud Console 中的项目选择器页面上,选择或创建一个 Google Cloud 项目

    转到“项目选择器”

  2. 确保您的 Google Cloud 项目已启用结算功能

  3. 启用 Compute Engine API。

    启用 API

应用架构

应用包括以下 Compute Engine 组件:

  1. 实例模板:用于在实例组中创建每个实例的模板。
  2. 实例组:根据传入流量进行自动调节的多个实例组。
  3. 负载均衡器:在实例组之间分配流量的 HTTP 负载均衡器。
  4. 实例:生成来自全球不同区域的测试流量的多个测试实例。

显示具有多个区域实例组的负载均衡器的系统架构图

设置 Web 服务

创建实例组

控制台

  1. 为实例组创建网络。

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

      转到 VPC 网络页面

    2. 点击创建 VPC 网络

    3. 名称设置为 fortressnet

    4. 子网创建模式设置为自动

    5. 点击该页面底部的创建

  2. 为该网络创建防火墙规则。此规则将允许发送到您的实例的所有 HTTP 请求。

    1. 在 Google Cloud 控制台中,转到防火墙规则页面。

      转到“防火墙规则”

    2. 点击创建防火墙规则

    3. 名称设置为 fortressnet-allow-http

    4. 对于网络,请选择 fortressnet

    5. 对于目标,请选择 All instances in the network

    6. 来源 IPv4 范围设置为 0.0.0.0/0

    7. 协议和端口字段中,选择指定的协议和端口,然后选择 tcp 复选框并输入 80

    8. 点击创建

  3. 创建实例模板。包含在每个实例上启动一个简单的 Apache 网络服务器的启动脚本。

    1. 在 Google Cloud 控制台中,转到实例模板页面。

      转到“实例模板”

    2. 点击创建实例模板

    3. 名称设置为 fort-template

    4. 机器配置字段中,选择 e2-micro(2 个 vCPU,1 GB 内存)。

    5. 高级选项部分,展开网络,然后执行以下操作:

      1. 网络接口部分中,展开网络接口以进行修改。
      2. 对于网络,请选择 fortressnet
    6. 管理部分的自动化字段中,输入以下启动脚本

      apt update && apt -y install apache2
      

    7. 点击创建

  4. 使用实例模板创建多个区域托管实例组。为每个实例组配置自动扩缩。

    1. 在 Google Cloud 控制台中,转到实例组页面。

      转到“实例组”

    2. 点击创建实例组以创建新的托管实例组。

    3. 选择新的代管式实例组(无状态)

    4. 名称设置为 us-central1-pool

    5. 对于实例模板,请选择 fort-template

    6. 对于位置,选择多个可用区

    7. 对于区域,选择 us-central1。对于可用区,将预定义值保留为选中状态。

    8. 对于自动扩缩模式,选择开启:在实例组中添加和移除实例

    9. 最小实例数设置为 1

    10. 最大实例数设置为 5

    11. 自动扩缩信号字段中,修改默认选项(CPU 利用率),并将信号类型设置为 HTTP 负载均衡利用率

    12. 目标 HTTP 负载均衡利用率设置为 80

    13. 点击完成

    14. 点击创建。对话框中的消息显示,您还必须将该实例组分配给 HTTP 负载均衡器的后端服务。

    15. 在确认对话框中,点击确认。 您可以在创建所有实例组后配置负载均衡器

    16. 重复这些步骤,创建另外两个具有不同名称的实例组:

      • 创建一个名称europe-west1-pool区域europe-west1 的组。
      • 创建一个名称asia-east1-pool区域asia-east1 的组。
  5. (可选)验证实例是否正常运行并且传送 HTTP 流量。测试一个或多个实例的外部 IP 地址。您可能需要等待一分钟,让实例完成启动过程。

    1. 在 Google Cloud 控制台中,转到虚拟机实例页面。

      转到虚拟机实例

    2. 确认每个正在运行的实例在实例组名称旁的状态列中都有绿色对勾标记。

    3. 复制实例的外部 IP 并将其粘贴到网络浏览器中。

    您应该会看到“Apache2 Debian Default Page”网页。

    如果未出现该内容,请等待片刻。

gcloud

  1. 为实例组创建网络。

    gcloud compute networks create fortressnet --subnet-mode auto
    
  2. 为该网络创建防火墙规则。此规则将允许发送到您的实例的所有 HTTP 请求。

    gcloud compute firewall-rules create fortressnet-allow-http \
        --network fortressnet \
        --allow tcp:80
    
  3. 创建实例模板。在其中添加用于在每个实例上启动一个简单的 Apache Web 服务器的启动脚本。

    gcloud compute instance-templates create fort-template \
        --machine-type e2-micro \
        --network fortressnet \
        --metadata startup-script='apt update && apt -y install apache2'
    
  4. 使用实例模板创建多个区域托管实例组。为每个实例组配置自动扩缩。

    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
    
  5. (可选)验证实例是否正常运行并且传送 HTTP 流量。测试一个或多个实例的外部 IP 地址。您可能需要等待一分钟,让实例完成启动过程。

    1. 列出实例。

      gcloud compute instances list
      

    2. STATUS 列验证实例是否 RUNNING

    3. 通过在 EXTERNAL_IP 列下查询实例的 IP 地址来检查实例。

      curl http://EXTERNAL_IP | head
      

    您应该会看到一些 HTML 文本,包括行 <title>Apache2 Debian Default Page: It works</title>

    如果未出现该内容,请等待片刻。

配置负载均衡器

负载均衡器将在您的多个后端之间分配客户端请求。

控制台

开始配置

  1. 在 Google Cloud 控制台中,转到负载均衡页面。

    转到“负载均衡”

  2. 点击创建负载均衡器
  3. 负载均衡器的类型字段中,选择应用负载均衡器 (HTTP/HTTPS),然后点击下一步
  4. 公共或内部字段中,选择公共(外部),然后点击下一步
  5. 全球或单个区域部署字段中,选择最适合全球性工作负载,然后点击下一步
  6. 负载均衡器世代字段中,选择全球外部应用负载均衡器,然后点击下一步
  7. 点击配置

基本配置

  1. 负载均衡器名称设置为 fortressnet-balancer

后端配置

  1. 创建全球外部应用负载均衡器页面上,点击后端配置
  2. 创建或选择后端服务和后端存储分区下拉菜单中,选择后端服务,然后选择创建后端服务。您应该会看到创建后端服务对话框。
  3. 将后端服务的名称设置为 fortressnet-backend-service
  4. 新建后端对话框下,将实例组设置为 asia-east1-pool
  5. 对于平衡模式,请选择速率
  6. RPS 上限设置为每个实例 100 RPS。
  7. 点击完成
  8. 点击添加后端
  9. 新建后端对话框下,将实例组设置为 europe-west1-pool
  10. 对于平衡模式,请选择速率
  11. RPS 上限设置为每个实例 100 RPS。
  12. 点击完成
  13. 点击添加后端
  14. 新建后端对话框下,将实例组设置为 us-central1-pool
  15. 对于平衡模式,请选择速率
  16. RPS 上限设置为每个实例 100 RPS。
  17. 点击完成
  18. 健康检查中,选择创建健康检查
  19. 名称设置为 http-basic-check
  20. 对于协议,请选择 HTTP
  21. 端口设置为 80
  22. 点击保存并继续
  23. 点击创建

宿主机和路径规则

  1. 创建全球外部应用负载均衡器页面的左侧面板中,点击主机和路径规则
    在本示例中,由于所有流量均将采用默认规则,我们无需配置任何主机或路径规则。因此,我们可以接受预填充的默认值

前端配置

  1. 创建全球外部应用负载均衡器页面的左侧面板中,点击前端配置
  2. 名称设置为 fortressnet-http-rule
  3. 对于 IP 版本,请选择 IPv4
  4. 对于 IP 地址,请选择创建 IP 地址
  5. 保留新的静态 IP 对话框中,将名称设置为 fortressnet-ip
  6. 点击保留并稍等片刻。
  7. 点击新建前端 IP 和端口对话框底部的完成
  8. 点击添加前端 IP 和端口
  9. 名称设置为 fortressnet-http-ipv6-rule
  10. 对于 IP 版本,请选择 IPv6
  11. 对于 IP 地址,请选择创建 IP 地址
  12. 在对话框中,将名称设置为 fortressnet-ipv6
  13. 点击保留并稍等片刻。
  14. 点击新建前端 IP 和端口对话框底部的完成

检查并最终确定

  1. 创建全球外部应用负载均衡器页面的左侧面板中,点击检查并最终确定
  2. 将设置与您打算创建的内容进行比较。
  3. 如果设置正确,请点击左侧面板底部的创建。您将返回到“负载均衡”屏幕。创建负载均衡器后,其旁边的绿色对勾标记表示它正在运行。

gcloud

后端配置

  1. 创建基本健康检查。这将检查负载均衡器后端是否对 HTTP 请求做出响应。

    gcloud compute health-checks create http http-basic-check
    
  2. 创建全局后端服务。此后端服务将接收来自负载均衡器的 HTTP 流量。

    gcloud compute backend-services create fortressnet-backend-service \
        --protocol HTTP \
        --health-checks http-basic-check \
        --global
    
  3. 将实例组添加为后端服务的区域后端。此配置将根据每个实例的最大每秒请求数 (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
    

主机和路径规则

  1. 定义网址映射。网址映射会将不同的网址路由到不同的后端服务。由于我们只有一个后端服务,因此我们只需将该后端服务设置为所有网址的默认服务即可。

    gcloud compute url-maps create fortressnet-balancer \
        --default-service fortressnet-backend-service
    
  2. 创建 HTTP 代理路由。HTTP 代理路由接受 HTTP 请求,并根据您的网址映射路由它们。在这种情况下,它会将所有请求发送到您的单个后端服务。

    gcloud compute target-http-proxies create fortressnet-http-proxy \
        --url-map fortressnet-balancer
    

前端配置

  1. 创建两个全局静态外部 IP 地址:一个用于 IPv4,另一个用于 IPv6。它们将成为负载均衡器的全局外部 IP 地址。

    gcloud compute addresses create fortressnet-ip \
        --ip-version IPV4 \
        --network-tier=PREMIUM \
        --global
    gcloud compute addresses create fortressnet-ipv6 \
        --ip-version IPV6 \
        --network-tier=PREMIUM \
        --global
    
  2. 查询负载均衡器的外部 IP 地址。

    gcloud compute addresses list
    
  3. 创建外部 IP 地址的全局转发规则。这会将 IPv4 和 IPv6 HTTP 请求均转发到您的 HTTP 代理。

    gcloud compute forwarding-rules create fortressnet-http-rule \
        --load-balancing-scheme=EXTERNAL \
        --network-tier=PREMIUM \
        --global \
        --target-http-proxy fortressnet-http-proxy \
        --ports 80 \
        --address LOAD_BALANCER_IP_ADDRESS
    
    gcloud compute forwarding-rules create fortressnet-http-ipv6-rule \
        --load-balancing-scheme=EXTERNAL \
        --network-tier=PREMIUM \
        --global \
        --target-http-proxy fortressnet-http-proxy \
        --ports 80 \
        --address LOAD_BALANCER_IPV6_ADDRESS
    

(可选)验证负载均衡器是否正常工作。您可能需要等待一到三分钟。

控制台

  1. 在 Google Cloud 控制台中,转到负载均衡页面。

    转到“负载均衡”

  2. 等待 fortressnet-balancer后端列下出现一个绿色的对勾标记。

  3. 点击 fortressnet-balancer

  4. 前端下复制 IP:端口列下的 IPv4 地址。(IPv4 地址的格式为 www.xxx.yyy.zzz。您不需要末尾的端口号 :nn。)如果缺少前端部分,请等待片刻,然后重新加载该网页。

  5. 在网络浏览器中输入 IP 地址。

您应该会看到“Apache2 Debian Default Page”网页。

如果显示“错误 404(找不到)”网页,请再等待几分钟。

gcloud

  1. 查询负载均衡器的外部 IP 地址。

    gcloud compute addresses list
    
  2. 查询 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 请求的原始防火墙。这可以防止外部客户端访问各个实例。

控制台

  1. 创建新的防火墙,仅允许来自负载均衡器和健康检查的流量。

    1. 在 Google Cloud 控制台中,转到防火墙规则页面。

      转到“防火墙规则”

    2. 点击创建防火墙规则

    3. 名称设置为 fortressnet-allow-load-balancer

    4. 对于网络,请选择 fortressnet

    5. 对于目标,请选择 All instances in the network

    6. 来源 IP 地址范围部分,键入 130.211.0.0/22 并按 Enter 键,然后键入 35.191.0.0/16 并再次按 Enter 键。

    7. 协议和端口下,选择 tcp 并输入 80

    8. 点击创建

  2. 删除旧的全部允许防火墙。

    1. 选中 fortressnet-allow-http 旁边的复选标记。
    2. 点击页面顶部的删除
    3. 在对话框中,点击删除

gcloud

  1. 创建新的防火墙,仅允许来自负载均衡器和健康检查的流量。

    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
    
  2. 删除旧的全部允许防火墙。

    gcloud compute firewall-rules delete fortressnet-allow-http -q
    

(可选)验证自动扩缩和负载均衡功能是否正常运行

生成一些测试流量

假设现在是欧洲的早晨,您的网络服务突然人气暴增。从欧洲突然生成大量客户端请求。

控制台

  1. 创建安装了 Siege 负载测试工具的实例。

    1. 在 Google Cloud 控制台中,转到创建实例页面。

      转到“创建实例”

    2. 名称设置为 europe-loadtest

    3. 对于区域,请选择 europe-west1

    4. 对于高级设置,请展开网络、磁盘、安全、管理、单独租用部分,然后执行以下操作:

      1. 展开管理部分。
      2. 自动化字段中,输入以下启动脚本:
        apt -y install siege
        
    5. 如需创建虚拟机,请点击创建

  2. 获取负载均衡器的 IPv4 地址。

    1. 在 Google Cloud 控制台中,转到负载均衡页面。

      转到“负载均衡”

    2. 点击 fortressnet-balancer

    3. 前端下复制 IP:端口列下的 IPv4 地址。(IPv4 地址的格式为 www.xxx.yyy.zzz。)

  3. 通过 SSH 连接到负载测试实例。

    1. 在 Google Cloud 控制台中,转到虚拟机实例页面。

      转到虚拟机实例

    2. 等待 europe-loadtest 实例的名称列下出现一个绿色的对勾标记。

    3. 点击连接列下 europe-loadtest 上的 SSH

  4. 启动 siege。定位负载均衡器的 IPv4 地址。

    siege -c150 http://LOAD_BALANCER_IP_ADDRESS
    

gcloud

  1. 创建安装了 Siege 负载测试工具的实例。

    gcloud compute instances create europe-loadtest \
        --network default \
        --zone europe-west1-c \
        --metadata startup-script='apt -y install siege'
    
  2. 获取负载均衡器的 IPv4 地址。

    gcloud compute addresses list
    
  3. 打开新的 shell 会话,其中 gcloud 命令可用。

    1. 在新的 shell 会话中,通过 SSH 连接到负载测试实例。

      gcloud compute ssh --zone europe-west1-c europe-loadtest
      
    2. 启动 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...

监控负载均衡和自动扩缩

  1. 在 Google Cloud 控制台中,转到负载均衡页面。

    转到“负载均衡”

  2. 点击名为 fortressnet-balancer 的负载均衡器。

  3. 点击监控标签。

  4. 后端下拉列表中,选择 fortressnet-backend-service

最多可能需要十分钟才能显示足够的数据。您应该很快会看到类似如下的显示内容:

显示在所有三个后端之间平均分配来自欧洲的请求的 Google Cloud 控制台监控显示屏。

这里发生的事情:

  1. 负载测试开始一次性发送大量流量。最初,负载均衡器在三个后端之间平均分配请求。请求数量很快超过了您的自动扩缩限制,甚至可能导致服务器返回 Backend 5xx errors(这将在监控显示器上显示)。自动扩缩程序开始根据需要启动更多实例。

  2. 自动调节通过扩容满足容量需求。为了最大程度降低请求延迟,Compute Engine 负载均衡器尝试将请求路由到最靠近客户端的后端。在这种情况下,由于负载测试流量来自欧洲,因此负载均衡器倾向于将更多请求路由到欧洲后端。因此,自动调节可能会在欧洲后端启动更多实例,以处理更多的请求。

在其他位置生成测试流量

假设您的网络服务在亚洲的午后也人气大增。从亚洲生成大量请求。

控制台

  1. 创建另一个安装了 Siege 负载测试工具的实例。

    1. 在 Google Cloud 控制台中,转到虚拟机实例页面。

      转到虚拟机实例

    2. 点击创建实例

    3. 名称设置为 asia-loadtest

    4. 对于区域,请选择 asia-east1

    5. 点击网络、磁盘、安全、管理、单租户以查看高级设置。

    6. 点击管理标签页。

    7. 自动化下,输入以下启动脚本

      apt -y install siege
      

    8. 点击该页面底部的创建

  2. 获取负载均衡器的 IP 地址。

    1. 在 Google Cloud 控制台中,转到负载均衡页面。

      转到“负载均衡”

    2. 点击 fortressnet-balancer

    3. 前端下复制 IP:端口列下的 IPv4 地址。(IPv4 地址的格式为 www.xxx.yyy.zzz。)

  3. 通过 SSH 连接到负载测试实例。

    1. 等待 asia-loadtest 实例的名称列下出现一个绿色的对勾标记。
    2. 点击连接列下 asia-loadtest 上的 SSH
  4. 启动 siege。定位负载均衡器的 IPv4 地址。

    siege -c150 http://LOAD_BALANCER_IP_ADDRESS
    

gcloud

  1. 在原始 shell 会话中,创建另一个安装了 Siege 负载测试工具的实例。

    gcloud compute instances create asia-loadtest \
        --network default \
        --zone asia-east1-c \
        --metadata startup-script='apt -y install siege'
    
  2. 获取负载均衡器的 IPv4 地址。

    gcloud compute addresses list
    
  3. 打开新的 shell 会话,其中 gcloud 命令可用。

    1. 在新的 shell 会话中,通过 SSH 连接到负载测试实例。

      gcloud compute ssh --zone asia-east1-c asia-loadtest
      
    2. 启动 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...

监控负载均衡和自动扩缩

返回上次的负载均衡监控显示。最多可能需要十分钟才能显示足够的新数据。您应该很快会看到类似如下的显示内容:

显示在所有三个后端之间分配来自欧洲和亚洲的请求的 Google Cloud 控制台监控显示屏

这里发生的事情:

  1. 同样,负载测试再次一次性发送大量请求。最初,负载均衡器在现有的三个后端之间平均分配请求。当请求数超过您的自动调节限制时,自动调节程序会根据需要开始启动更多实例。

  2. 自动扩缩通过扩容满足新的容量需求。负载均衡器仍然倾向于将请求路由到最近的可用后端。因此,最终亚洲后端将主要接收来自亚洲的请求,欧洲后端将主要接收来自欧洲的请求,美国后端将接收所有其他请求。

清理

完成本教程后,您可以清理您创建的资源,让它们停止使用配额,以免产生费用。以下部分介绍如何删除或关闭这些资源。

删除项目

为了避免产生费用,最简单的方法是删除您为本教程创建的项目。

如需删除项目,请执行以下操作:

  1. 在 Google Cloud 控制台中,进入管理资源页面。

    转到“管理资源”

  2. 在项目列表中,选择要删除的项目,然后点击删除
  3. 在对话框中输入项目 ID,然后点击关闭以删除项目。

删除实例

如需删除 Compute Engine 实例,请执行以下操作:

  1. 在 Google Cloud 控制台中,转到虚拟机实例页面。

    转到“虚拟机实例”

  2. 选中要删除的实例。
  3. 如需删除实例,请点击更多操作,点击删除,然后按照说明操作。

后续步骤