了解自动扩缩程序决策

自动扩缩功能可自动扩缩代管实例组 (MIG),即自动添加虚拟机(横向扩容)或移除虚拟机(缩减)。本文档介绍了自动扩缩器如何确定在何时扩缩 MIG。

为 MIG 配置自动扩缩器后,自动扩缩器会持续监控该实例组,并将该实例组的 recommendedSize 设置为处理最近 10 分钟内的峰值负载所需的虚拟机 (VM) 实例数。这些最近 10 分钟时段称为稳定期

如果您使用缩减控制机制设置了自动扩缩政策,recommendedSize 会受到缩减控制机制的限制。

MIG 对自动扩缩器建议大小的响应取决于您如何配置自动扩缩器的 mode

  • ON。MIG 将其 targetSize 设置为建议的大小,实例组自动扩缩以符合其目标大小。
  • ONLY_SCALE_OUT。仅当建议的大小增加时,MIG 的目标大小才会增加。
  • OFF。目标大小不受建议大小的影响。不过,系统仍会计算建议的大小。

如果删除自动扩缩程序配置,则不计算建议的大小。

目标利用率和实际利用率之间的差距

在自动扩缩过程中,您会注意到较小实例组的实际利用率和目标利用率之间存在较大差距。这是因为自动扩缩程序在解释利用率数据,并确定要添加或移除的实例数时,始终会通过向上或向下舍入来保守地进行操作。这种做法可防止自动扩缩器添加的资源数量不足,或移除过多的资源。

例如,如果您将利用率目标设置为 0.7,而您的应用超出了利用率目标,则自动扩缩器可能会断定添加 1.5 个虚拟机 (VM) 实例会将利用率降低到接近 0.7。由于无法添加 1.5 个虚拟机实例,因此自动扩缩器会向上舍入并添加 2 个实例。这可能会导致平均 CPU 利用率降到低于 0.7,但可确保有足够的资源来支持您的应用。

同样,如果自动扩缩器确定移除 1.5 个虚拟机实例会将您的利用率提高到接近 0.7,它将只会移除一个实例。

对于拥有较多虚拟机实例的较大实例组,利用率会在大量实例之间分配,因此添加或移除虚拟机实例会缩小实际利用率与目标利用率之间的差距。

地区级 MIG 和不均匀的虚拟机分布

如果某个地区的各个区域之间的实例数不平衡(无论是因为从区域性故障恢复,还是因为工作负载分布不均匀),自动扩缩功能将使更多实例在实际利用率高于平均值的区域中运行。Compute Engine 会采取此预防措施来确保整个地区以及所有区域的高可用性,即使有些区域的负载比有些区域的负载更重也是如此。

横向扩容资源时出现的延迟

配置自动扩缩时,您可以指定一个冷却期,用于反映虚拟机初始化所需的时长。在冷却期内,自动扩缩器会忽略虚拟机的使用情况数据。

如果您设置的冷却期值明显长于实例初始化所花费的时间,则您的自动扩缩器可能会忽略合理的利用率数据,并且可能会低估您的实例组所需的规模。

缩减资源时出现的延迟

为了缩减实例组,自动扩缩器会根据最近 10 分钟内的峰值负载来计算该实例组的建议目标大小。这些最近 10 分钟时段称为稳定期

观察最近 10 分钟的使用率可为自动调节程序提供以下帮助:

  • 确保从实例组收集的是稳定的用量信息。
  • 防止自动扩缩程序以过高的速率连续添加或移除实例。
  • 确定较小的实例组足以支持最近 10 分钟的峰值负载后,安全地移除实例。

这 10 分钟的稳定期可能在缩减实例组的过程中表现为延时,但实际上这是自动扩缩的内置功能。此外,如果代管实例组中添加了新实例,那么这种延迟还可确保该新实例至少运行 10 分钟后才能停止。

在决定是否缩减实例组资源时,系统会忽略新实例的冷却期

连接排空导致的延迟

如果该实例组属于已启用连接排空后端服务,则在连接排空结束后,最长可能需要再等待 60 秒才会移除或删除虚拟机实例。

缩减控制机制

配置自动扩缩器的缩减控制机制时,您可以控制缩减的速度。自动扩缩器的缩减速度绝不会超过您配置的速度:

