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

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

目标

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

费用

本教程使用 GCP 的可计费组件,包括:

  • Compute Engine

准备工作

  1. 选择或创建 Google Cloud Platform 项目。

    转到“管理资源”页面

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

    了解如何启用结算功能

  3. 启用Compute Engine API。

    启用 API

应用架构

应用包括以下 Compute Engine 组件:

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

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

设置网络服务

创建实例组

Console

  1. 为实例组创建网络。

    1. 转到 GCP Console 中的 VPC 网络页面。
      转到“VPC 网络”页面
    2. 点击创建 VPC 网络
    3. 名称设置为 fortressnet
    4. 子网创建模式设置为自动
    5. 点击该页面底部的创建
  2. 为该网络创建防火墙规则。此规则将允许发送到您的实例的所有 HTTP 请求。

    1. 转到 GCP Console 中的防火墙规则页面。
      转到“防火墙规则”页面
    2. 点击创建防火墙规则
    3. 名称设置为 fortressnet-allow-http
    4. 网络部分,请选择 fortressnet
    5. 目标部分,请选择 All instances in the network
    6. 来源 IP 地址范围设置为 0.0.0.0/0
    7. 协议和端口下,选择 tcp 并输入 80
    8. 点击创建
  3. 创建实例模板。包含在每个实例上启动一个简单的 Apache 网络服务器的启动脚本。

    1. 转到 GCP Console 中的实例模板页面。
      转到“实例模板”页面
    2. 点击创建实例模板
    3. 名称设置为 fort-template
    4. 机器配置部分,请选择 micro (f1-micro)。
    5. 点击管理、安全、磁盘、网络、单独租用以显示高级设置。您应该会看到许多标签。
    6. 点击网络标签。
    7. 网络部分,请选择 fortressnet
    8. 点击管理标签。
    9. 自动化作业下,输入以下启动脚本

      apt-get update && apt-get install -y apache2
      

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

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

    1. 转到 GCP Console 中的实例组页面。
      转到“实例组”页面
    2. 点击创建实例组模板
    3. 名称设置为 us-central1-pool
    4. 位置部分,请选择 Multi-zone
    5. 区域部分,请选择 us-central1
    6. 实例模板部分,请选择 fort-template
    7. 对于自动调节,请选择开启
    8. 自动扩缩的依据部分,请选择 HTTP load balancing usage
    9. 目标负载平衡使用率设置为 80
    10. 最小实例数设置为 1
    11. 最大实例数设置为 5
    12. 点击创建
    13. 重复这些步骤,创建另外两个具有不同名称的实例组:
      • 创建一个名称europe-west1-pool区域europe-west1 的组。
      • 创建一个名称asia-east1-pool区域asia-east1 的组。
  5. (可选)验证实例是否正常运行并且传送 HTTP 流量。测试一个或多个实例的外部 IP 地址。您可能需要等待一分钟,让实例完成启动过程。

    1. 转到 GCP Console 中的虚拟机实例页面。
      转到“虚拟机实例”页面
    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 网络服务器的启动脚本。

    gcloud compute instance-templates create fort-template \
        --machine-type f1-micro \
        --network fortressnet \
        --metadata startup-script='apt-get update && apt-get install -y 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>

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

配置负载平衡器

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

Console

开始配置负载平衡器

  1. 转到 GCP Console 中的负载平衡页面。
    转到“负载平衡”页面
  2. 点击创建负载平衡器
  3. HTTP(S) 负载平衡下,点击开始配置
  4. 名称设置为 fortressnet-balancer

后端配置

  1. 新建 HTTP(S) 负载平衡器页面上,点击后端配置
  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. 新建 HTTP(S) 负载平衡器页面的左侧面板上,点击主机和路径规则
    在本例中,由于所有流量均将采用默认规则,我们无需配置任何主机或路径规则。因此,我们可以接受预填充的默认值

前端配置

  1. 新建 HTTP(S) 负载平衡器页面的左侧面板上,点击前端配置
  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. 新建 HTTP(S) 负载平衡器页面的左侧面板上,点击检查并最终确定
  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
    --global gcloud compute addresses create fortressnet-ipv6
    --ip-version IPV6
    --global

  2. 查询负载平衡器的外部 IP 地址。

    gcloud compute addresses list
    

  3. 创建外部 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

  1. 转到 GCP Console 中的负载平衡页面。
    转到“负载平衡”页面
  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 请求的原始防火墙。这可以防止外部客户端访问各个实例。

Console

  1. 创建新的防火墙,仅允许来自负载平衡器和运行状况检查的流量。

    1. 转到 GCP Console 中的防火墙规则页面。
      转到“防火墙规则”页面
    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
    

(可选)验证自动调节和负载平衡功能是否正常运行

生成一些测试流量

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

Console

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

    1. 转到 GCP Console 中的虚拟机实例页面。
      转到“虚拟机实例”页面
    2. 点击创建实例
    3. 名称设置为 europe-loadtest
    4. 区域部分,请选择 europe-west1
    5. 点击管理、安全、磁盘、网络、单独租用以显示高级设置。您应该会看到许多标签。
    6. 点击管理标签。
    7. 自动化作业下,输入以下启动脚本

      apt-get install -y siege
      

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

  2. 获取负载平衡器的 IPV4 地址。

    1. 转到 GCP Console 中的负载平衡页面。
      转到“负载平衡”页面
    2. 点击 fortressnet-balancer
    3. 前端下复制 IP:端口列下的 IPV4 地址。(IPV4 地址的格式为 www.xxx.yyy.zzz。)
  3. 通过 SSH 连接到负载测试实例。

    1. 转到 GCP Console 中的虚拟机实例页面。
      转到“虚拟机实例”页面
    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-get -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. 转到 GCP Console 中的负载平衡页面。
    转到“负载平衡”页面
  2. 点击名为 fortressnet-balancer 的负载平衡器。
  3. 点击监控标签。
  4. 后端下拉列表中,选择 fortressnet-backend-service

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

显示在所有三个后端中平均分配来自欧洲的请求的 GCP Console 监控显示屏

这里发生的事情:

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

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

在其他位置生成测试流量

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

Console

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

    1. 转到 GCP Console 中的虚拟机实例页面。
      转到“虚拟机实例”页面
    2. 点击创建实例
    3. 名称设置为 asia-loadtest
    4. 区域部分,请选择 asia-east1
    5. 点击管理、安全、磁盘、网络、单独租用以显示高级设置。您应该会看到许多标签。
    6. 点击管理标签。
    7. 自动化作业下,输入以下启动脚本

      apt-get install -y siege
      

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

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

    1. 转到 GCP Console 中的负载平衡页面。
      转到“负载平衡”页面
    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-get -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...

监控负载平衡和自动调节

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

显示在所有三个后端中分配来自欧洲和亚洲的请求的 GCP Console 监控显示屏

这里发生的事情:

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

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

清理

完成本自动扩缩教程后,您可以清理在 GCP 上创建的资源,以避免这些资源占用配额,日后产生费用。以下部分介绍如何删除或关闭这些资源。

删除项目

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

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

  1. 在 GCP Console 中,转到项目页面。

    转到“项目”页面

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

删除实例

如需删除 Compute Engine 实例,请运行以下命令:

  1. 在 GCP Console 中,转到虚拟机实例页面。

    转到“虚拟机实例”页面

  2. 点击要删除的实例。
  3. 点击页面顶部的删除 delete 以删除实例。

后续步骤

此页内容是否有用?请给出您的反馈和评价:

发送以下问题的反馈:

此网页
Compute Engine 文档