根据监控指标进行扩缩


通过根据 Cloud Monitoring 指标进行自动扩缩,您可以根据应用的测量结果调整所需的容量。当您根据指标自动扩缩 MIG 时,自动扩缩器会在指标值增加时创建虚拟机,在指标值减小时删除虚拟机。

例如,您可以定义所需的每个用户虚拟机数量、延迟时间或 Pub/Sub 订阅中的消息数量。您可以使用 Monitoring 服务提供的内置指标,也可以使用从应用中导出的自定义指标

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

您还可以根据以下信息自动扩缩 MIG:CPU 利用率负载均衡服务容量时间表

准备工作

  • 了解自动扩缩器基础知识
  • 了解自动扩缩配置中使用的 Monitoring 指标概念
  • 如果要根据 Ops Agent 指标进行自动扩缩,请安装 Ops Agent
  • 设置身份验证(如果尚未设置)。身份验证是通过其进行身份验证以访问 Google Cloud 服务和 API 的过程。如需从本地开发环境运行代码或示例,您可以按如下方式向 Compute Engine 进行身份验证。

    Select the tab for how you plan to use the samples on this page:

    Console

    When you use the Google Cloud console to access Google Cloud services and APIs, you don't need to set up authentication.

    gcloud

    1. 安装 Google Cloud CLI,然后通过运行以下命令初始化 Google Cloud CLI:

      gcloud init
    2. Set a default region and zone.
    3. REST

      如需在本地开发环境中使用本页面上的 REST API 示例,请使用您提供给 gcloud CLI 的凭据。

        安装 Google Cloud CLI,然后通过运行以下命令初始化 Google Cloud CLI:

        gcloud init

      如需了解详情,请参阅 Google Cloud 身份验证文档中的使用 REST 时进行身份验证

限制

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

  • 您可以根据每个 MIG 的 Monitoring 指标(最多 5 个)配置自动扩缩。
  • 您可以根据仅具有 INT64DOUBLE 值类型的指标进行自动扩缩。不支持其他值类型
  • 您不能在自动扩缩政策中多次配置同一指标。

配置根据 Monitoring 指标进行自动扩缩

您可以通过两种方式使用 Monitoring 指标值进行自动扩缩:

  • 利用率目标:如果您希望自动扩缩器将指标维持在特定值,请配置利用率目标。当指标值高于目标时,自动扩缩器会创建虚拟机;当指标值低于目标时,自动扩缩器会删除虚拟机。这对流量、内存/磁盘使用率或应用的平均延迟时间等指标非常有用。下图展示了自动扩缩器如何根据指标值来添加和移除虚拟机,从而维持利用率目标。

    自动扩缩器添加和移除虚拟机以维持利用率目标。

  • 单个实例分配:如果要根据可分配给每个虚拟机的工作量进行自动扩缩,请配置单个实例分配。您指定的单个实例分配表示您希望每个虚拟机处理的工作量。自动扩缩器将指标值除以单个实例分配值来计算需要的虚拟机数量。例如,如果指标等于 100 且单个实例分配为 5,则自动扩缩器会在 MIG 中创建 20 个虚拟机。这对于反映工作量(例如 Pub/Sub 队列长度或批处理作业计数)的指标非常有用。单个实例分配不适用于来自每个虚拟机的指标。下图展示了使用单个实例分配进行扩缩时,指标值与虚拟机数量之间的比例关系。

    指标值与实例数之间的比例关系。

自动扩缩以将指标维持在目标值

如果要将指标维持在目标值,请指定利用率目标。当指标值高于目标时,自动扩缩器会创建虚拟机;当指标值低于目标时,自动扩缩器会删除虚拟机。

  • 如果指标来自 MIG 中的每个虚拟机,则自动扩缩器会获取 MIG 中所有虚拟机的平均指标值,并将其与利用率目标进行比较。例如,如果要使用提供虚拟机上 TCP 连接数的 tcp_connections 指标进行自动扩缩,则自动扩缩器的平均数量为 MIG 中所有虚拟机的 TCP 连接,以便与目标进行比较。使用源自虚拟机的此类指标时,MIG 无法缩容为 0,因为自动扩缩器需要至少一个虚拟机来发布指标值。

  • 如果指标适用于整个 MIG 并且不是来自 MIG 中的虚拟机,则自动扩缩器会将指标值与利用率目标进行比较。例如,您可以使用自定义指标来测量应用的延迟时间。

如果指标具有多个值,请应用过滤条件以使用指标中的单个值进行自动扩缩。如需详细了解指标过滤条件以及可在配置中使用的其他字段,请参阅 Monitoring 指标概念

