根据 Cloud Monitoring 指标进行扩缩

本文档介绍了如何根据 Monitoring 指标扩缩代管式实例组 (MIG)

您还可以根据 CPU 利用率外部 HTTP(S) 负载平衡器的服务容量扩缩 MIG。

在根据 Monitoring 指标扩缩 MIG 时,您可以基于以下指标类型进行扩缩:

  • 使用实例指标进行扩缩,其中所选指标提供了 MIG 中每个虚拟机 (VM) 实例的数据,这些数据指示资源利用率。
  • 使用实例组指标进行扩缩,其中,实例组根据特定的指标进行扩缩,该指标提供了与整个代管式实例组相关的值。

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

限制

根据 Cloud Monitoring 指标进行扩缩受所有自动扩缩器的限制以及以下限制的制约:

  • 您无法根据 Cloud Monitoring 基于日志的指标进行自动扩缩。
  • 您无法根据来自 external.googleapis.com、prometheus.googleapis.com 和 workload.googleapis.com 网域的自定义指标进行自动扩缩。

准备工作

实例指标

实例指标分别提供了 MIG 中的每个虚拟机的数据,这些数据指示每个实例的资源利用率。使用实例指标时,MIG 无法将大小扩缩到 1 个虚拟机以下,因为自动扩缩器需要至少一个正在运行的实例的相关指标才能操作。

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

标准的实例指标

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

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

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

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

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

compute.googleapis.com/instance/cpu/reserved_cores

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

自定义指标

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

前提条件

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

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

选择有效的自定义指标

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

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

如需让自动扩缩器使用自定义指标,您必须从 MIG 中的所有虚拟机导出此自定义指标的数据。

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

无论是标准指标还是自定义指标,设置自动扩缩程序的过程都是相同的。如需创建使用 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. 在 Google Cloud Console 中,转到实例组页面。

    转到“实例组”

  2. 如果您没有代管式实例组,请创建一个代管式实例组。否则,请从列表中点击 MIG 的名称以打开实例组概览页面。

  3. 在实例组概览页面上,点击修改

  4. 如果不存在自动扩缩配置,请在自动扩缩下点击配置自动扩缩

  5. 自动扩缩模式下,选择自动扩缩以启用自动扩缩。

  6. 自动扩缩指标部分中,如果存在现有指标,请点击该指标以进行修改,或点击添加新指标以添加其他指标。

  7. 指标类型设置为 Stackdriver Monitoring 指标

  8. 指标导出范围部分中,选择每个实例的时间序列以使用实例指标配置自动扩缩。

  9. 指标标识符部分中,按以下格式输入指标名称:example.googleapis.com/path/to/metric

  10. 指标标签和资源标签的其他过滤条件表达式部分中:

    • 对于可用区级 MIG,您可以选择输入过滤条件,以使用具有多个流或标签的指标中的个别值。如需了解详情,请参阅过滤实例指标
    • 对于区域级 MIG,请将此部分留空。
  11. 利用率目标部分中,指定目标值。

  12. 利用率目标类型部分中,验证目标类型是否与指标的测量类型对应。

  13. 完成后,请保存所做的更改。

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 \
    --region us-west1

您可以使用 --cool-down-period 标志来告知自动扩缩器应用初始化所需的时间。指定准确的冷却期可以改进自动扩缩器的决策。例如,扩容时,自动扩缩器会忽略仍在初始化的虚拟机中的数据,因为这些虚拟机可能尚未代表应用的正常使用情况。默认冷却期为 60 秒。

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

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 实例指标应用过滤条件,这样就可以使用具有多个流或标签的指标中的各个值来扩缩 MIG。

实例指标过滤要求

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

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

配置自动调节程序以过滤指标

如需添加指标过滤条件以自动扩缩 MIG,请使用 Google Cloud Console、gcloud 命令行工具或 Compute Engine API。

控制台

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

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

    转到“实例组”

  2. 如果您没有 MIG,请创建一个 MIG。否则,请点击 MIG 的名称以打开实例组概览页面。

  3. 在实例组概览页面上,点击修改

  4. 如果不存在自动扩缩配置,请在自动扩缩下点击配置自动扩缩

  5. 自动扩缩模式下,选择自动扩缩以启用自动扩缩。

  6. 自动扩缩指标部分中,如果存在现有指标,请点击该指标以进行修改,或点击添加新指标以添加其他指标。

  7. 指标类型部分中,选择 Stackdriver Monitoring 指标

  8. 指标导出范围部分中,选择每个实例的时间序列以使用实例指标配置自动扩缩。

  9. 指标标识符部分中,输入指标名称。例如 compute.googleapis.com/instance/network/received_bytes_count

  10. 指标标签和资源标签的其他过滤条件表达式部分中,输入过滤条件。例如,'metric.labels.loadbalanced = true'

  11. 完成后,请保存所做的更改。

