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


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

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

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

目标

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

费用

在本文档中,您将使用 Google Cloud 的以下收费组件:

  • Compute Engine

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

准备工作

  1. Sign in to your Google Cloud account. If you're new to Google Cloud, create an account to evaluate how our products perform in real-world scenarios. New customers also get $300 in free credits to run, test, and deploy workloads.
  2. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Go to project selector

  3. Make sure that billing is enabled for your Google Cloud project.

  4. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Go to project selector

  5. Make sure that billing is enabled for your Google Cloud project.

应用架构

该应用包括以下 Compute Engine 组件:

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

启动 Web 应用

本教程以存储在 GitHub 上的 Web 应用为例。如果您想详细了解该应用的实现方式,请参阅 GitHub 上的 GoogleCloudPlatform/python-docs-samples 仓库。

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

创建防火墙规则

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

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

    转到防火墙

  2. 点击创建防火墙规则

  3. 名称下,输入 default-allow-http

  4. 网络设置为 default

  5. 设置目标以选择 Specified target tags

  6. 目标标记下,输入 http-server

  7. 来源过滤条件设置为 IPv4 ranges

  8. 来源 IPv4 范围下,输入 0.0.0.0/0

    以允许所有 IP 地址访问。

  9. 协议和端口下,选择指定的协议和端口。 然后,选中 TCP 并输入 80允许访问 HTTP 流量

  10. 点击创建

创建实例模板

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

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

    转到“实例模板”

  2. 点击创建实例模板

  3. 名称下,输入 autoscaling-web-app-template

  4. 机器配置下,将机器类型设置为 e2-standard-2

  5. 防火墙下,选中允许 HTTP 流量复选框。这会将 http-server 网络标记应用于根据此模板创建的每个实例。

  6. 展开高级选项部分以查看高级设置。

  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. 在 Google Cloud 控制台中,转到实例组页面。

    转到“实例组”

  2. 点击创建实例组以创建一个新的实例组。

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

  4. 对于名称,输入 autoscaling-web-app-group

  5. 对于实例模板,请选择 autoscaling-web-app-template

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

  7. 对于区域,选择 us-central1

  8. 对于可用区,请从下拉列表中选择以下可用区:

    • us-central1-b
    • us-central1-c
    • us-central1-f
  9. 为实例组配置自动扩缩功能:

    1. 对于自动扩缩模式,选择开启:在实例组中添加和移除实例
    2. 实例数下限设置为 3

    3. 实例数上限设置为 6

    4. 初始化期设置为 120 秒。

    5. 自动扩缩指标下,选择 CPU 利用率作为指标类型。如需详细了解自动扩缩指标,请参阅自动扩缩政策

    6. 目标 CPU 利用率设置为 60

    7. 点击完成

  10. 自动修复下方,从健康检查下拉列表中选择不检查健康状况

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

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

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

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

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

观察自动扩缩

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

监控自动扩缩

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

如需监控实例组的大小和 CPU 利用率,请使用 Google Cloud 控制台中的自动扩缩图表

  1. autoscaling-web-app-group 实例组的实例组页面上,点击监控标签。
  2. 您可以通过组大小图表监控自动扩缩情况。该图表显示实例,表示一段时间内组中的虚拟机实例数量。
  3. 可选:要监控自动扩缩容量与利用率,请参阅自动扩缩器利用率 (CPU) 图表。该图表会显示利用率(实例组中虚拟机实例的总 CPU 利用率)和容量(实例组的累计目标 CPU 利用率,即目标 CPU 利用率乘以虚拟机实例数)。

    自动扩缩功能会尽可能尝试通过更改实例数量来让容量利用率相匹配。

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

模拟横向扩容

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

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

  1. 在 Google Cloud 控制台中,打开 Cloud Shell

    打开 Cloud Shell

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

  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. 打开 Google Cloud 控制台中的 Monitoring 标签页。

    几分钟后,监控标签页显示 CPU 利用率增加了,这可通过增加实例数来触发自动扩缩以增加容量

    您可能还注意到,现在概览标签页下列出了 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. 打开 Google Cloud 控制台中的 Monitoring 标签页。

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

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

完成后关闭这两个窗口。

清理

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

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

删除项目

  1. In the Google Cloud console, go to the Manage resources page.

    Go to Manage resources

  2. In the project list, select the project that you want to delete, and then click Delete.
  3. In the dialog, type the project ID, and then click Shut down to delete the project.

删除特定资源

删除实例组

  1. In the Google Cloud console, go to the Instance groups page.

    Go to Instance groups

  2. Select the checkbox for your autoscaling-web-app-group instance group.
  3. To delete the instance group, click Delete.

删除实例模板

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

    转到“实例模板”

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

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

删除防火墙规则

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

    转到“防火墙规则”

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

  3. 点击 删除。 在新窗口中,点击删除以确认删除。

后续步骤