控制台

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

    转到“实例组”

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

  3. 点击修改

  4. 如果不存在自动扩缩配置:

    1. 自动扩缩下,点击配置自动扩缩
    2. 自动扩缩模式下,选择开启:在实例组中添加和移除实例以启用自动扩缩功能。
  5. 自动扩缩下的自动扩缩信号部分中,如果存在 Cloud Monitoring 指标的信号,您可以点击以进行修改,或点击添加信号以添加新信号。

  6. 信号类型设置为 Cloud Monitoring 指标

  7. 点击配置。在打开的资源和指标窗格中,执行以下操作:

    1. 点击选择指标
      1. 选择要用于自动扩缩的指标。您可以根据任何关键字(例如内存、字节、磁盘)过滤指标。
      2. 点击应用。此窗格会显示一个图表,其中显示所选指标的数据。
    2. 如果要使用指标中的特定数据,请添加基于标签的过滤条件,如下所示:

      1. 过滤部分,点击添加过滤条件 (Add a filter)。
      2. 选择一个标签,然后输入一个
      3. 点击完成。系统会刷新图表以显示指标的过滤值。
    3. 如需查看将用于自动扩缩 MIG 的指标的聚合值,请切换在图表中显示聚合按钮。系统会刷新图表以显示聚合值。

    4. 自动扩缩的指标目标选项部分中,选择利用率目标

    5. 提供以下信息:

      1. 利用率目标:指定自动扩缩器必须维持的值。此数据必须为正数。例如,24.5 和 100 均为可接受的值。
      2. 利用率目标类型:选择与指标的测量类型对应的目标类型。为了进行准确的比较,如果利用率目标以秒为单位进行衡量,请使用增量/秒作为目标类型。同样,对于每分钟测量的利用率目标,请使用增量 / 分钟
        • 采样平均值:自动扩缩器会计算过去几分钟收集的数据的平均值,并将该值与利用率目标进行比较。
        • 增量/分钟:自动扩缩器会计算每分钟的平均增长率,并将该增长率与利用率目标进行比较。
        • 增量/秒:自动扩缩器会计算每秒的平均增长率,并将该增长率与利用率目标进行比较。
    6. 完成指标配置后,点击选择

  8. 查看指标详情,然后点击完成

  9. 要完成配置,请点击保存

gcloud

如需配置根据 Monitoring 指标的自动扩缩,请使用 set-autoscaling 命令

使用以下命令根据具有利用率目标的 Monitoring 指标进行自动扩缩。

gcloud compute instance-groups managed set-autoscaling MIG_NAME \
  --max-num-replicas=MAX_INSTANCES \
  --min-num-replicas=MIN_INSTANCES \
  --update-stackdriver-metric=METRIC_URL \
  --stackdriver-metric-utilization-target=TARGET_VALUE \
  --stackdriver-metric-utilization-target-type=TARGET_TYPE

如果指标具有多个值,并且您希望使用单个值进行自动扩缩,请使用 --stackdriver-metric-filter 标志,如以下命令所示。

gcloud compute instance-groups managed set-autoscaling MIG_NAME \
  --max-num-replicas=MAX_INSTANCES \
  --min-num-replicas=MIN_INSTANCES \
  --update-stackdriver-metric=METRIC_URL \
  --stackdriver-metric-utilization-target=TARGET_VALUE \
  --stackdriver-metric-utilization-target-type=TARGET_TYPE \
  --stackdriver-metric-filter="METRIC_FILTER"

替换以下内容:

  • MIG_NAME:您要在其中添加自动扩缩器的 MIG。
  • MAX_INSTANCES:MIG 可以拥有的虚拟机数上限。
  • MIN_INSTANCES:MIG 需要具有的虚拟机数下限。
  • METRIC_URL:Monitoring 指标的无协议网址。例如 compute.googleapis.com/instance/uptime。如果您使用自定义指标,则该指标必须满足自定义指标要求
  • TARGET_VALUE:自动扩缩器尝试维持的指标值。
  • TARGET_TYPE:指标的值类型。
    • gauge:自动扩缩器会计算过去几分钟内收集的数据的平均值,并将该值与利用率目标进行比较。
    • delta-per-minute:自动扩缩器会计算每分钟的平均增长率,并将该增长率与利用率目标进行比较。
    • delta-per-second:自动扩缩器会计算每秒的平均增长率,并将该增长率与利用率目标进行比较。 为了进行准确的比较,如果您以秒为单位设置利用率目标,请使用 delta-per-second 作为目标类型。同样,如果您以分钟为单位设置利用率目标,请使用 delta-per-minute
  • METRIC_FILTER:应用过滤条件,以使用具有多个值的指标中的一个值并指定受监控的资源类型。如果您使用来自每个虚拟机的指标,则无需指定受监控的资源类型,因为 gce_instance 用作默认值。对于其他指标,请在过滤条件表达式中使用 resource.type 来指定受监控的资源。如需详细了解指标过滤条件,请参阅 Monitoring 指标概念

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