gcloud

如需为可用区级 MIG 添加指标过滤条件,请使用 set-autofill 命令;对于区域级 MIG,请使用 Beta 版设置自动扩缩命令。

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

gcloud 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=10 \
    --stackdriver-metric-utilization-target-type=delta-per-second \
    --stackdriver-metric-filter='metric.labels.loadbalanced = true' \
    --max-num-replicas 20 \
    --cool-down-period 90 \
    --zone us-central1-f

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

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

API

如需为可用区级 MIG 添加指标过滤条件,请使用 autoscalers 资源;对于区域级 MIG,请使用 Beta 版 regionAutoscalers 资源。

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

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

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": "compute.googleapis.com/instance/network/received_bytes_count",
    "filter": "metric.labels.loadbalanced = true",
    "utilizationTarget": 10,
    "utilizationTargetType": "DELTA_PER_SECOND"
   }
  ]
 }
}

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

实例组指标

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

在实例组指标上配置自动调节时,您必须指明您希望自动调节程序如何根据指标配置实例:

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

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

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

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

过滤实例组指标

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

实例组指标过滤要求

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

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

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

使用 Google Cloud Console、gcloud 命令行工具Compute Engine API 通过实例组指标配置自动扩缩功能。

控制台

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

    转到“实例组”

  2. 如果您没有代管式实例组,请创建一个代管式实例组。否则,请点击 MIG 的名称以打开实例组概览页面。

  3. 在实例组概览页面上,点击修改

  4. 如果不存在自动扩缩配置,请在自动扩缩下点击配置自动扩缩

  5. 自动扩缩模式下,选择自动扩缩以启用自动扩缩。

  6. 自动扩缩指标部分中,如果存在现有指标,请点击该指标以进行修改,或点击添加新指标以添加其他指标。

  7. 指标类型设置为 Stackdriver Monitoring 指标

  8. 指标导出范围部分中,选择每个实例组的单个时间序列

  9. 指标标识符部分中,按以下格式指定指标名称:example.googleapis.com/path/to/metric

  10. 指定指标资源类型

  11. 如果要使用具有多个流或标签的指标中的各个值,请提供指标标签和资源标签的其他过滤条件表达式。过滤条件必须满足自动扩缩器过滤要求

  12. 扩缩政策部分中,选择实例分配利用率目标

    • 如果选择实例分配政策,则提供单个实例分配值,该值表示要分配给 MIG 中每个虚拟机实例的工作量。例如,指定 2 可为每个实例分配两个单位的工作量。自动扩缩器会维持足够的虚拟机来完成指标所指示的可用工作量。如果指标值为 10,并且您为每个虚拟机分配了 2 个单位的工作量,则自动扩缩器会在 MIG 中创建 5 个虚拟机。
    • 如果选择利用率目标政策:
      • 提供一个利用率目标值,该值表示自动扩缩程序应尝试维持的指标值。
      • 选择利用率目标类型,该设置表示指标的值类型。
  13. 完成后,请保存所做的更改。

gcloud

如需为可用区级 MIG 使用实例组监控指标配置自动扩缩功能,请使用设置自动扩缩命令;对于区域级 MIG,请使用 Beta 版设置自动扩缩命令。

在该命令中,指定 --update-stackdriver-metric 标志以提供监控指标网址。您还必须通过添加以下标志之一来指定您希望自动扩缩器预配实例的方式:

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

实例分配

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

以下命令使用 --stackdriver-metric-single-instance-assignment 标志基于实例组指标创建自动扩缩器。

gcloud compute instance-groups managed set-autoscaling GROUP_NAME \
    --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 \
    [--zone=ZONE | --region=REGION]