启用以及未启用缩减控制机制的自动扩缩器。

  1. 当负载下降时,自动扩缩器会将实例组的大小维持在处理最近 10 分钟(稳定期)内观察到的峰值负载所需的级别。无论是否启用缩减控制机制,此操作方式都相同。
  2. 未启用缩减控制机制的自动扩缩器仅保留足以处理最近观察到的负载所需的实例。稳定期过后,自动扩缩器将一步移除所有不需要的实例。如果负载突然下降,可能会导致实例组大小大幅减小。
  3. 启用了缩减控制机制的自动扩缩器可限制在配置的时间段内可以移除的虚拟机实例数(这里为 20 分钟 10 个虚拟机)。这可以减慢实例的减少速率。
  4. 如果出现新的负载峰值,自动扩缩器会添加新实例来处理负载。不过,由于初始化时间较长,新虚拟机无法马上准备好处理负载。借助缩减控制机制,系统可以保留以前的容量,从而使现有虚拟机能够应对峰值。

您可以控制缩减的速度,方法是配置自动扩缩器在随后的一个时间窗口内允许的最大减少量,具体如下:

  • 允许的最大减少量maxScaledInReplicas:虚拟机实例的数量或百分比)。这是指在随后的一个指定时间窗口内,您的工作负载可以接受实例数比该实例组的实例数峰值低多少。借助此参数,您可以限制实例组的缩减幅度,这样,在更多实例开始处理负载之前,您仍然可以处理可能的负载峰值。允许的最大减少量越小,缩减速度越慢。
  • 随后的时间窗口timeWindowSec:秒)。在这段时间内,负载峰值可能会出现临时下降的情况,而您不希望实例组大小的缩减幅度超出允许的最大减少量。借助此参数,您可以指定供自动扩缩器查找足以处理历史负载的实例数峰值的时间窗口。在自动扩缩器调整的过程中,实例组的大小不会低于在随后的时间窗口内观察到的实例数峰值与允许的最大减少量之差。如果随后的一个时间窗口较长,自动扩缩器会考虑更多历史峰值负载,这会使缩减更加保守和稳定。

