Cloud Run 服务中的实例自动扩缩简介

在 Cloud Run 中,每个修订版本都会根据处理所有传入请求、实例或 CPU 利用率所需的实例数量自动扩缩。

当修订版本未收到任何流量时,它默认会缩容到零个实例。但是,如果需要,您可以使用实例数下限设置来更改此默认值,以将实例指定为保持空闲或“备用”状态。如果您在请求之外使用 CPU,则应将实例数下限设置为等于 1

安排的实例数除了受到传入请求或事件的速率或 CPU 利用率的影响之外,还受以下因素的影响:

Cloud Run 自动扩缩器每 5 秒评估一次这些内容。

始终分配 CPU 并自动扩缩

如果您将 Cloud Run 服务配置为始终分配 CPU,则应注意缩减至零以及从零开始扩容的行为。

从零开始扩容时始终分配 CPU。从零开始扩容只能由请求触发,因此未在处理请求的服务无法从零开始扩容。对于这些工作负载,您可以将实例数下限设置为大于 0,或在设计中添加一个“唤醒请求”,以便在缩减至零后重启处理。

缩减至零时始终分配 CPU。鉴于没有任何实例曾有 0% CPU,因此查看所有 CPU 使用量会导致永远不会缩减至零。这意味着,只能通过检查实例是否正在处理请求来决定从 1 缩减至零。

关于实例数上限

在某些情况下,您可能需要限制可启动的实例总数,以实现成本控制,或者更好地兼容您的服务使用的其他资源。例如,您的 Cloud Run 服务可能会与只能处理一定数量的并发打开连接的数据库交互。

您可以使实例数上限设置来限制可并行启动的实例总数,如设置实例数上限中所述。

超出实例数上限

正常情况下,修订版本创建新实例进行扩容,以处理传入的流量负载。但是,如果您设置了实例数上限,在某些情况下将没有足够的实例来满足流量负载需求。在这种情况下,传入请求会排入队列(待处理),如下所示:

  • 如果新实例(例如在横向扩容期间)启动,则请求将至少留出此服务的容器实例的平均启动时间。这包括请求启动横向扩容的时间,例如从零开始横向扩容时。
  • 如果启动时间少于 10 秒,则请求将持续长达 10 秒。
  • 如果启动过程中没有实例,并且请求未启动横向扩容,则请求将持续长达 10 秒。

在此时间范围内,如果某实例处理完请求,则可以处理队列中的待处理请求。如果在该时间范围内没有实例可用,则请求将失败并显示 429 错误代码。

扩容保证

实例数上限是每个修订版本的上限。设置上限并不意味着您的修订版本可以扩容到指定的实例数量。它只意味着此修订版本的实例数不应超过最大值。

因流量高峰而超出实例数上限

在某些情况下,例如流量快速激增或系统维护时,Cloud Run 在短时间内创建的实例数量可能多于实例数上限设置中指定的数量。启动的新实例可超过待处理实例数上限设置,以替换现有实例并为待处理请求提供宽限期,以便其完成处理。

正常运行时,每周都有几次会超出实例数上限。宽限期通常最多为 15 分钟,或最多为请求超时设置中指定的值。这些额外的实例会在空闲 15 分钟后销毁。

如果需要多次替换,则更新通常会持续几分钟或几小时,但每次替换都会仅在宽限期内产生过多实例。超出实例数上限值的实例通常少于配置的实例数上限的两倍,但对于突然出现的大流量峰值,实例数可能会大得多。

负载测试所遇到的实例数量超出实例数上限设置,因为系统可能会更改流量峰值的出现位置,以保留具有持续负载模式的现有工作负载的容量。

如果您的服务无法承受此暂时性行为,您可能需要考虑安全边际因素,设置一个较低的实例数上限。

流量分配

由于实例数上限是每个修订版本的限制,因此如果服务在多个修订版本之间分配流量,则该服务的实例总数可以超过每个修订版本的实例数上限。您可以通过实例数指标了解这一点。

部署

当您部署新修订版本以处理所有流量时,Cloud Run 会先启动足够的新修订版本实例,然后再将流量定向到该修订版本。这样可以降低新修订版本部署对请求延迟时间的影响,尤其是在处理高流量时。由于实例数上限是每个修订版本的限制,因此在部署期间,服务的实例总数可以超过每个修订版本的实例数上限。您可以通过实例数指标了解这一点。

空闲实例和最大限度地减少冷启动

在实例处理完所有请求后,Cloud Run 不会立即关停实例。为最大限度地降低冷启动产生的影响,Cloud Run 可能会将一些实例保持空闲状态长达 15 分钟。如果突然遇到流量高峰,这些实例可以立即处理请求。

例如,某个实例处理完请求后,可能会在一段时间内保持空闲状态,以防需要处理其他请求。空闲实例可能会保留资源,例如打开的数据库连接。请注意,只有在明确将服务配置为始终分配 CPU 的情况下,才会在处理请求期间分配 CPU。

如需使空闲实例永久可用,请使用 min-instance 设置。请注意,即使服务目前未处理请求,使用此功能也会产生费用

自动扩缩和待处理请求

  • 如果新实例(例如在横向扩容期间)启动,则请求将至少留出此服务的容器实例的平均启动时间。这包括请求启动横向扩容的时间,例如从零开始横向扩容时。
  • 如果启动时间少于 10 秒,则请求将持续长达 10 秒。
  • 如果启动过程中没有实例,并且请求未启动横向扩容,则请求将持续长达 10 秒。

自动扩缩对支持性服务的影响

随着实例数量的自动增加,您的 Cloud Run 服务可能会遇到支持性服务限制。例如,Cloud SQL 具有 API 配额限制。请确保这些支持性服务具有足够的配额,并且可以处理来自 Cloud Run 服务所有实例的连接。请考虑设置实例数量上限,以避免支持性服务过载。

自动扩缩和 Pub/Sub

Google 建议使用推送订阅来接收 Cloud Run 上 Pub/Sub 主题的消息。推送的消息像容器接收的 HTTP 请求一样接收,从而触发相同的自动扩缩行为。

后续步骤