根据 Cloud Monitoring 指标进行缩放

您可以设置自动扩缩程序,以便根据以下指标类型进行扩缩:

  • 使用实例指标进行扩缩,其中,所选指标提供了托管实例组中每个实例的数据,指示了资源利用率。
  • 使用实例组指标(Beta 版进行扩缩,其中,实例组根据特定的指标进行扩缩,该指标提供了与整个托管实例组相关的值。

这些指标可以是 Cloud Monitoring 服务提供的标准指标,也可以是您创建的自定义 Cloud Monitoring 指标。

准备工作

实例指标

实例指标分别提供了组中每个实例的数据。 这些指标提供了托管实例组中每个实例的数据,指示了资源利用率。对于实例指标,实例组无法将大小扩缩到 1 以下,因为自动扩缩程序需要至少一个正在运行的实例的相关指标才能操作。

如果您需要使用非特定于个别实例的 Cloud Monitoring 指标进行扩缩,或者有时需要将实例组缩减为零个实例,您可以将实例配置为改用实例组指标进行扩缩。

标准的实例指标

Cloud Monitoring 提供一组标准指标,您可以使用这些指标监控虚拟机 (VM) 实例。但是,并非所有标准指标都是自动扩缩程序可以使用的有效利用率指标。

用于扩缩的有效利用率指标符合以下条件:

  • 标准指标必须包含 gce_instance 受监控的资源的数据。您可以使用 timeSeries.list API 调用来验证特定指标是否导出此资源的数据。

  • 标准指标描述了实例的繁忙程度,指标值根据组中虚拟机实例的数量成比例增加或减少。

以下指标无效,因为该值不会根据使用量发生更改,并且自动扩缩程序无法使用该值按比例进行扩缩:

compute.googleapis.com/instance/cpu/reserved_cores

选择要用于自动扩缩程序的标准指标后,您可以配置使用该指标自动扩缩的功能

自定义指标

您可以使用 Cloud Monitoring 创建自定义指标,并将自己的监控数据写入 Monitoring 服务。借助此方法,您可以并行访问标准 Google Cloud 数据和自定义监控数据,并且使用您熟悉的数据结构和一致的查询语法。如果您拥有自定义指标,则可以选择根据这些指标中的数据进行扩缩。

前提条件

如需使用自定义指标,您必须先执行以下操作:

  • 创建自定义指标。如需了解如何创建自定义指标,请参阅使用自定义指标
  • 设置托管实例组,以从托管实例组中的所有实例导出自定义指标。

选择有效的自定义指标

并非所有自定义指标都可以被自动扩缩程序使用。如需选择有效的自定义指标,指标必须具有以下所有属性:

  • 指标必须是实例指标。指标必须分别导出与每个特定 Compute Engine 实例相关的数据。
  • 导出的实例值必须与 gce_instance 受监控的资源相关联,该资源包含以下标签:
    • zone - 实例所在地区的名称。
    • instance_id - 分配给实例的唯一数字 ID 的值。
  • 指标必须至少每 60 秒导出一次数据。如果您按照比 60 秒更短的间隔时间导出数据,自动扩缩程序可以更快地响应负载变化。如果您按照比 60 秒更长的间隔时间导出数据,自动扩缩程序可能无法足够快速地响应负载变化。
  • 指标必须是有效的利用率指标,这意味着您可以使用指标中的数据来按比例增加或缩减虚拟机的数量。
  • 指标必须导出 int64double 数据值。

如需让自动扩缩程序使用自定义指标,您必须从托管实例组中的所有实例导出此自定义指标的数据。

注意:如需获取实例的数字 ID,您可以在实例中请求获取元数据服务器的 ID 属性。例如,您可以通过“curl”执行此操作:
curl http://metadata.google.internal/computeMetadata/v1/instance/id -H Metadata-Flavor:Google
如需详细了解如何使用元数据服务器,请参阅存储和检索实例元数据

配置使用实例监控指标自动扩缩的功能

无论是标准指标还是自定义指标,设置自动扩缩程序的过程都是相同的。如需创建使用 Cloud Monitoring 指标的自动扩缩程序,您必须提供指标标识符、所需的目标利用率级别和利用率目标类型。以下内容简要介绍了其中每个属性:

  • 指标标识符:要使用的指标的名称。如果使用自定义指标,则您在创建该指标时定义了此名称。标识符具有以下格式:

    custom.googleapis.com/path/to/metric
        

    如需详细了解如何创建、浏览和读取指标,请参阅使用自定义指标

  • 目标利用率级别:自动扩缩程序必须维持的级别。 此数据必须为正数。 例如,24.51100 均为可接受的值。请注意,此数据与 CPU 和负载平衡不同,后两者的目标利用率级别必须是介于 0.0 和 1.0 之间的浮点值。

  • 目标类型:自动扩缩程序计算从实例收集的数据的方式。可能的目标类型如下:

    • GAUGE。自动扩缩程序会计算过去几分钟收集的数据的平均值,并将该值与自动扩缩程序的目标利用率值进行比较。
    • DELTA_PER_MINUTE。自动扩缩程序会计算每分钟的平均增长率,并将该增长率与目标利用率进行比较。
    • DELTA_PER_SECOND。自动扩缩程序会计算每秒的平均增长率,并将该增长率与目标利用率进行比较。

    为了进行准确的比较,如果您以秒为单位设置目标利用率,请使用 DELTA_PER_SECOND 作为自动扩缩程序的目标类型。同样,如果您以分钟为单位设置目标利用率,请使用 DELTA_PER_MINUTE 作为自动扩缩程序的目标类型。

控制台

对于区域托管实例组和单地区托管实例组而言,用于配置自动扩缩的说明有所不同。区域托管实例组不支持对实例指标进行过滤。

如需为区域(多地区)托管实例组配置自动扩缩功能,请执行以下操作:

  1. 转到“实例组”页面
  2. 如果您没有实例组,请创建一个实例组。 否则,请从列表中点击实例组的名称以打开实例组详情页面。实例组必须为区域实例组。
  3. 在实例组详情页面上,点击修改组按钮。
  4. 自动扩缩下,选择开启以启用自动扩缩。
  5. 自动扩缩的依据部分中,选择 Stackdriver Monitoring 指标
  6. 指标标识符部分中,按以下格式输入指标名称:example.googleapis.com/path/to/metric
  7. 目标部分中,指定目标值。
  8. 目标类型部分中,指定与指标的测量粒度对应的目标类型。
  9. 准备好后,请保存所做的更改。

如需为单地区托管实例组配置自动扩缩功能,请执行以下操作:

  1. 转到“实例组”页面
  2. 如果您没有实例组,请创建一个实例组。 否则,请点击实例组的名称以打开实例组详情页面。实例组必须为单地区实例组。
  3. 在实例组详情页面上,点击修改组按钮。
  4. 自动扩缩下,选择开启以启用自动扩缩。
  5. 自动扩缩的依据部分中,选择 Stackdriver Monitoring 指标
  6. 指标导出范围部分中,选择时间序列(针对单个实例)以使用实例指标配置自动扩缩。
  7. 指标标识符部分中,按以下格式输入指标名称:example.googleapis.com/path/to/metric
  8. 附加过滤条件表达式 (Additional filter expression) 部分中,您可以视需要输入一个过滤条件,以使用具有多个流或标签的指标中的各个值。如需了解详情,请参阅过滤实例指标
  9. 利用率目标部分中,指定目标值。
  10. 利用率目标类型部分中,验证目标类型是否与指标的测量种类对应。
  11. 准备好后,请保存所做的更改。

gcloud

例如,在 gcloud 命令行工具中,以下命令会创建使用 GAUGE 目标类型的自动扩缩程序。创建自动扩缩程序时,不仅需要 --custom-metric-utilization 参数,还需要 --max-num-replicas 参数:

gcloud compute instance-groups managed set-autoscaling example-managed-instance-group \
        --custom-metric-utilization metric=example.googleapis.com/path/to/metric,utilization-target-type=GAUGE,utilization-target=10 \
        --max-num-replicas 20 \
        --cool-down-period 90
    

或者,您可以使用 --cool-down-period 标志来告知自动扩缩程序以下信息:在新虚拟机启动后,自动扩缩程序在开始从该虚拟机收集使用量信息之前需要等待的秒数。这计入了虚拟机初始化可能需要的时间,在这段时间内收集的使用量对于自动扩缩而言并不可靠。默认冷却期为 60 秒。

对于多地区托管实例组,请使用 --region 标志指定实例组的查找位置。例如:

gcloud compute instance-groups managed set-autoscaling example-managed-instance-group \
        --custom-metric-utilization metric=example.googleapis.com/path/to/metric,utilization-target-type=GAUGE,utilization-target=10 \
        --max-num-replicas 20 \
        --cool-down-period 90 \
        --region us-central1
    

如需查看 gcloud 工具的可用命令和标志的完整列表,请参阅 gcloud 参考

API

注意:虽然自动扩缩是托管实例组的一项功能,但它是单独的 API 资源。针对自动扩缩构建 API 请求时请记住这一点。

在 API 中,向以下网址发出 POST 请求,并将 myproject 替换为您自己的项目 ID,将 us-central1-f 替换为您选择的地区。

POST https://compute.googleapis.com/compute/v1/projects/myproject/zones/us-central1-f/autoscalers/
    

请求正文必须包含 nametargetautoscalingPolicy 字段。在 autoscalingPolicy 中,请提供 maxNumReplicascustomMetricUtilizations 属性。

或者,您可以使用 coolDownPeriodSec 参数来告知自动扩缩程序以下信息:在新实例启动后,自动扩缩程序在开始收集使用量之前需要等待的秒数。冷却期过后,自动扩缩程序会开始收集新实例的使用量信息,并确定该组是否需要额外的实例。这计入了实例初始化可能需要的时间,在这段时间内收集的使用量对于自动扩缩而言并不可靠。默认冷却期为 60 秒。

POST https://compute.googleapis.com/compute/v1/projects/myproject/zones/us-central1-f/autoscalers

    {
     "name": "example-autoscaler",
     "target": "zones/us-central1-f/instanceGroupManagers/example-managed-instance-group",
     "autoscalingPolicy": {
      "maxNumReplicas": 10,
      "coolDownPeriodSec": 90,
      "customMetricUtilizations": [
       {
        "metric": "example.googleapis.com/some/metric/name",
        "utilizationTarget": 10,
        "utilizationTargetType": "GAUGE"
       }
      ]
     }
    }
    

过滤实例指标

您可以对 Cloud Monitoring 实例指标应用过滤器,这样就可以使用具有多个流或标签的指标中的各个值来扩缩单地区托管实例组。

实例指标过滤要求

自动扩缩程序过滤功能与 Cloud Monitoring 过滤器语法兼容,但存在一些限制。实例指标的过滤器必须满足以下要求:

  • 您只能使用 AND 运算符来联接选择器。
  • 您只能使用 = 直接相等比较运算符,但不能将该运算符与任何函数一起使用。例如,您不能将 = 比较运算符与 startswith() 函数一起使用。
  • 您不能使用通配符。
  • 您不得设置 resource.typeresource.label.* 选择器。 实例指标始终使用组中的所有实例资源。
  • 为获得最佳结果,请创建一个足够具体的过滤条件,以便为每个实例返回单个时间序列。如果过滤条件返回多个时间序列,这些时间序列将汇总在一起。

配置自动扩缩程序以过滤指标

使用 Google Cloud Console、gcloud 命令行工具(Beta 版)Compute Engine Beta 版 API 添加指标过滤条件,以自动扩缩单地区托管实例组。

控制台

创建可过滤实例指标的自动扩缩程序的过程类似于创建普通的实例自动扩缩程序,但您还需要指定指标过滤条件。例如,compute.googleapis.com/instance/network/received_bytes_count 指标包括 instance_nameloadbalanced 标签。如需根据 loadbalanced 布尔值进行过滤,请执行以下操作:

  1. 转到“实例组”页面
  2. 如果您没有实例组,请创建一个实例组。 否则,请点击实例组的名称以打开实例组详情页面。实例组必须为单地区实例组。
  3. 在实例组详情页面上,点击修改组按钮。
  4. 自动扩缩下,选择开启以启用自动扩缩。
  5. 自动扩缩的依据部分中,选择 Stackdriver Monitoring 指标
  6. 指标导出范围部分中,选择时间序列(针对单个实例)以使用实例指标配置自动扩缩。
  7. 指标标识符部分中,输入指标名称。例如,compute.googleapis.com/instance/network/received_bytes_count
  8. 附加过滤条件表达式 (Additional filter expression) 部分中,输入一个过滤条件。例如 'metric.label.loadbalanced = true'
  9. 准备好后,请保存所做的更改。

gcloud

创建可过滤实例指标的自动扩缩程序的过程类似于创建普通的实例自动扩缩程序,但您必须为利用率目标和目标类型指定一个指标过滤条件和各个标志。例如,compute.googleapis.com/instance/network/received_bytes_count 指标包括 instance_nameloadbalanced 标签。如需根据 loadbalanced 布尔值进行过滤,请使用 'metric.label.loadbalanced = true' 值指定 --stackdriver-metric-filter 过滤条件标志。这些标志分别包括利用率目标和目标类型标志。

gcloud beta compute instance-groups managed set-autoscaling example-managed-instance-group \
        --update-stackdriver-metric=compute.googleapis.com/instance/network/received_bytes_count \
        --stackdriver-metric-utilization-target-utilization-target=10 \
        --stackdriver-metric-utilization-target-type=DELTA_PER_SEC \
        --stackdriver-metric-filter='metric.label.loadbalanced = true' \
        --max-num-replicas 20 \
        --cool-down-period 90
    

此示例将自动扩缩配置为仅将 loadbalanced 流量数据用作利用率目标的一部分。

如需查看可用的 gcloud 命令和标志的列表,请参阅 gcloud 工具参考(Beta 版)

API

注意:虽然自动扩缩是托管实例组的一项功能,但它是单独的 API 资源。针对自动扩缩构建 API 请求时请记住这一点。

创建可过滤实例指标的自动扩缩程序的过程类似于创建普通的实例自动扩缩程序,但您必须为利用率目标和目标类型指定一个指标过滤条件和各个标志。例如,compute.googleapis.com/instance/network/received_bytes_count 指标包括 instance_nameloadbalanced 标签。如需根据 loadbalanced 布尔值进行过滤,请使用 "metric.label.loadbalanced = true" 值指定 filter 参数。

在 API 中,向以下网址发出 POST 请求,并将 myproject 替换为您自己的项目 ID,将 us-central1-f 替换为您选择的地区。请求正文必须包含 nametargetautoscalingPolicy 字段。在 autoscalingPolicy 中,请提供 maxNumReplicascustomMetricUtilizations 属性。

POST https://compute.googleapis.com/compute/beta/projects/myproject/zones/us-central1-f/autoscalers

    {
     "name": "example-autoscaler",
     "target": "zones/us-central1-f/instanceGroupManagers/example-managed-instance-group",
     "autoscalingPolicy": {
      "maxNumReplicas": 10,
      "coolDownPeriodSec": 90,
      "customMetricUtilizations": [
       {
        "metric": "compute.googleapis.com/instance/network/received_bytes_count",
        "filter": "metric.label.loadbalanced = true",
        "utilizationTarget": 10,
        "utilizationTargetType": "DELTA_PER_SEC"
       }
      ]
     }
    }
    

此示例将自动扩缩配置为仅将 loadbalanced 流量数据用作利用率目标的一部分。

实例组指标

借助实例组指标,您可以使用标准或自定义指标(不导出实例利用率数据)进行自动扩缩。实例组会根据适用于整个组的值(对应于该组可用的工作量或该组的繁忙程度)进行扩缩。实例组根据该组指标值的波动和您定义的配置进行扩缩。

配置根据实例组指标自动扩缩的功能时,您必须指明您希望自动扩缩程序如何根据指标预配实例:

  • 实例分配:指定实例分配,以表明您希望自动扩缩程序根据可分配给每个实例的工作量添加或移除实例。为此参数指定一个值,该值表示您希望每个实例处理的工作量。例如,指定 2 可为每个实例分配两个单位的工作量,指定 0.5 可为每个实例分配半个单位的工作量。自动扩缩程序会向托管实例组添加足够的实例,以确保有足够的实例来完成指标所指示的可用工作量。如果指标值为 10,并且您为每个实例分配了 0.5 个单位的工作量,自动扩缩程序会在托管实例组中创建 20 个实例。使用实例分配功能进行扩缩时,实例组可以在指标值下降到 0 时缩减为 0 个实例,并在指标值超过 0 时再次增加实例数量。下图显示了使用实例分配政策进行扩缩时,指标值与实例数量之间的比例关系。指标值与实例数之间的比例关系。
  • 利用率目标:指定利用率目标来表明您希望自动扩缩程序添加或移除实例,以尝试让指标值始终保持指定的值。当指标高于指定目标时,自动扩缩程序会逐步添加实例,直到指标降低到目标值。当指标低于指定的目标值时,自动扩缩程序会逐步移除实例,直到指标提高到目标值。使用利用率目标进行扩缩时,无法将实例组缩减为 0 个实例。 下图显示了自动扩缩程序如何根据指标值来添加和移除实例,从而维持利用率目标。自动扩缩程序添加和移除实例以维持目标利用率。

每个选项都具有以下用例:

  • 实例分配:根据 Pub/Sub 订阅中未确认的消息的数量或网络端点的总 QPS 速率来扩缩托管实例组的规模。
  • 利用率目标:根据自定义指标(并非来自标准的实例 CPU 或内存使用指标)的利用率目标扩缩托管实例组的规模。例如,您可以根据自定义延迟指标扩缩实例组。

当您配置使用实例组指标自动扩缩的功能并指定实例分配时,实例组可以缩减为 0 个实例。如果您的指标表明实例组没有要完成的工作,那么,在该指标检测到出现新工作之前,该实例组将缩减为 0 个实例。与实例组实例分配功能相反,实例自动扩缩功能需要来自至少一个实例的资源利用率指标,因此该组的大小不能缩减到 1 以下。

过滤实例组指标

您可以对 Cloud Monitoring 实例组指标应用过滤器,这样就可以使用具有多个流或标签的指标中的各个值来扩缩托管实例组。

实例组指标过滤要求

自动扩缩程序过滤功能与 Cloud Monitoring 过滤器语法兼容,但存在一些限制。实例组指标的过滤器必须满足以下要求:

  • 您只能使用 AND 运算符来联接选择器。
  • 对于每个选择器,您不能将 = 直接相等比较运算符与任何函数一起使用。
  • 您不能使用通配符。
  • 您可以在过滤条件中指定指标类型选择器 metric.type = "...",并且将原始 metric 字段包含在内。您可以视需要只使用 metric 字段。该指标必须满足以下要求:
    • 您必须至少在一个位置指定该指标。
    • 您可以在两个位置指定该指标,但指标必须相同。
  • 您必须指定 resource.type 选择器,但是如果要使用实例组指标进行扩缩,则无法将该选择器设置为 gce_instance
  • 为获得最佳结果,过滤条件应足够具体,以便为实例组返回单个时间序列。如果过滤条件返回多个时间序列,这些时间序列将汇总在一起。

配置使用实例组监控指标自动扩缩的功能

使用 Google Cloud Console、gcloud 命令行工具(Beta 版)Compute Engine API(Beta 版) 为单地区托管实例组配置使用实例组指标自动扩缩的功能。

控制台

  1. 转到“实例组”页面
  2. 如果您没有实例组,请创建一个实例组。 否则,请点击实例组的名称以打开实例组详情页面。实例组必须在单个地区中。
  3. 在实例组详情页面上,点击修改组按钮。
  4. 自动扩缩下,选择开启以启用自动扩缩。
  5. 自动扩缩的依据部分中,选择 Stackdriver Monitoring 指标
  6. 指标导出范围部分中,选择一个时间序列(针对单个实例组)
  7. 指标标识符部分中,按以下格式指定指标名称:example.googleapis.com/path/to/metric
  8. 指定指标资源类型
  9. 提供附加过滤条件表达式,以使用具有多个流或标签的指标中的各个值。过滤条件必须满足自动扩缩程序过滤要求
  10. 扩缩政策部分中,选择实例分配利用率目标
    • 如果选择实例分配政策,则提供单实例分配值,该值表示要分配给托管实例组中每个实例的工作量。例如,指定 2 可为每个实例分配两个单位的工作量。自动扩缩程序会维持足够的实例来完成指标所指示的可用工作量。如果指标值为 10,并且您为每个实例分配了 2 个单位的工作量,自动扩缩程序会在托管实例组中创建 5 个实例。
    • 如果选择利用率目标政策:
      • 提供一个利用率目标值,该值表示自动扩缩程序应尝试维持的指标值。
      • 选择利用率目标类型,该设置表示指标的值类型。
  11. 准备好后,请保存所做的更改。

gcloud

为托管实例组创建一个自动扩缩程序(与实例自动扩缩程序类似),但需指定 --update-stackdriver-metric 标志。您可以将以下标志之一包含在内,以便指定自动扩缩程序预配实例的方式:

  • 实例分配:指定 --stackdriver-metric-single-instance-assignment 标志。
  • 利用率目标:指定 --stackdriver-metric-utilization-target 标志。

实例分配

指定要测量的指标,然后指定 --stackdriver-metric-single-instance-assignment 标志以指明您希望每个实例处理的工作量。您还必须使用 --stackdriver-metric-filter 标志指定指标的过滤条件。

gcloud beta compute instance-groups managed set-autoscaling [GROUP_NAME] \
        --zone=[ZONE] \
        --max-num-replicas=[MAX_INSTANCES] \
        --min-num-replicas=[MIN_INSTANCES] \
        --update-stackdriver-metric='[METRIC_URL]' \
        --stackdriver-metric-filter='[METRIC_FILTER]' \
        --stackdriver-metric-single-instance-assignment=[INSTANCE_ASSIGNMENT]
    

其中:

  • [GROUP_NAME] 是要在其中添加自动扩缩程序的托管实例组的名称。
  • [ZONE] 是托管实例组所在的地区。您无法为使用实例组指标的自动扩缩程序指定区域。
  • [MAX_INSTANCES] 是自动扩缩程序可以向托管实例组添加的实例数上限。
  • [MIN_INSTANCES] 是自动扩缩程序可以在托管实例组中具有的实例数下限。
  • [METRIC_URL] 是 Monitoring 指标的无协议网址。
  • [METRIC_FILTER] 是一个 Cloud Monitoring 过滤器,您可在其中指定具有相关 TimeSeriesMonitoredResource监控过滤器。该过滤器必须满足自动扩缩程序过滤要求
  • [INSTANCE_ASSIGNMENT] 是要分配给托管实例组中每个实例的工作量。例如,指定 2 可为每个实例分配两个单位的工作量,指定 0.5 可为每个实例分配半个单位的工作量。自动扩缩程序会向托管实例组添加足够的实例,以确保有足够的实例来完成指标所指示的可用工作量。如果指标值为 10,并且您为每个实例分配了 0.5 个单位的工作量,自动扩缩程序会在托管实例组中预配 20 个实例。

利用率目标

在某些情况下,建议您将利用率目标与实例组指标结合使用,而不是根据自动扩缩程序测量的指标值指定实例数量。您仍然可以让自动扩缩程序根据实例组指标进行扩缩,但自动扩缩程序会尝试维持指定的利用率目标。使用 --stackdriver-metric-utilization-target 标志指定目标和目标类型。您还必须使用 --stackdriver-metric-filter 标志指定指标的过滤条件。

gcloud beta compute instance-groups managed set-autoscaling [GROUP_NAME] \
       --zone=[ZONE] \
       --max-num-replicas=[MAX_INSTANCES] \
       --min-num-replicas=[MIN_INSTANCES] \
       --update-stackdriver-metric='[METRIC_URL]' \
       --stackdriver-metric-filter='[METRIC_FILTER]' \
       --stackdriver-metric-utilization-target=[TARGET_VALUE] \
       --stackdriver-metric-utilization-target-type=[TARGET_TYPE]
    

其中:

  • [GROUP_NAME] 是要在其中添加自动扩缩程序的托管实例组的名称。
  • [ZONE] 是托管实例组所在的地区。您无法为使用实例组指标的自动扩缩程序指定区域。
  • [MAX_INSTANCES] 是自动扩缩程序可以向托管实例组添加的实例数上限。
  • [MIN_INSTANCES] 是自动扩缩程序可以在托管实例组中具有的实例数下限。
  • [METRIC_URL] 是 Monitoring 指标的无协议网址。
  • [METRIC_FILTER] 是一个 Cloud Monitoring 过滤器,您可在其中指定具有相关 TimeSeriesMonitoredResource监控过滤器。您必须指定 resource.type 值,但是如果要使用实例组指标进行扩缩,则无法指定 gce_instance。过滤条件必须满足自动扩缩程序过滤要求
  • [TARGET_VALUE] 是自动扩缩程序尝试维持的指标值。
  • [TARGET_TYPE] 是指标的值类型。您可以设置自动扩缩程序,以便通过三种方式来监控指标:以 GAUGE 的形式监控指标;通过指标值的 delta-per-minute 来监控指标;通过指标值的 delta-per-second 来监控指标。

如需查看可用于实例组自动扩缩功能的自动扩缩程序 gcloud 命令行工具命令和标志的列表,请参阅 gcloud 命令行工具参考(Beta 版)

API

注意:虽然自动扩缩是托管实例组的功能,但 [自动扩缩程序] (/compute/docs/reference/beta/autoscalers) 是单独的 API 资源。针对自动扩缩构建 API 请求时请记住这一点。

为托管实例组创建自动扩缩程序。您可以将以下参数之一包含在内,以便指定自动扩缩程序预配实例的方式:

  • 实例分配:指定 singleInstanceAssignment 参数。
  • 利用率目标:指定 utilizationTarget 参数。

实例分配

在 API 中,发出 POST 请求以创建自动扩缩程序。 在请求正文中,包含用于创建实例自动扩缩程序的常规参数,但请指定 single-instance-assignment 参数。single-instance-assignment 参数指定了您希望每个实例处理的工作量。

POST https://compute.googleapis.com/compute/beta/projects/[PROJECT_ID]/zones/[ZONE]/autoscalers

    {
     "name": "example-autoscaler",
     "target": "zones/[ZONE]/instanceGroupManagers/[GROUP_NAME]",
     "autoscalingPolicy": {
      "maxNumReplicas": [MAX_INSTANCES],
      "minNumReplicas": [MIN_INSTANCES],
      "customMetricUtilizations": [
        {
          "metric": "[METRIC_URL]",
          "filter": "[METRIC_FILTER]",
          "singleInstanceAssignment": [INSTANCE_ASSIGNMENT]
        }
      ],
     }
    }
    

其中:

  • [PROJECT_ID] 是您的项目 ID。
  • [ZONE] 是托管实例组所在的地区。
  • [GROUP_NAME] 是要在其中添加自动扩缩程序的托管实例组的名称。
  • [MAX_INSTANCES] 是自动扩缩程序可以向托管实例组添加的实例数上限。
  • [MIN_INSTANCES] 是自动扩缩程序可以在托管实例组中具有的实例数下限。
  • [METRIC_URL] 是 Monitoring 指标的无协议网址。
  • [METRIC_FILTER] 是一个 Cloud Monitoring 过滤器,您可在其中指定具有相关 TimeSeriesMonitoredResource监控过滤器。您必须指定 resource.type 值,但是如果要使用实例组指标进行扩缩,则无法指定 gce_instance。过滤条件必须满足自动扩缩程序过滤要求
  • [INSTANCE_ASSIGNMENT] 是要分配给托管实例组中每个实例的工作量。例如,指定 2 可为每个实例分配两个单位的工作量,指定 0.5 可为每个实例分配半个单位的工作量。自动扩缩程序会向托管实例组添加足够的实例,以确保有足够的实例来完成指标所指示的可用工作量。如果指标值为 10,并且您为每个实例分配了 0.5 个单位的工作量,自动扩缩程序会在托管实例组中预配 20 个实例。

利用率目标

在某些情况下,建议您将利用率目标与实例组指标结合使用,而不是根据自动扩缩程序测量的指标值指定实例数量。您仍然可以让自动扩缩程序根据实例组指标进行扩缩,但自动扩缩程序会尝试维持指定的利用率目标。使用 utilizationTarget 参数指定这些目标。您还必须使用 filter 参数指定指标的过滤条件。

POST https://compute.googleapis.com/compute/beta/projects/[PROJECT_ID]/zones/[ZONE]/autoscalers

    {
     "name": "example-autoscaler",
     "target": "zones/[ZONE]/instanceGroupManagers/[GROUP_NAME]",
     "autoscalingPolicy": {
      "maxNumReplicas": [MAX_INSTANCES],
      "minNumReplicas": [MIN_INSTANCES],
      "customMetricUtilizations": [
        {
          "metric": "[METRIC_URL]",
          "filter": "[METRIC_FILTER]",
          "utilizationTarget": [TARGET_VALUE],
          "utilizationTargetType": [TARGET_TYPE]
        }
      ],
     }
    }
    

其中:

  • [GROUP_NAME] 是要在其中添加自动扩缩程序的托管实例组的名称。
  • [ZONE] 是托管实例组所在的地区。
  • [MAX_INSTANCES] 是自动扩缩程序可以向托管实例组添加的实例数上限。
  • [MIN_INSTANCES] 是自动扩缩程序可以在托管实例组中具有的实例数下限。
  • [METRIC_URL] 是 Monitoring 指标的无协议网址。
  • [METRIC_FILTER] 是一个 Cloud Monitoring 过滤器,您可在其中指定具有相关 TimeSeriesMonitoredResource监控过滤器。您必须指定 resource.type 值,但是如果要使用实例组指标进行扩缩,则无法指定 gce_instance。过滤条件必须满足自动扩缩程序过滤要求
  • [TARGET_VALUE] 是自动扩缩程序尝试维持的指标值。
  • [TARGET_TYPE] 是指标的值类型。您可以设置自动扩缩程序,以便通过三种方式来监控指标:以 GAUGE 的形式监控指标;通过指标值的 DELTA_PER_MINUTE 来监控指标;通过指标值的 DELTA_PER_SECOND 来监控指标。

示例:使用实例分配,根据 Pub/Sub 队列进行扩缩

假设采用以下设置:

  • 处于活跃状态的 Pub/Sub 主题会从某个来源接收消息。
  • 处于活跃状态的 Pub/Sub 订阅已连接到该主题,连接采用了拉取配置。该订阅名为 our-subscription
  • 工作器池正在从该订阅中拉取消息并进行处理。该工作器池是名为 our-instance-group 的单地区托管实例组,位于地区 us-central1-a 中。该工作器池中包含的工作器数量不得超过 100 个,并且当队列中没有消息时,工作器数量应缩减为 0 个。
  • 工作器在一分钟内平均处理一条消息。

如需确定最佳实例分配值,请考虑使用以下几种方法:

  • 为了尽快处理队列中的所有消息,您可以选择 1 作为实例分配值。此值会为队列中的每条消息创建一个实例(不超过实例组中的实例数上限)。但是,这可能会导致超额预配。在最坏的情况下,系统会创建一个实例来处理一条消息(在自动扩缩程序关闭该实例之前,该实例只会处理这一条消息),这种情况下占用资源所耗费的时间要比实际完成工作所需的时间长得多。
    • 请注意,如果工作器能够同时处理多条消息,则应当将该值增大到等同于并发进程的数量。
    • 请注意,在此示例中,没有必要将值设置为低于 1,因为一条消息不能被多个工作器处理。
  • 或者,如果相较于处理延迟您更注重资源利用率和开销费用,您可以计算每个实例在其生命周期内必须处理多少条消息,才能实现有效的利用。考虑启动和关停时间,并且谨记一个事实:自动扩缩功能不会立即删除实例。例如,假设启动和关停时间总共大约需要 5 分钟,并且自动扩缩功能仅在大约 10 分钟后才会删除实例,则您计算出,如果在实例组中额外创建了一个实例,而该实例能够在自动扩缩程序将其关停之前处理至少 15 条消息,则这种创建额外实例的做法就是有效的,在采用这种做法时,创建、启动和关停实例所需的总时间最多导致产生 25% 的开销。在这种情况下,您可以选择 15 作为实例分配值。
  • 两种方法可以进行平衡,产生的值介于 115 之间,具体取决于您更加重视哪个因素(处理延迟与资源利用率)。

通过查看可用的 Pub/Sub 指标,我们找到一个表示订阅队列长度的指标:subscription/num_undelivered_messages

请注意,此指标会导出队列中的消息总数,包括当前正在处理但尚未确认的消息。如果指标不包含正在处理的消息,则不建议使用此类指标,这是因为,当仍有工作正在进行处理时,此类指标可能会下降为 0,这会提示自动扩缩功能缩减实例,并可能中断实际的工作。

您现在可以为队列配置自动扩缩功能:

gcloud beta compute instance-groups managed set-autoscaling \
        our-instance-group \
        --zone=us-central1-a \
        --max-num-replicas=100 \
        --min-num-replicas=0 \
        --update-stackdriver-metric=pubsub.googleapis.com/subscription/num_undelivered_messages \
        --stackdriver-metric-filter="resource.type = pubsub_subscription AND resource.label.subscription_id = our-subscription" \
        --stackdriver-metric-single-instance-assignment=15
    

示例:根据平均延迟时间,使用利用率目标进行扩缩

可能存在这样的情况:提供相关信号的指标没有体现出可用工作的总量或适用于实例组的另一资源(如先前示例所示),而是体现了平均值、百分位数或其他一些统计属性。对于此示例,请假设您将根据实例组的平均处理延迟时间进行扩缩。

假设采用以下设置:

  • 分配了名为 our-instance-group 的托管实例组以执行特定任务。该实例组位于地区 us-central1-a 中。
  • 您拥有一个 Cloud Monitoring 自定义指标,该指标可导出您希望维持在特定级别的值。对于此示例,请假设该指标代表处理分配给该实例组的查询时所出现的平均延迟时间。
    • 自定义指标名为 custom.googleapis.com/example_average_latency
    • 该自定义指标具有一个标签,标签包含一个名为 group_name 的键,它的值等于实例组的名称 our-instance-group
    • 该自定义指标会导出全球受监控的资源的数据,也就是说,它不与任何特定实例关联。

您已确定,当指标值超过某个特定值时,您需要向实例组添加更多实例以处理负载,而当指标值低于该值时,您可以释放一些资源。自动扩缩功能会根据指标高于或低于目标的程度,以成比例的速率逐步添加或移除实例。对于此示例,请假设计算的目标值为 100

您现在可以使用实例组利用率目标 (100) 为实例组配置自动扩缩功能,该目标代表自动扩缩程序必须尝试维持的指标值:

gcloud beta compute instance-groups managed set-autoscaling \
        our-instance-group \
        --zone=us-central1-a \
        --max-num-replicas=100 \
        --min-num-replicas=0 \
        --update-stackdriver-metric=custom.googleapis.com/example_average_latency \
        --stackdriver-metric-filter "resource.type = global AND metric.label.group_name = our-instance-group" \
        --stackdriver-metric-utilization-target=100 \
        --stackdriver-metric-utilization-target-type=delta-per-second