请替换以下内容:

  • GROUP_NAME:您要在其中添加自动扩缩器的 MIG 的名称。
  • MAX_INSTANCES:MIG 可以拥有的虚拟机数上限。
  • MIN_INSTANCES:MIG 可以拥有的虚拟机数下限。
  • METRIC_URL:Monitoring 指标的无协议网址。
  • METRIC_FILTER:一个 Cloud Monitoring 过滤条件,您可在其中指定具有相关 TimeSeriesMonitoredResource监控过滤条件。过滤器必须满足自动扩缩器过滤要求
  • INSTANCE_ASSIGNMENT:要分配给 MIG 中的每个虚拟机实例的工作量。例如,指定 2 可为每个虚拟机分配两个单位的工作量,指定 0.5 可为每个虚拟机分配半个单位的工作量。自动扩缩器会对 MIG 进行扩缩,以确保有足够的虚拟机来完成指标所指示的可用工作量。如果指标值为 10,并且您为每个虚拟机分配了 0.5 个单位的工作量,则自动扩缩器会在 MIG 中预配 20 个虚拟机。
  • ZONE:对于可用区级 MIG,这是 MIG 所在的可用区。
  • REGION:对于区域级 MIG,这是 MIG 所在的区域。

利用率目标

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

以下命令使用 --stackdriver-metric-utilization-target 标志基于实例组指标创建自动扩缩器。

gcloud compute instance-groups managed set-autoscaling GROUP_NAME \
    --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 \
    [--zone=ZONE | --region=REGION]

请替换以下内容:

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

如需查看可用于实例组自动扩缩功能的自动扩缩器 gcloud 命令行工具命令和标志的列表,请参阅 gcloud 命令行工具参考文档

API

如需为可用区级 MIG 使用实例组监控指标配置自动扩缩功能,请使用autoscalers 资源;对于区域级 MIG,请使用 Beta 版 regionAutoscalers资源。

通过将以下其中一个参数来指定您希望自动扩缩器预配实例的方式:

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

实例分配

singleInstanceAssignment 参数指定您希望每个虚拟机处理的工作量。

例如,进行以下调用以创建根据实例组指标的实例分配扩缩可用区级 MIG 的自动扩缩器。

POST https://compute.googleapis.com/compute/v1/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:MIG 所在的可用区。
  • GROUP_NAME:您要在其中添加自动扩缩器的 MIG 的名称。
  • MAX_INSTANCES:MIG 可以拥有的虚拟机数上限。
  • MIN_INSTANCES:MIG 可以拥有的虚拟机数下限。
  • METRIC_URL:Monitoring 指标的无协议网址。
  • METRIC_FILTER:一个 Cloud Monitoring 过滤条件,您可在其中指定具有相关 TimeSeriesMonitoredResource监控过滤条件。您必须指定 resource.type 值,但是如果要使用实例组指标进行扩缩,则无法指定 gce_instance。过滤条件必须满足自动扩缩器过滤要求
  • INSTANCE_ASSIGNMENT:要分配给 MIG 中的每个虚拟机实例的工作量。例如,指定 2 可为每个虚拟机分配两个单位的工作量,指定 0.5 可为每个虚拟机分配半个单位的工作量。自动扩缩器会对 MIG 进行扩缩,以确保有足够的虚拟机来完成指标所指示的可用工作量。如果指标值为 10,并且您为每个虚拟机分配了 0.5 个单位的工作量,则自动扩缩器会在 MIG 中预配 20 个虚拟机。

利用率目标

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

例如,进行以下调用以根据实例组指标的利用率目标创建可用区级 MIG 的自动扩缩器。

POST https://compute.googleapis.com/compute/v1/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
        }
      ],
     }
    }

请替换以下内容:

  • PROJECT_ID:您的项目 ID。
  • ZONE:MIG 所在的可用区。
  • GROUP_NAME:您要在其中添加自动扩缩器的 MIG 的名称。
  • MAX_INSTANCES:MIG 可以拥有的虚拟机数上限。
  • MIN_INSTANCES:MIG 可以拥有的虚拟机数下限。
  • 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 的可用区级 MIG,位于可用区 us-central1-a 中。该工作器池中包含的工作器数量不得超过 100 个,并且当队列中没有消息时,工作器数量应缩容为 0 个。
  • 工作器在一分钟内平均处理一条消息。

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

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

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

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

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

gcloud 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.labels.subscription_id = our-subscription" \
    --stackdriver-metric-single-instance-assignment=15

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

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

假设采用以下设置:

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

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

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

gcloud 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.labels.group_name = our-instance-group" \
    --stackdriver-metric-utilization-target=100 \
    --stackdriver-metric-utilization-target-type=delta-per-second

后续步骤