REST

如需配置根据区域级 MIG 的 Monitoring 指标的自动扩缩,请使用 autoscalers 资源,或者对于区域级 MIG,请使用 regionAutoscalers 资源。

进行以下调用,以根据具有利用率目标的 Monitoring 指标自动扩缩可用区级 MIG。

POST https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/zones/ZONE/autoscalers
{
 "name": "AUTOSCALER_NAME",
 "target": "zones/ZONE/instanceGroupManagers/MIG_NAME",
 "autoscalingPolicy": {
  "maxNumReplicas": MAX_INSTANCES,
  "minNumReplicas": MIN_INSTANCES,
  "customMetricUtilizations": [
    {
      "metric": "METRIC_URL",
      "utilizationTarget": TARGET_VALUE,
      "utilizationTargetType": TARGET_TYPE
    }
  ],
 }
}

如果您的指标有多个值,并且您希望使用单个值进行自动扩缩,请使用 filter 参数,如以下 API 调用所示:

POST https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/zones/ZONE/autoscalers
{
 "name": "AUTOSCALER_NAME",
 "target": "zones/ZONE/instanceGroupManagers/MIG_NAME",
 "autoscalingPolicy": {
  "maxNumReplicas": MAX_INSTANCES,
  "minNumReplicas": MIN_INSTANCES,
  "customMetricUtilizations": [
    {
      "metric": "METRIC_URL",
      "utilizationTarget": TARGET_VALUE,
      "utilizationTargetType": TARGET_TYPE,
      "filter": "METRIC_FILTER"
    }
  ],
 }
}

替换以下内容:

  • PROJECT_ID:您的项目 ID
  • ZONE:该 MIG 所在的可用区。
  • AUTOSCALER_NAME:自动扩缩器的名称。
  • MIG_NAME:您要在其中添加自动扩缩器的 MIG。
  • MAX_INSTANCES:MIG 可以拥有的虚拟机数上限。
  • MIN_INSTANCES:MIG 需要具有的虚拟机数下限。
  • METRIC_URL:Monitoring 指标的无协议网址。例如 compute.googleapis.com/instance/uptime。如果您使用自定义指标,则该指标必须满足自定义指标要求
  • TARGET_VALUE:自动扩缩器尝试维持的指标值。
  • TARGET_TYPE:指标的值类型。
    • GAUGE:自动扩缩器会计算过去几分钟内收集的数据的平均值,并将该值与利用率目标进行比较。
    • DELTA_PER_MINUTE:自动扩缩器会计算每分钟的平均增长率,并将该增长率与利用率目标进行比较。
    • DELTA_PER_SECOND:自动扩缩器会计算每秒的平均增长率,并将该增长率与利用率目标进行比较。为了进行准确的比较,如果您以秒为单位设置利用率目标,请使用 DELTA_PER_SECOND 作为目标类型。同样,如果您以分钟为单位设置利用率目标,请使用 DELTA_PER_MINUTE
  • METRIC_FILTER:应用过滤条件,以使用具有多个值的指标中的一个值并指定受监控的资源类型。如果您使用来自每个虚拟机的指标,则无需指定受监控的资源类型,因为 gce_instance 用作默认值。对于其他指标,您必须使用 resource.type 选择器指定受监控的资源。如需详细了解指标过滤条件,请参阅 Monitoring 指标概念

根据 MIG 中每个虚拟机的可用工作量进行自动扩缩

如果要根据 MIG 中每个虚拟机可用的工作量进行自动扩缩,请指定单个实例分配。您设置的单个实例分配的值表示您希望每个虚拟机处理的工作量。 自动扩缩器将指标值除以单个实例分配值来计算需要的虚拟机数量。

指标值为 0 表示 MIG 没有要完成的工作。如果 MIG 的最小实例数设置为 0,且指标值下降到 0,则 MIG 会缩容为 0,直到指标值增加。

如果指标具有多个值,请应用过滤条件以使用指标中的单个值进行自动扩缩。如需详细了解指标过滤条件以及可在配置中使用的其他字段,请参阅 Monitoring 指标概念

