为高可扩缩性应用使用自动扩缩功能

本教程介绍了如何使用自动扩缩功能来自动调整正在托管应用的虚拟机实例的数量,从而使您的应用能够适应不同的流量。

如需使用自动扩缩功能,请在托管实例组上托管应用。代管实例组是可以作为单个实体管理并且全都运行同一应用的实例的集合。当代管实例组启用自动扩缩功能后,实例组中的虚拟机数量会根据您为自动扩缩政策指定的目标值自动增加(横向扩容)或减少(缩减)。

本教程包含一系列详细步骤,说明了如何在代管实例组上启动 Web 应用,如何设置自动扩缩功能,如何配置网络访问权限,以及如何通过模拟负载峰值和低谷来观察自动扩缩情况。完成本教程需要大约 20 分钟,具体取决于您对这些功能的熟悉程度。

目标

  • 在托管实例组上启动演示 Web 应用。
  • 通过模拟流量峰值和低谷来观察自动扩缩的影响。

费用

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

  • Compute Engine

请使用价格计算器根据您的预计使用情况来估算费用。 Google Cloud 新用户可能有资格申请免费试用

准备工作

  1. 登录您的 Google 帐号。

    如果您还没有 Google 帐号,请注册一个新帐号

  2. 在 Cloud Console 的项目选择器页面上,选择或创建 Cloud 项目。

    转到项目选择器页面

  3. 确保您的 Google Cloud 项目已启用结算功能。 了解如何确认您的项目已启用结算功能

应用架构

应用包括以下 Compute Engine 组件:

  • 防火墙规则:借助 Google Cloud 防火墙,您可以允许或拒绝流向您的实例的流量。
  • 实例模板:用于在托管实例组中创建各个虚拟机实例的模板。
  • 区域托管实例组:可跨多个地区运行同一应用的一组虚拟机实例。

启动 Web 应用

本教程以存储在 GitHub 上的 Web 应用为例。如果您想详细了解该应用的实现方式,请参阅 Google Cloud GitHub 代码库

通过在实例模板中添加启动脚本的方式在托管实例组中的每个虚拟机上启动 Web 应用。如需允许 HTTP 流量进入 Web 应用,请创建一条防火墙规则。

创建防火墙规则

创建一条防火墙规则以允许 HTTP 流量进入 Web 应用:

  1. 在 Cloud Console 中,转到防火墙页面。
    转到“防火墙”页面
  2. 点击创建防火墙规则
  3. 名称下,输入 default-allow-http
  4. 网络设置为 default
  5. 设置目标以选择 Specified target tags
  6. 目标标记下,输入 http-server
  7. 来源过滤条件设置为 IP ranges
  8. 来源 IP 地址范围下,输入 0.0.0.0/0 以允许所有 IP 地址访问。
  9. 端口和协议下,选择指定的协议和端口
    然后,选中 tcp 并输入 80允许访问 HTTP 流量
  10. 点击创建

创建实例模板

创建用于在实例启动时启动演示 Web 应用的实例模板:

  1. 在 Cloud Console 中,转到实例模板页面。
    转到“实例模板”页面
  2. 点击创建实例模板
  3. 名称下,输入 autoscaling-web-app-template
  4. 机器配置下,将机器类型设置为 e2-standard-2
  5. 启动磁盘下,将映像设置为 Debian GNU/Linux 9 (stretch)
  6. 防火墙下,选中允许 HTTP 流量复选框。这会将 http-server 网络标记应用于根据此模板创建的每个实例。
  7. 点击管理、安全、磁盘、网络、单独租用以显示高级设置。您应该会看到许多标签页。
  8. 管理标签页下,找到自动化并输入以下启动脚本

    sudo apt update && sudo apt -y install git gunicorn3 python3-pip
    git clone https://github.com/GoogleCloudPlatform/python-docs-samples.git
    cd python-docs-samples/compute/managed-instances/demo
    sudo pip3 install -r requirements.txt
    sudo gunicorn3 --bind 0.0.0.0:80 app:app --daemon
    

    此脚本可使每个实例在启动期间运行 Web 应用。

  9. 点击创建

创建托管实例组

创建区域实例组以开始运行 Web 应用:

  1. 在 Cloud Console 中,转到实例组页面。
    转到“实例组”页面
  2. 点击创建实例组以创建一个新的实例组。
  3. 名称下,输入 autoscaling-web-app-group
  4. 位置下,选择多个地区

  5. 区域下,选择 us-central1

  6. 点击配置地区下拉菜单以显示地区。 选择以下地区:

    • us-central1-b
    • us-central1-c
    • us-central1-f
  7. 实例模板下,选择 autoscaling-web-app-template

  8. 为实例组配置自动扩缩功能:

    1. 自动扩缩下,选择开启
    2. 自动扩缩政策设置为 CPU 使用率。如需详细了解其他自动扩缩政策,请参阅自动扩缩政策和目标利用率

    3. 目标 CPU 使用率设置为 60%。

    4. 实例数下限设置为 3

    5. 实例数上限设置为 6

    6. 冷却期设置为 120 秒。

  9. 运行状况检查下,选择不检查运行状况

  10. 点击创建。这会将您重定向到实例组页面。

  11. 验证您的实例正在运行,步骤如下:

    1. 在 Cloud Console 的实例组页面上,点击 autoscaling-web-app-group 查看该组中的实例。
    2. 外部 IP 下,点击一个 IP 地址以连接相应实例。一个新标签页即会打开,其中会显示该演示 Web 应用:

      演示 Web 应用,其中列出了有关实例的信息并包含操作按钮。

      完成后,关闭演示 Web 应用对应的浏览器标签页。

观察自动扩缩

