了解自动扩缩程序决策


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

为 MIG 配置自动扩缩器时,自动扩缩器会持续监控实例组,并将实例组的建议大小设置为处理稳定期的峰值负载所需的虚拟机 (VM) 实例数。

建议大小受限于您在自动扩缩政策中设置的最小和最大实例数。

如果您的自动扩缩政策包含缩容控制机制,则建议大小将受到缩容控制机制的进一步限制。

如果您启用预测性自动扩缩,则自动扩缩器会使用历史 CPU 利用率模式来预测未来的负载,并且会根据预测结果来设置实例组的建议大小。

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

  • ON。MIG 将其目标大小设置为建议的大小,然后 Compute Engine 会自动扩容 MIG 以达到其目标大小。
  • ONLY_SCALE_OUT。仅当建议的大小增加时,MIG 的目标大小才会增加。
  • OFF。目标大小不受建议大小的影响。不过,系统仍会计算建议的大小。

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

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

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

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

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

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

如果您将基于时间表的自动扩缩与其他自动扩缩信号结合使用,则活跃时间表所需的虚拟机数量可能会超过满足利用率所需的虚拟机数量。在这些情况下,实际利用率低于目标利用率,因为自动扩缩时间表决定了实例组的建议大小。

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

配置自动扩缩时,您需要指定一个初始化期,以反映虚拟机初始化所需的时长。仅当未初始化的实例的平均利用率高于目标利用率时,自动扩缩器才会建议扩容。

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

缩减资源时出现的延迟

为了缩容实例组,自动扩缩器会根据最近 10 分钟或您设置的初始化期(以较长者为准)来计算实例组的建议目标大小。此时长称为稳定期

观察稳定期内的使用量有助于自动扩缩器执行以下操作:

  • 确保从实例组收集的使用量信息的稳定。
  • 防止自动扩缩程序以过高的速率连续添加或移除实例。
  • 确定较小的实例组足以支持稳定期的峰值负载后,安全地移除实例。
  • 如果您的应用在新虚拟机上初始化需要 10 分钟以上,则实例组会将初始化期用作稳定期。 这确保了自动缩放器删除虚拟机的决策考虑了恢复服务容量所需的时间。

稳定期可能在缩减实例组的过程中表现为延时,但实际上这是自动扩缩的内置功能。稳定期还可确保向托管式实例组添加新实例的情况下,该实例会先完成其初始化期或至少运行 10 分钟,然后才会符合删除条件。

在决定是否缩容实例组时,系统会忽略新实例的初始化期

连接排空导致的延迟

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

缩减控制机制

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

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

  1. 当负载下降时,自动扩缩器会将实例组的大小维持在(稳定期)内观察到的峰值负载所需的级别。无论是否启用缩减控制机制,此操作方式都相同。
  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 分钟或初始化期(以较长者为准)内观察到的峰值负载。 确保在处理指定时间窗口内的负载峰值时,实例组的大小缩减量不会超出工作负载所能容许的虚拟机实例数。

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

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

首次配置自动扩缩器

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

首次配置自动扩缩器。

更改自动扩缩器模式

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

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

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

预测性自动扩缩

如需了解预测性自动扩缩(包括工作原理),请参阅根据预测进行扩缩

准备停止实例

自动扩缩器在缩容时会确定要删除的虚拟机实例数。自动扩缩器根据以下几个因素确定删除虚拟机实例的优先次序,这些因素包括:

  • 因任何原因而未运行的虚拟机。
  • 正在进行或计划进行中断性更改(例如刷新、重启或替换)的虚拟机。
  • 尚未更新至实例模板预期版本的虚拟机。
  • 自动扩缩信号最低的虚拟机。例如,如果您将 MIG 配置为根据 CPU 利用率进行扩缩,并且该实例组需要缩容,则自动扩缩器会尝试移除 CPU 利用率最低的虚拟机。

在停止实例之前,您可能需要确保这些实例执行某些特定任务,例如关闭所有现有连接、正常关闭所有应用或应用服务器、上传日志等。您可以指示实例使用关闭脚本来执行这些任务。 系统会在发出停止请求到实际停止实例之间的短暂期间内尽可能运行关停脚本。在此期间,Compute Engine 将尝试运行您的关停脚本以执行您在其中指定的所有任务。

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

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

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

监控自动扩缩图表和日志

Compute Engine 提供了多个图表和日志,您可以随时监控代管式实例组的行为。

您可以在 Google Cloud 控制台中访问图表和日志。

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

    转到“实例组”

  2. 点击您要查看的托管式实例组的名称。
  3. 在托管式实例组页面上,选择监控标签页。

监控图表显示以下指标的发展变化:

  • 组大小
  • 自动扩缩器利用率
  • CPU 利用率
  • 磁盘输入/输出(字节数)
  • 磁盘输入/输出(操作次数)
  • 网络字节数
  • 网络数据包量

每个图表标题旁边的提示可提供所显示指标的额外上下文详细信息。

页面底部提供了一个日志面板,您可以在其中找到托管式实例组的事件日志列表。如需查看日志,请点击展开箭头。

所有图表和日志都绑定到单个时间范围,您可以使用时间范围选择器自定义时间范围。通过在任何图表上进行点击和拖动,您可以放大特定事件,并分析选定时间范围内的图表和日志。

监控预测性自动扩缩

Compute Engine 提供了一个用于监控自动扩缩器预测结果的图表。如需查看此图表,请点击第一个图表中的组大小标题,然后选择预测性自动扩缩

启用自动扩缩功能后,您可以查看自动扩缩器预测结果如何确定实例组的大小。如果未启用自动扩缩功能,您仍然可以查看自动扩缩器预测结果并使用这些预测结果作出与组大小相关的决策。

以下信息可帮助您理解此图表。

  • 蓝线表示托管式实例组中的实例数。
  • 绿线表示自动扩缩器预测的实例数。
    • 如果绿线位于蓝线之下,则表示有大量可用容量,且您的虚拟机实例很可能未得到充分利用。
    • 如果绿线位于蓝线之上,则表示剩余容量极少(如果还有),您应该向实例组添加更多实例。
  • 水平的红色虚线表示实例组中允许的实例数下限和上限。

查看状态消息

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

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

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

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

    转到“实例组”

  2. 查找名称前带有警告图标的任何实例组。

    例如:

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

  3. 将鼠标指针悬停在状态图标上,即可获取状态消息的详细信息。

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

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

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

    转到“实例组”

  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 指标进行自动扩缩,但您提供的指标不存在、缺少所需的标签或无法通过 Compute Engine 服务代理进行访问。

Quota for some resources is exceeded. Increase the quota or delete resources to free up more quota.

您可以在 Google Cloud 控制台的“配额”页面上获取有关可用配额的信息。

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.

实例组正在进行负载平衡,但该组没有传入查询。该服务可能正处于空闲期,在这种情况下,您无需担心。但是,此消息也可能是由配置错误导致;例如,自动扩缩的实例组可能是多个负载均衡器的目标,而这种情况并不受支持。如需查看完整的指南列表,请参阅负载均衡文档中的限制与准则