控制台

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

    转到“实例组”

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

  3. 点击修改

  4. 如果不存在自动扩缩配置:

    1. 自动扩缩下,点击配置自动扩缩
    2. 自动扩缩模式下,选择开启:在实例组中添加和移除实例以启用自动扩缩功能。
  5. 自动扩缩下的自动扩缩信号部分中,如果存在 Monitoring 指标的信号,您可以点击以修改该指标,或点击添加信号以添加新指标。

  6. 信号类型设置为 Cloud Monitoring 指标

  7. 点击配置。在打开的资源和指标窗格中,执行以下操作:

    1. 点击选择指标
      1. 选择要用于自动扩缩的指标。您可以根据任何关键字(例如内存、字节、磁盘)过滤指标。
      2. 点击应用。此窗格会显示一个图表,其中显示所选指标的数据。
    2. 如果要使用指标中的特定数据,请添加基于标签的过滤条件,如下所示:

      1. 过滤部分,点击添加过滤条件 (Add a filter)。
      2. 选择一个标签,然后输入一个
      3. 点击完成。系统会刷新图表以显示过滤后的指标值。
    3. 如需查看将用于自动扩缩 MIG 的指标的聚合值,请切换在图表中显示聚合按钮。系统会刷新图表以显示聚合值。

    4. 自动扩缩的指标目标选项部分中,选择单个虚拟机实例分配

    5. 提供单个实例分配值,该值表示要分配给 MIG 中每个虚拟机的工作量。

    6. 完成指标配置后,点击选择

  8. 查看指标详情,然后点击完成

  9. 要完成配置,请点击保存

gcloud

如需配置根据 Monitoring 指标的自动扩缩,请使用 set-autoscaling 命令

在该命令中,请指定 --stackdriver-metric-single-instance-assignment 标志,以指示您希望实例组中的每个虚拟机处理的工作量。

以下命令会根据每个虚拟机的工作分配创建自动扩缩器。

gcloud compute instance-groups managed set-autoscaling MIG_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

替换以下内容:

  • MIG_NAME:您要在其中添加自动扩缩器的 MIG 的名称。
  • MAX_INSTANCES:MIG 可以拥有的虚拟机数上限。
  • MIN_INSTANCES:MIG 需要具有的虚拟机数下限。
  • METRIC_URL:Monitoring 指标的无协议网址。例如 compute.googleapis.com/instance_group/size。如果您使用自定义指标,则该指标必须满足自定义指标要求
  • METRIC_FILTER:应用过滤条件,以使用具有多个值的指标中的一个值并指定受监控的资源类型。如需详细了解指标过滤条件,请参阅 Monitoring 指标概念
  • INSTANCE_ASSIGNMENT:要分配给 MIG 中的每个虚拟机实例的工作量。

REST

如需配置根据区域级 MIG 的 Monitoring 指标的自动扩缩,请使用 autoscalers 资源,或者对于区域级 MIG,请使用 regionAutoscalers 资源。

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

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

POST https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/zones/ZONE/autoscalers

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

替换以下内容:

  • PROJECT_ID:您的项目 ID
  • ZONE:该 MIG 所在的可用区。
  • AUTOSCALER_NAME:自动扩缩器的名称。
  • MIG_NAME:您要在其中添加自动扩缩器的 MIG 的名称。
  • MAX_INSTANCES:MIG 可以拥有的虚拟机数上限。
  • MIN_INSTANCES:MIG 需要具有的虚拟机数下限。
  • METRIC_URL:Monitoring 指标的无协议网址。例如 compute.googleapis.com/instance_group/size。如果您使用自定义指标,则该指标必须满足自定义指标要求
  • METRIC_FILTER:应用过滤条件,以使用具有多个值的指标中的一个值并指定受监控的资源类型。如需详细了解指标过滤条件,请参阅 Monitoring 指标概念
  • INSTANCE_ASSIGNMENT:要分配给 MIG 中的每个虚拟机实例的工作量。

根据指标进行自动扩缩的示例

本部分提供了一些用于自动扩缩的指标示例。如需查看完整的指标列表,请参阅 Google Cloud 指标

根据自定义指标进行自动扩缩

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

假设采用以下设置:

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

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

您可以使用利用率目标 (250) 为实例组配置自动扩缩功能,该目标代表自动扩缩器将尝试维持的指标值的变化率:

控制台

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

    转到“实例组”

  2. 在列表中点击您的 MIG 的名称,以打开实例组概览页面。

  3. 点击修改

  4. 如果不存在自动扩缩配置:

    1. 自动扩缩下,点击配置自动扩缩
    2. 自动扩缩模式下,选择开启:在实例组中添加和移除实例以启用自动扩缩功能。
  5. 自动扩缩下的自动扩缩信号部分中,点击添加信号

  6. 信号类型设置为 Cloud Monitoring 指标

  7. 点击配置。此时会打开资源和指标窗格。

    1. 点击选择指标
      1. 全局 > 自定义指标中选择您的指标。
      2. 点击应用
    2. 过滤条件部分,执行以下操作:
      1. 点击添加过滤条件
      2. 标签下拉列表中,选择 group_name
      3. 字段中,提供 our-instance-group
      4. 点击完成。系统会刷新图表以显示指标的过滤值。
    3. 自动扩缩的指标目标选项部分中,执行以下操作:
      1. 选择利用率目标
      2. 输入利用率目标值 250。
      3. 将利用率目标类型设置为增量 / 秒
    4. 配置指标后,点击选择
  8. 查看指标详情,然后点击完成

  9. 完成操作后,点击保存