如需详细了解自动扩缩行为,请参阅了解自动扩缩决策

监控自动扩缩

您创建的实例组使用基于 CPU 使用率自动扩缩政策。这意味着自动扩缩程序会根据需要扩缩实例组,以保持 60% 的目标 CPU 利用率。

如需监控实例组的规模和平均 CPU 利用率,请使用 Cloud Console 中的自动扩缩图表

  1. autoscaling-web-app-group 实例组对应的实例组页面上,点击监控标签页。
  2. 如需监控 CPU 利用率和自动扩缩情况,请从左侧下拉菜单中选择自动扩缩的实例数,然后从右侧下拉菜单中选择 cpu

    这会显示两个图表:

    • 顶部图表显示规模,即实例组中的实例数。
    • 底部图表显示利用率(即实例组的平均 CPU 利用率)和容量(即实例组的累计目标 CPU 利用率)。

    自动扩缩功能会尽可能尝试通过更改规模来使容量利用率相匹配。

保持此窗口处于打开状态。

模拟横向扩容

当实例组的平均 CPU 利用率显著高于目标值时,会发生横向扩容。在横向扩容期间,自动扩缩器会逐渐增大实例组的规模,直到 CPU 利用率降为目标 CPU 利用率值,或者直到实例组规模等于实例数上限(设置为 6)。

如需触发横向扩容,请增加实例的 CPU 利用率:

  1. 通过 Cloud Console 中的 Cloud Shell 打开终端。

    打开 Cloud Shell

    Cloud Shell 会在 Cloud Console 底部打开。该会话可能需要几秒钟来完成初始化。

  2. 为项目 ID 创建本地 bash 变量:

    export PROJECT_ID=[PROJECT_ID]
    

    其中,PROJECT_ID 是当前项目的 ID,它显示在 Cloud Shell 中的每个新行上:

    user@cloudshell:~ ([PROJECT_ID])$
    
  3. 运行以下 bash 脚本。此脚本会导致演示 Web 应用实例的负载增加,从而增加 CPU 利用率。 几分钟后,CPU 利用率将超过目标值,从而提示自动扩缩功能扩大实例组规模。

    export MACHINES=$(gcloud --project=$PROJECT_ID compute instances list --format="csv(name,networkInterfaces[0].accessConfigs[0].natIP)" | grep "autoscaling-web-app-group")
    for i in $MACHINES;
    do
      NAME=$(echo "$i" | cut -f1 -d,)
      IP=$(echo "$i" | cut -f2 -d,)
      echo "Simulating high load for instance $NAME"
      curl -q -s "http://$IP/startLoad" >/dev/null --retry 2
    done
    
  4. 在 Cloud Console 中打开 监控标签页。

    几分钟后,监控标签将显示 CPU 利用率已增加,这会触发自动扩缩功能通过扩大实例组规模来增加容量

    监视器显示 CPU 利用率已增加。不久之后,该组的规模从 3 个实例增加到 6 个实例

    您可能还注意到,现在成员标签下列出了 6 个实例。

保持两个窗口都处于打开状态。

模拟缩减

当实例组的平均 CPU 利用率显著低于目标值时,会发生缩减。在缩减期间,自动扩缩器会逐渐减小实例组的规模,直到 CPU 利用率增至目标 CPU 利用率,或者直到实例组规模等于实例数下限(设置为 3)。

如需触发缩减,请降低实例的 CPU 利用率:

  1. 运行以下 bash 脚本。此脚本会导致演示 Web 应用实例的负载减少,从而降低 CPU 利用率。 几分钟后,CPU 利用率将降至目标值以下,从而提示自动扩缩程序缩小实例组规模。

    export MACHINES=$(gcloud --project=$PROJECT_ID compute instances list --format="csv(name,networkInterfaces[0].accessConfigs[0].natIP)" | grep "autoscaling-web-app-group")
    for i in $MACHINES;
    do
      NAME=$(echo "$i" | cut -f1 -d,)
      IP=$(echo "$i" | cut -f2 -d,)
      echo "Simulating low load for instance $NAME"
      curl -q -s "http://$IP/stopLoad" >/dev/null --retry 2
    done
    
  2. 打开 Cloud Console 中的监控标签页。

    几分钟后,监控标签页将显示 CPU 利用率下降。在 10 分钟稳定期(证实负载一致在下降)后,自动扩缩会通过减小实例组规模来减少容量

    监控器显示 CPU 利用率已降低。大约 10 分钟后,该组的规模从 6 个实例缩减到 3 个实例。

    您可能还注意到,成员标签下仅列出了 3 个实例。

完成后关闭这两个窗口。

清理

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

如果您为本教程创建了单独的项目,请删除整个项目。 否则,如果项目中包含您要保留的资源,则只删除在本教程中创建的资源。

删除项目

  1. 在 Cloud Console 中,转到管理资源页面。

    转到“管理资源”页面

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

删除特定资源

删除实例组

  1. 在 Cloud Console 中,转到实例组页面。

    转到“实例组”页面

  2. 点击您的 autoscaling-web-app-group 实例组对应的复选框。
  3. 点击删除 以删除实例组。

删除实例模板

  1. 在 Cloud Console 中,转到实例模板页面。

    转到“实例模板”页面

  2. 选中 autoscaling-web-app-template 旁边的复选框。

  3. 点击页面顶部的 删除。在新窗口中,点击删除以确认删除。

删除防火墙规则

  1. 在 Cloud Console 中,转到防火墙规则页面。

    转到“防火墙规则”页面

  2. 选中名为 default-allow-http 的防火墙规则旁边的复选框。

  3. 点击页面顶部的 删除。在新窗口中,点击删除以确认删除。

后续步骤