设置缩减控制机制后,自动扩缩器会将扩缩操作限制为低于允许的最大减少量(由在随后的时间窗口内观察到的实例数峰值得出)。自动扩缩器按以下步骤操作:

  1. 持续监控在随后的时间窗口内观察到的历史实例数峰值。
  2. 使用允许的最大减少量来计算受限的缩减大小(实例数峰值:maxScaledInReplicas
  3. 将实例组的建议大小设置为受限的缩减大小。例如,如果自动扩缩器会将实例组的大小调整为 20 个虚拟机,但缩减限制仅允许缩减为 40 个虚拟机,则推荐大小应设置为 40 个虚拟机。

借助缩减控制机制,自动扩缩器会在随后的已配置时间窗口内持续监控实例组的实例数峰值,以确定足以处理历史负载的实例数量。自动扩缩器操作的缩减量不会高于从观察到的实例数峰值中得出的允许的最大减少量。

启用了缩减控制机制的自动扩缩器。

例如,在上图中,缩减控制机制配置为在随后 30 分钟的时间窗口内允许的最大减少量为 20 个虚拟机:

  1. 当负载下降时,自动扩缩器会移除 20 个虚拟机,这是在缩减控制机制中配置的允许的最大减少量。
  2. 随着负载的增加和减少,自动扩缩器会持续监控最近 30 分钟的随后时间窗口,以确保实例数峰值足以处理历史负载。此实例数峰值是缩减控制机制限制缩减速度的基础。如果在最近 30 分钟内,实例数峰值为 70 个虚拟机,而允许的最大减少量设置为 20 个虚拟机,则自动扩缩器可以将实例组大小缩减为 50 个虚拟机。如果当前大小为 65 个虚拟机,自动扩缩器只能移除 15 个虚拟机。
  3. 随着负载的降低,自动扩缩器会继续移除虚拟机实例,但会将速度限制为实例组最近 30 分钟内测量得出的实例数峰值与最多 20 个虚拟机之差。

实例组可能会同时发生允许的最大减少情况,因此您应该配置允许的最大减少量,使您的应用能够接受一次移除这么多实例。使用允许的最大减少量参数来指明应用可以容许处理能力降低多少。

通过限制自动扩缩功能可以移除的虚拟机实例数并延长随后观察到的时间窗口,具有负载峰值以及初始化时间较长的应用应该会获得更高的可用性。特别是,实例组大小不会因负载大幅下降而突然下降,而是会随着时间的推移逐渐减小。如果在缩减后不久就出现了负载峰值,则剩余数量的虚拟机应该仍然能够在您容许的范围内处理该峰值。此外,几乎不需要启动虚拟机,就足以处理峰值。

您可以配置缩减控制机制,用于自动扩缩区域级和地区级 MIG。这两种情况的配置相同。缩减控制机制适用于任何实例组大小。

缩减控制机制与自动扩缩器稳定机制

配置缩减控制机制并不意味着关闭自动扩缩器内置的稳定机制。自动扩缩器始终会将实例组的大小维持在处理随后 10 分钟的稳定期内观察到的峰值负载所需的级别。缩减控制机制为您提供了一种额外的机制来控制实例组的大小调整速度。

自动扩缩器内置:
稳定期
缩减控制机制:
随后的时间窗口
是否可配置 否,不可配置 是,可配置
监控的内容 监控过去 10 分钟的峰值负载 监控由随后的时间窗口设置的上一个时段内实例组的实例组峰值
此功能有何作用? 确保实例组大小足以处理最近 10 分钟内观察到的峰值负载。 确保在处理指定时间窗口内的负载峰值时,实例组的大小缩减量不会超出工作负载所能容许的虚拟机实例数。

自动扩缩器模式下的缩减控制机制

在您的 MIG 无法自动扩缩,而您希望启用自动扩缩时,存在两种类似但又略有不同的情况。这些取决于您是首次配置自动扩缩功能,还是配置了自动扩缩,但暂时限制或关闭了该功能。

首次配置自动扩缩器

如果您的 MIG 无法自动扩缩,而您需要从头开始配置自动扩缩功能,自动扩缩器会使用当前的 MIG 大小作为起点。在缩减之前,自动扩缩器使用稳定期,然后使用缩减控制机制来限制缩减速度:

首次配置自动扩缩器。

更改自动扩缩器模式

自动扩缩模式下,您可以暂时关闭或限制自动扩缩活动。自动扩缩器的配置将保持不变,自动扩缩器在关闭或受限时会继续执行后台计算。在关闭或受限模式下,自动扩缩器会在后台计算中考虑缩减控制机制。当您再次启用自动扩缩功能或解除限制时,所有自动扩缩活动将恢复为使用最近的计算:

恢复自动扩缩器(包括缩减控制机制)。

  1. 自动扩缩器启用后的行为方式与平常一样(在本示例中也会启用缩减控制机制)。
  2. 关闭自动扩缩器后,它仍会根据负载计算建议的实例组大小。自动扩缩器计算仍会考虑缩减控制机制。不过,自动扩缩器在关闭后不会应用大小计算。在自动扩缩器再次启用之前,实例组大小将保持不变。
  3. 在您再次启用自动扩缩器后,它会立即应用之前计算出的大小。这样可以更快地扩缩到正确的大小。重新启用自动扩缩器可能会导致实例组突然缩减(此处为从 80 个虚拟机实例缩减到 40 个)。此操作是安全的,因为后台计算已经考虑了缩减控制机制。

准备停止实例

自动扩缩器在扩容时,会确定需要关停的虚拟机实例数量,并从实例组中移除利用率较低的虚拟机实例。在停止实例之前,您可能需要确保这些实例执行某些特定任务,例如关闭所有现有连接、正常关闭所有应用或应用服务器、上传日志等。您可以指示实例使用关停脚本来执行这些任务。

系统会在发出停止请求到实际停止实例之间的短暂期间内尽可能运行关停脚本。在此期间,Compute Engine 将尝试运行您的关停脚本以执行您在其中指定的所有任务。

如果您要对代管实例组使用负载平衡,则此功能会特别有用。如果您的实例运行状况不佳,则负载平衡器可能需要过一段时间才能识别出实例运行状况不佳,而这会导致负载平衡器继续向该实例发送新请求。如果使用关闭脚本,则实例会在关闭时报告其运行状况不佳,以便负载平衡器停止向该实例发送流量。如需了解详情,请参阅负载平衡文档中的处理运行状况不佳的实例

如需详细了解关停脚本,请参阅关停脚本

如需详细了解实例关停,请参阅关于停止删除实例的文档。

查看自动扩缩图表以了解利用率

如果您有一个正在使用自动扩缩的代管实例组,Compute Engine 会提供一个自动扩缩图表,用于跟踪任何时间点的总利用率和自动扩缩的实例数量。您可以通过 Google Cloud Console 访问此图表。

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

    转到“实例组”页面

  2. 点击要查看的自动扩缩的代管实例组的名称。 请注意,此实例组必须是按 CPU 利用率进行自动扩缩(尚不支持其他自动扩缩指标)。
  3. 在代管实例组详情页面上,选择监控标签页(如果尚未选择)。

    “监控”标签页。

  4. 确保在下拉列表中选择了自动扩缩的实例数

该图表跟踪实例数量与 CPU 利用率的关系。以下信息可帮助理解这些图表:

  • 上方图表中的蓝线表示代管实例组中的实例数。
  • 下方图表中的蓝线表示该实例组的总 CPU 利用率。
  • 下方图表中的绿线表示该代管实例组剩余的可用容量。
    • 如果绿线位于蓝线之上,则表示有大量可用容量,且您的虚拟机实例很可能未得到充分利用。
    • 如果绿线位于蓝线之下,则表示剩余容量极少(如果还有),您应该向实例组添加更多实例。
  • 如果容量下降,则可能意味着实例组的规模已经缩小,因此上方图表中的蓝线也将下降。同样,如果您的容量增加,则实例组的规模很可能也会增大。

例如,下图截取的是一个已达到其容量的自动扩缩的代管实例组图片,在图中显示的情况下,会导致自动扩缩程序向该组添加更多虚拟机实例,从而增大该组的容量。

如果利用率超过容量,则自动扩缩器会添加实例。如果利用率下降达到 10 分钟,则自动扩缩器会移除实例。
自动扩缩图表

查看状态消息

自动调节程序在调节过程中遇到问题时,会返回警告或错误消息。您可以通过以下两种方式查看这些状态消息。

在“实例组”页面上查看状态消息

您可以直接在 Google Cloud Console 中的实例组页面上查看状态消息。

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

    转到“实例组”页面

  2. 查找所有具有“警告”图标 (!) 的实例组。例如:

    实例组页面上的状态消息。

  3. 将鼠标悬停在状态图标上以获取状态消息的详情。

在“实例组详情”页面上查看状态消息

您可以直接转到特定实例组的详情页面以查看相关的状态消息。

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

    转到“实例组”页面

  2. 点击要查看其状态消息的实例组。
  3. 在详情页面的成员标签页上查看状态消息。 例如:

    实例组详情页面上的状态消息。

常见的返回状态消息

自动调节程序在调节过程中遇到问题时,会返回警告或错误消息。以下是一些常见的返回消息及其含义。

All instances in the instance group are unhealthy (not in RUNNING state). If this is an error, check the instances.
实例组中的所有实例均处于非 RUNNING 状态。如果这是故意为之,那么您可以忽略此消息; 否则请对实例组进行问题排查。
The number of instances has reached the maxNumReplicas. The autoscaler cannot add more instances.
您在创建自动扩缩器时指定了实例组可以拥有的实例数上限。自动扩缩器目前正在尝试执行实例组横向扩容以满足需求,但已达到 maxNumReplicas。如需了解如何将 maxNumReplicas 更新为较大的数字,请参阅更新自动扩缩器
The monitoring metric that was specified does not exist or does not have the required labels. Check the metric.
虽然您使用 Cloud Monitoring 指标进行自动扩缩,但您提供的指标不存在或缺少所需的标签。所需的标签会有所不同,具体取决于指标是标准指标还是自定义指标。如需了解详情,请参阅根据 Monitoring 指标扩缩资源
Quota for some resources is exceeded. Increase the quota or delete resources to free up more quota.
您可以在 Google Cloud Console 的“配额”页面上获取有关可用配额的信息。
Autoscaling does not work with an HTTP/S load balancer configured for maxRate.
实例组正在以 maxRate 配置进行负载平衡,但自动扩缩程序不支持此模式。因此,请更改该配置或停用自动扩缩功能。如需详细了解 maxRate,请参阅负载平衡文档中的限制与准则
The autoscaler is configured to scale based on a load balancing signal but the instance group has not received any queries from the load balancer. Check that the load balancing configuration is working.
实例组正在进行负载平衡,但该实例组没有传入查询。该服务可能正处于空闲期,在这种情况下,您无需担心。但是,此消息也可能是由配置错误导致;例如,自动扩缩的实例组可能是多个负载平衡器的目标,而这种情况并不受支持。如需查看完整的指南列表,请参阅负载平衡文档中的限制与准则