gcloud

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

REST

POST https://compute.googleapis.com/compute/v1/projects/my-project/zones/us-central1-a/autoscalers
{
"name": "our-instance-group-autoscaler",
"target": "https://www.googleapis.com/compute/v1/projects/my-project/zones/us-central1-a/instanceGroupManagers/our-instance-group",
"autoscalingPolicy": {
  "maxNumReplicas": 50,
  "minNumReplicas": 0,
  "customMetricUtilizations": [
    {
      "filter": "metric.labels.group_name=\"our-instance-group\" AND resource.type = \"global\"",
      "utilizationTargetType": "delta-per-second",
      "utilizationTarget": 250.0,
      "metric": "custom.googleapis.com/example_average_latency"
    }
  ]
}
}

根据 Pub/Sub 中未确认的消息进行自动扩缩

如需根据 Pub/Sub 订阅中未确认的消息配置自动扩缩,请使用 pubsub 提供的 subscription/num_undelivered_messages 指标并按 subscription ID 过滤。

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

如果您没有订阅,则可以在配置自动扩缩之前创建拉取推送BigQuery 订阅。

控制台

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

    转到“实例组”

  2. 在列表中点击您的 MIG 的名称,以打开实例组概览页面。

  3. 点击修改

  4. 如果不存在自动扩缩配置:

    1. 自动扩缩下,点击配置自动扩缩
    2. 自动扩缩模式下,选择开启:在实例组中添加和移除实例以启用自动扩缩功能。
  5. 自动扩缩信号部分中,点击添加信号

  6. 信号类型设置为 Cloud Pub/Sub 队列

  7. 选择一个主题。如果您需要新主题,请点击创建主题创建主题

  8. 选择要根据其自动扩缩 MIG 的订阅。如果您需要新订阅,请点击创建订阅创建订阅

  9. 要分配给每个虚拟机的消息数字段中,指定您希望每个虚拟机处理的未确认消息数量。

  10. 点击完成

  11. 完成操作后,点击保存

gcloud

gcloud compute instance-groups managed set-autoscaling MIG_NAME \
  --max-num-replicas=MAX_INSTANCES \
  --min-num-replicas=MIN_INSTANCES \
  --update-stackdriver-metric=pubsub.googleapis.com/subscription/num_undelivered_messages \
  --stackdriver-metric-filter="resource.type=\"pubsub_subscription\" AND resource.labels.subscription_id=\"SUBSCRIPTION_ID\"" \
  --stackdriver-metric-single-instance-assignment=NUMBER_OF_MESSAGES_TO_ASSIGN_TO_EACH_VM

REST

如需为可用区级 MIG 配置自动扩缩功能,请使用 autoscalers 资源;对于区域级 MIG,请使用 regionAutoscalers 资源。

例如,进行以下调用,为可用级 MIG 创建自动扩缩器。

POST https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/zones/ZONE/autoscalers
{
"name": "AUTOSCALER_NAME",
"target": "https://www.googleapis.com/compute/v1/projects/PROJECT_ID/zones/ZONE/instanceGroupManagers/MIG_NAME",
"autoscalingPolicy": {
  "maxNumReplicas": MAX_INSTANCES,
  "minNumReplicas": MIN_INSTANCES,
  "customMetricUtilizations": [
    {
      "singleInstanceAssignment": NUMBER_OF_MESSAGES_TO_ASSIGN_TO_EACH_VM,
      "filter": "resource.type = \"pubsub_subscription\" AND resource.labels.subscription_id=\"SUBSCRIPTION_ID\"",
      "metric": "pubsub.googleapis.com/subscription/num_undelivered_messages"
    }
  ]
}
}

根据传入的网络流量进行自动扩缩

如需根据传入到 MIG 中虚拟机的网络流量来配置自动扩缩,请使用 compute 提供的 instance/network/received_bytes_count 指标。

控制台

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

    转到“实例组”

  2. 在列表中点击您的 MIG 的名称,以打开实例组概览页面。

  3. 点击修改

  4. 如果不存在自动扩缩配置:

    1. 自动扩缩下,点击配置自动扩缩
    2. 自动扩缩模式下,选择开启:在实例组中添加和移除实例以启用自动扩缩功能。
  5. 自动扩缩下的自动扩缩信号部分中,点击添加信号

  6. 信号类型设置为 Cloud Monitoring 指标

  7. 点击配置。此时会打开资源和指标窗格。

    1. 点击选择指标
      1. 选择虚拟机实例 > 实例 > 接收的字节数 (compute.googleapis.com/instance/network/received_bytes_count)。
      2. 点击应用
    2. 自动扩缩的指标目标选项部分中,执行以下操作:
      1. 确保选择利用率目标
      2. 输入利用率目标值。
      3. 设置利用率目标类型。
    3. 配置指标后,点击选择
  8. 查看指标详情,然后点击完成

  9. 完成操作后,点击保存

gcloud

gcloud compute instance-groups managed set-autoscaling MIG_NAME \
  --max-num-replicas=MAX_INSTANCES \
  --min-num-replicas=MIN_INSTANCES \
  --update-stackdriver-metric=compute.googleapis.com/instance/network/received_bytes_count \
  --stackdriver-metric-utilization-target=TARGET_VALUE \
  --stackdriver-metric-utilization-target-type=TARGET_TYPE

REST

POST https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/zones/ZONE/autoscalers
{
"name": "AUTOSCALER_NAME",
"target": "https://www.googleapis.com/compute/v1/projects/PROJECT_ID/zones/ZONE/instanceGroupManagers/MIG_NAME",
"autoscalingPolicy": {
  "maxNumReplicas": MAX_INSTANCES,
  "minNumReplicas": MIN_INSTANCES,
  "customMetricUtilizations": [
    {
      "utilizationTargetType": "TARGET_TYPE",
      "utilizationTarget": TARGET_VALUE,
      "metric": "compute.googleapis.com/instance/network/received_bytes_count"
    }
  ]
}
}

根据内存使用量进行自动扩缩

如需根据已用内存的百分比配置自动扩缩,请指定 Ops Agent 内存指标提供的 percent_used 指标。您应按 state 过滤指标,以便只使用 used 内存状态。如果您未指定过滤条件,自动扩缩器会按标记为 bufferedcachedfreeslabused 的所有内存状态获取内存总用量。

控制台

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

    转到“实例组”

  2. 在列表中点击您的 MIG 的名称,以打开实例组概览页面。

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

  4. 如果不存在自动扩缩配置:

    1. 自动扩缩下,点击配置自动扩缩
    2. 自动扩缩模式下,选择开启:在实例组中添加和移除实例以启用自动扩缩功能。
  5. 自动扩缩下的自动扩缩信号部分中,点击添加信号

  6. 信号类型设置为 Cloud Monitoring 指标

  7. 点击配置。此时会打开资源和指标窗格。

    1. 点击选择指标
      1. 选择虚拟机实例 > 内存 > 内存利用率 (compute.googleapis.com/instance/memory/percent_used)。
      2. 点击应用
    2. 过滤条件部分,执行以下操作:
      1. 点击添加过滤条件
      2. 标签下拉列表中,选择状态指标标签。
      3. 字段中,输入 used
      4. 点击完成
    3. 自动扩缩的指标目标选项部分中,执行以下操作:
      1. 确保选择利用率目标
      2. 输入利用率目标值。
      3. 将利用率目标类型设置为采样平均值
    4. 配置指标后,点击选择
  8. 查看指标详情,然后点击完成

  9. 完成操作后,点击保存

gcloud

gcloud compute instance-groups managed set-autoscaling MIG_NAME \
  --max-num-replicas=MAX_INSTANCES \
  --min-num-replicas=MIN_INSTANCES \
  --update-stackdriver-metric=agent.googleapis.com/memory/percent_used \
  --stackdriver-metric-filter="metric.labels.state = \"used\""
  --stackdriver-metric-utilization-target-type=gauge \
  --stackdriver-metric-utilization-target=TARGET_VALUE  \

REST

POST https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/zones/ZONE/autoscalers
{
"name": "AUTOSCALER_NAME",
"target": "https://www.googleapis.com/compute/v1/projects/PROJECT_ID/zones/ZONE/instanceGroupManagers/MIG_NAME",
"autoscalingPolicy": {
  "maxNumReplicas": MAX_INSTANCES,
  "minNumReplicas": MIN_INSTANCES,
  "customMetricUtilizations": [
  {
    "filter": "metric.labels.state=\"used\"",
    "utilizationTargetType": "GAUGE",
    "utilizationTarget": TARGET_VALUE,
    "metric": "agent.googleapis.com/memory/percent_used"
  }
  ]
}
}

根据磁盘 I/O 进行自动扩缩

如需根据磁盘 I/O 操作的总数配置自动扩缩,请使用 Ops Agent 磁盘指标提供的 operation_count 指标。如果要根据读取或写入操作数进行扩缩,请使用 direction 标签过滤指标。同样,若要根据特定设备上的磁盘操作数进行扩缩,请在指标过滤条件中使用 device 标签。

控制台

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

    转到“实例组”

  2. 在列表中点击您的 MIG 的名称,以打开实例组概览页面。

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

  4. 如果不存在自动扩缩配置:

    1. 自动扩缩下,点击配置自动扩缩
    2. 自动扩缩模式下,选择开启:在实例组中添加和移除实例以启用自动扩缩功能。
  5. 自动扩缩下的自动扩缩信号部分中,点击添加信号

  6. 信号类型设置为 Cloud Monitoring 指标

  7. 点击配置。此时会打开资源和指标窗格。

    1. 点击选择指标
      1. 选择虚拟机实例 > 磁盘 > 磁盘操作 (agent.googleapis.com/disk/operation_count)。
      2. 点击应用
    2. 自动扩缩的指标目标选项部分中,执行以下操作:
      1. 确保选择利用率目标
      2. 输入利用率目标值。
      3. 设置利用率目标类型。
    3. 配置指标后,点击选择
  8. 查看指标详情,然后点击完成

  9. 完成操作后,点击保存

gcloud

gcloud compute instance-groups managed set-autoscaling MIG_NAME \
  --max-num-replicas=MAX_INSTANCES  \
  --min-num-replicas=MIN_INSTANCES  \
  --update-stackdriver-metric=agent.googleapis.com/disk/operation_count \
  --stackdriver-metric-utilization-target=TARGET_VALUE  \
  --stackdriver-metric-utilization-target-type=TARGET_TYPE

REST

POST https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/zones/ZONE/autoscalers
{
"name": "AUTOSCALER_NAME",
"target": "https://www.googleapis.com/compute/v1/projects/PROJECT_ID/zones/ZONE/instanceGroupManagers/MIG_NAME",
"autoscalingPolicy": {
  "maxNumReplicas": MAX_INSTANCES,
  "minNumReplicas": MIN_INSTANCES,
  "customMetricUtilizations": [
  {
    "utilizationTargetType": "TARGET_TYPE",
    "utilizationTarget": TARGET_VALUE,
    "metric": "agent.googleapis.com/disk/operation_count"
  }
  ]
}
}

根据其他 MIG 的大小进行自动扩缩

您可以根据同一项目中另一个 MIG 的大小自动扩缩 MIG。例如,您可能具有含有根据负载均衡器进行自动扩缩的前端 MIG 的多层应用和与前端成比例自动扩缩的后端 MIG。使用单个实例分配来定义每个前端虚拟机所需的后端虚拟机数量。如果您需要每 4 个前端虚拟机有 1 个后端虚拟机,请在后端 MIG 中将单个实例分配设置为 4。

如需根据另一个 MIG (MIG_2) 的大小对某个 MIG (MIG_1) 进行自动扩缩,请使用 compute 提供的 instance_group/size 指标。

控制台

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

    转到“实例组”

  2. 在列表中点击您的 MIG 的名称,以打开实例组概览页面。

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

  4. 如果不存在自动扩缩配置:

    1. 自动扩缩下,点击配置自动扩缩
    2. 自动扩缩模式下,选择开启:在实例组中添加和移除实例以启用自动扩缩功能。
  5. 自动扩缩下的自动扩缩信号部分中,点击添加信号

  6. 信号类型设置为 Cloud Monitoring 指标

  7. 点击配置。此时会打开资源和指标窗格。

    1. 点击选择指标
      1. 选择实例组 > Instance_group > 实例组大小 (compute.googleapis.com/instance_group/size)。
      2. 点击应用
    2. 过滤条件部分,执行以下操作:
      1. 点击添加过滤条件
      2. 标签下拉列表中,选择 instance_group_name 资源标签。
      3. 字段中,输入要用于自动扩缩 MIG 的 MIG 的名称 (MIG_2)。
      4. 点击完成
    3. 自动扩缩的指标目标选项部分中,执行以下操作:
      1. 选择单个虚拟机实例分配
      2. 在“单个虚拟机实例分配”字段中,如果要为 MIG_2 中的每 4 个虚拟机保留当前 MIG (MIG_1) 中的 1 个虚拟机,请输入 4
    4. 配置指标后,点击选择
  8. 查看指标详情,然后点击完成

  9. 完成操作后,点击保存

gcloud

gcloud compute instance-groups managed set-autoscaling MIG_1 \
  --max-num-replicas=MAX_INSTANCES \
  --min-num-replicas=MIN_INSTANCES \
  --update-stackdriver-metric=compute.googleapis.com/instance_group/size \
  --stackdriver-metric-filter="resource.type = \"instance_group\" AND resource.labels.location = \"ZONE|REGION\" AND resource.labels.instance_group_name = \"MIG_2\"" \
  --stackdriver-metric-single-instance-assignment=4

REST

POST https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/zones/ZONE/autoscalers
{
"name": "AUTOSCALER_NAME",
"target": "https://www.googleapis.com/compute/v1/projects/PROJECT_ID/zones/ZONE/instanceGroupManagers/MIG_1",
"autoscalingPolicy": {
  "maxNumReplicas": MAX_INSTANCES,
  "minNumReplicas": MIN_INSTANCES,
  "customMetricUtilizations": [
  {
    "singleInstanceAssignment": 4,
    "filter": "resource.type = \"instance_group\" and resource.labels.location = \"ZONE|REGION\" AND resource.labels.instance_group_name = \"MIG_2\"",
    "metric": "compute.googleapis.com/instance_group/size"
  }
  ]
}
}

Monitoring 指标概念

本部分简要介绍了 Monitoring 指标在配置根据 Monitoring 指标的自动扩缩时需要了解的概念。

  • 指标标识符指标网址:无协议网址的指标名称。您可以从指标列表中找到内置指标网址。

    例如,提供未确认消息数量的 Pub/Sub 指标的网址是 pubsub.googleapis.com/subscription/num_undelivered_messages

  • 受监控的资源类型:指标值的来源。您可以从指标列表中找到指标的受监控的资源类型。

    例如,pubsub.googleapis.com/subscription/num_undelivered_messages 指标的受监控资源类型为 pubsub_subscription。如需详细了解每个受监控的资源类型,请参阅受监控的资源类型

  • 指标过滤条件:如果您的指标具有多个值,则过滤条件可让自动扩缩程器从一组可能的指标值中识别特定指标值。使用指标受监控的资源类型中定义的标签来过滤值。如果要使用不同的过滤条件浏览指标值,可以在 Metrics Explorer 中试用它们。

    例如,以下屏幕截图显示了 pubsub.googleapis.com/subscription/num_undelivered_messages 指标,该指标提供了所有可用订阅中未确认消息的数量。图表上的每条线表示一个订阅。

    显示指标值的 Metrics Explorer(没有过滤条件)。

    如果没有过滤条件,自动扩缩器会获取所有订阅的指标值的总和。如需根据单个订阅进行自动扩缩,请对为 pubsub_subscription 定义的 subscription_id 标签应用过滤条件。以下屏幕截图显示了应用过滤条件后的单个订阅。

    显示已过滤指标值的 Metrics Explorer。

指标过滤要求

如果您使用具有多个值(使用标签分类)的指标,则可以应用过滤条件,以根据指标中的特定值进行自动扩缩。如果过滤条件返回多个值,则这些值将加在一起。为获得最佳结果,请创建一个足够具体的过滤条件以返回单个值。

自动扩缩器对指标的过滤与 Monitoring 过滤条件语法兼容。过滤条件必须满足以下要求:

  • 您必须将过滤条件的值用英文双引号引起来。
  • 您必须使用直接相等比较运算符 (=)。
  • 您必须使用 AND 运算符来联接不同的过滤条件。

    例如:--stackdriver-metric-filter="resource.type=\"pubsub_subscription\" AND resource.labels.subscription_id=\"our-subscription\""

  • 您必须使用直接值。您不能在过滤条件中使用通配符或函数。

    例如,您不能使用 resource.labels.zone = starts_with("us-")

  • 您不能使用资源元数据标签来存储有关受监控资源的元数据。

如需查看您可以过滤的指标标签和受监控的资源标签的完整参考文档,请参阅指标列表受监控的资源列表

自定义指标要求

要使用自定义指标,您必须先创建与一个受监控的资源类型关联的自定义指标。

用于自动扩缩的自定义指标必须具有以下属性:

  • 如果自动扩缩配置使用实例组中每个虚拟机的数据,请在 MIG 中设置实例,使得每个虚拟机都导出自定义指标。每个虚拟机的导出值必须与 gce_instance 受监控的资源相关联,该资源包含以下标签:
    • zone:实例所在可用区的名称。
    • instance_id:分配给虚拟机的唯一数字 ID 的值。
  • 指标必须至少每 60 秒导出一次数据。如果您按照比 60 秒更短的间隔时间导出数据,自动扩缩程序可以更快地响应负载变化。如果您按照比 60 秒一次更低的频率时间导出数据,自动扩缩器可能无法足够快速地响应负载变化。
  • 指标必须导出 INT64DOUBLE 值类型的数据。

如需了解如何创建自定义指标,请参阅使用自定义指标

后续步骤