为服务设置实例数下限

本页面介绍了如何通过配置实例数下限,并结合默认的 Cloud Run 自动扩缩行为,为服务启用空闲实例。 如需手动扩缩服务,请参阅手动扩缩

如果您希望更灵活地控制服务的自动扩缩行为,可以设置实例数下限,以避免容器启动延迟并降低服务延迟。对于 Cloud Run 服务,Cloud Run 默认会根据传入请求数调整实例数。

但是,如果您的服务要求缩短延迟时间(尤其是在从零个有效实例扩缩时),您可以通过指定要保持备用状态并准备处理请求的容器实例数下限来更改此默认行为。如需详细了解此优化,请参阅一般开发提示

Cloud Run 会移除未处理请求的实例(空闲)。设置实例数下限后,Cloud Run 至少会保持该最小数量的实例运行状态,即使它们未处理请求也是如此。如果超过 min-instances 的活跃实例未接收请求,则可能会变为空闲

例如,如果 min-instances10,且活跃实例数为 0,则空闲实例数为 10。当活跃实例数增加到 6 时,空闲实例数会减少到 4

请注意,如果服务最近未传送流量,则有效实例指标可能会显示没有有效实例,即使您为实例数下限指定了一个或多个值也是如此。

您可以随时重启最小数量的实例。

结算

使用实例数下限功能保持运行的实例会产生结算费用

下图展示了在为服务或修订版本配置实例数下限时,实例生命周期内的结算方式:

从 Google Cloud 控制台调用 Cloud Run Admin API。
图 1:接收并处理三个请求的实例示例。

根据配置的结算设置,服务结算方式如下:

  • 对于基于请求的结算方式,当实例处于空闲状态并等待处理请求时,您需要按较低的费率付费。如果将实例数下限设置为 0,则实例处于空闲状态时,您无需付费。
  • 对于基于实例的结算方式,您需要按默认费率为整个实例生命周期付费。从启动到关停的时间包括实例处理请求或处于空闲状态的时间。换句话说,即使将实例数下限设置为 0,您仍需按默认费率付费。如果您需要在请求之外使用 CPU,此选项非常适合。如果将实例数下限设置为 0,则您需要按默认费率付费。

由于这些费用非常易于预测,因此 Google 建议您购买承诺使用折扣

在服务级层应用实例数下限与在修订版本级层应用实例数下限的对比

您可以在服务级层或修订版本级层配置实例数下限。 Google 建议您在服务级层应用实例数下限,并避免结合使用服务级和修订版本级实例数下限。详细了解同时配置服务级和修订版本级扩缩设置时的行为。

如果您在修订版本级层应用实例数下限,则这些设置将在部署修订版本时生效。如果您在服务级层应用此功能,则无需部署新的修订版本设置即可生效。

修订版本和实例数下限

如果在服务级层设置实例数下限,则系统会将传入请求分配给与流量拆分成比例处理流量的所有修订版本。

如果在修订版本级层设置实例数下限,则每当在流量拆分中引用了修订版本或修订版本分配了流量标记时,系统都会启动最小数量的实例。这意味着,实例在处理请求时以及在等待传入请求时都会产生费用。

标记的修订版本和服务级实例数下限

如果启动了分配了标记的修订版本,则当服务级最小数量的实例属于流量拆分时,相应实例会计入服务级最小数量的实例。

使用实例数下限进行请求路由

设置实例数下限后,Cloud Run 会在所有这些预配的实例之间均匀分配传入请求。了解此行为对于费用管理非常重要,特别是在使用基于请求的结算方式或希望维护空闲热备用实例时。为了最大限度地降低费用,请将实例数下限设置为处理典型流量所需的实例数

所需的角色

如需获得配置和部署 Cloud Run 服务所需的权限,请让您的管理员为您授予以下 IAM 角色:

如果您要从源代码部署服务函数,则还必须向您授予项目和 Cloud Build 服务账号的其他角色。

如需查看与 Cloud Run 关联的 IAM 角色和权限的列表,请参阅 Cloud Run IAM 角色Cloud Run IAM 权限。如果您的 Cloud Run 服务与Google Cloud API(例如 Cloud 客户端库)进行交互,请参阅服务身份配置指南。如需详细了解如何授予角色,请参阅部署权限管理访问权限

配置服务级实例数下限

默认情况下,容器实例会停用服务级实例数下限(设置为 0)。您可以使用Google Cloud 控制台、Google Cloud CLI 或 YAML 文件更改此默认值:

控制台

  1. 在 Google Cloud 控制台中,前往 Cloud Run:

    转到 Cloud Run

  2. 如果您要配置新服务,请从菜单中选择服务,然后点击部署容器以显示创建服务表单。找到服务扩缩表单。

  3. 如果您要配置现有服务,请点击该服务以显示详情面板,然后点击右上角的 修改服务级扩缩设置

  4. 在标为实例数下限字段中,指定要保持备用状态以准备接收请求的容器实例数量。

  5. 点击创建(对于新服务)或部署(对于现有服务)。

gcloud

使用以下命令为给定服务更新实例数下限

gcloud run services update SERVICE --min MIN-VALUE

替换以下内容:

  • SERVICE:服务的名称。
  • MIN-VALUE:要保持备用状态以准备接收请求的容器实例数量。指定 default 即可清除任何实例数下限设置。

或者,您可以在部署期间使用以下命令设置实例数下限:

gcloud run deploy --image IMAGE_URL --min MIN-VALUE

替换以下内容:

  • IMAGE_URL:对容器映像的引用,例如 us-docker.pkg.dev/cloudrun/container/hello:latest。如果您使用 Artifact Registry,则必须预先创建制品库 REPO_NAME。网址采用 LOCATION-docker.pkg.dev/PROJECT_ID/REPO_NAME/PATH:TAG 格式。
  • MIN-VALUE:要保持备用状态以准备接收请求的容器实例数量。指定 default 即可清除所有实例下限设置。

YAML

任何配置更改都会导致新修订版本的创建。后续修订版本也将自动采用此配置设置,除非您进行了明确更新。

  1. 如果您要创建新的服务,请跳过此步骤。如果您要更新现有服务,请下载其 YAML 配置

    gcloud run services describe SERVICE --format export > service.yaml
  2. 更新 run.googleapis.com/minScale 特性:

    apiVersion: serving.knative.dev/v1
    kind: Service
    metadata:
      name: SERVICE
      annotations:
        run.googleapis.com/minScale: 'MIN_INSTANCE'

    替换以下内容:

    • SERVICE:Cloud Run 服务的名称
    • MIN-INSTANCE:要保持备用状态以准备接收请求的实例数量。
  3. 使用以下命令创建或更新服务:

    gcloud run services replace service.yaml

客户端库

如需通过代码更新服务的服务级实例数下限,请使用以下客户端库:

REST API

如果更新给定服务的服务级实例数下限,请向 Cloud Run Admin API service 端点发送 PATCH HTTP 请求。

例如,使用 curl

curl -H "Content-Type: application/json" \
-H "Authorization: Bearer ACCESS_TOKEN" \
-X PATCH \
-d '{ "scaling": { "minInstanceCount": MIN-VALUE }}' \
https://run.googleapis.com/v2/projects/PROJECT_ID/locations/REGION/services/SERVICE?update_mask=scaling.minInstanceCount

替换以下内容:

  • ACCESS_TOKEN:具有更新服务的 IAM 权限的账号的有效访问令牌。例如,如果您已登录 gcloud,则可以使用 gcloud auth print-access-token 检索访问令牌。在 Cloud Run 容器实例中,您可以使用容器实例元数据服务器检索访问令牌。
  • MIN-VALUE:要保持备用状态以准备接收请求的容器实例数量。
  • SERVICE:服务的名称。
  • REGION:服务的 Google Cloud 区域。
  • PROJECT-ID: Google Cloud 项目 ID。

查看服务级实例数下限

如需查看 Cloud Run 服务的当前服务级实例数下限设置,请按照以下所述操作:

控制台

  1. 在 Google Cloud 控制台中,前往 Cloud Run:

    转到 Cloud Run

  2. 点击您感兴趣的服务以打开服务详细信息面板。

  3. 当前设置位于服务详情面板右上角的扩缩旁边。

gcloud

  1. 使用以下命令:

    gcloud run services describe SERVICE
  2. 在返回的配置中找到扩缩:自动(最少 MIN_VALUE 个,最多 MAX_VALUE 个)的值。

配置修订版本级实例数下限

任何配置更改都会导致新修订版本的创建。后续修订版本也将自动采用此配置设置,除非您进行了明确更新。

默认情况下,容器实例关闭了 min-instances(设置为 0)。在以下情况下,您可以使用 Google Cloud 控制台、Google Cloud CLI 或 YAML 文件更改此默认值:创建新服务部署新的修订版本

控制台

  1. 在 Google Cloud 控制台中,前往 Cloud Run:

    转到 Cloud Run

  2. 从菜单中选择服务,然后点击部署容器以配置新服务。如果您要配置现有服务,请点击该服务,然后点击修改和部署新的修订版本

  3. 如果您要配置新服务,请填写初始服务设置页面,然后点击容器、卷、网络、安全性以展开服务配置页面。

  4. 点击容器标签页。

    图片

    • 在“实例数下限”字段中,指定要保持备用状态以准备接收请求的容器实例数量。
  5. 点击创建部署

gcloud

您可以使用以下命令更新给定服务的 min-instance

gcloud run services update SERVICE --min-instances MIN-VALUE

替换以下内容:

  • SERVICE:服务的名称。
  • MIN-VALUE:要保持备用状态以准备接收请求的容器实例数量。指定 default 即可清除任何实例数下限设置。

您还可以在部署期间使用以下命令设置 min-instance

gcloud run deploy --image IMAGE_URL --min-instances MIN-VALUE

替换以下内容:

  • IMAGE_URL:对容器映像的引用,例如 us-docker.pkg.dev/cloudrun/container/hello:latest。如果您使用 Artifact Registry,则必须预先创建制品库 REPO_NAME。网址采用 LOCATION-docker.pkg.dev/PROJECT_ID/REPO_NAME/PATH:TAG 格式。
  • MIN-VALUE:要保持备用状态以准备接收请求的容器实例数量。指定 default 即可清除任何实例数下限设置。

YAML

  1. 如果您要创建新的服务,请跳过此步骤。如果您要更新现有服务,请下载其 YAML 配置

    gcloud run services describe SERVICE --format export > service.yaml
  2. 更新 autoscaling.knative.dev/minScale: 特性:

    apiVersion: serving.knative.dev/v1
    kind: Service
    metadata:
      name: SERVICE
    spec:
      template:
        metadata:
          annotations:
            autoscaling.knative.dev/minScale: 'MIN-INSTANCE'
          name: REVISION

    替换以下内容:

    • SERVICE:Cloud Run 服务的名称
    • MIN-INSTANCE:要保持备用状态以准备接收请求的实例数量。
    • REVISION 替换为新的修订版本名称或者将其删除(如果存在)。如果您提供新的修订版本名称,则该名称必须满足以下条件:
      • 开头为 SERVICE-
      • 仅包含小写字母、数字和 -
      • 不以 - 结尾
      • 不超过 63 个字符
  3. 使用以下命令创建或更新服务:

    gcloud run services replace service.yaml

Terraform

如需了解如何应用或移除 Terraform 配置,请参阅基本 Terraform 命令

将以下内容添加到 Terraform 配置中的 google_cloud_run_v2_service 资源:

resource "google_cloud_run_v2_service" "default" {
  name     = "cloudrun-service-min-instances"
  location = "us-central1"

  deletion_protection = false # set to "true" in production

  template {
    containers {
      image = "us-docker.pkg.dev/cloudrun/container/hello"
    }
    scaling {
      # Min instances
      min_instance_count = 1
    }
  }
}

上述 google_cloud_run_v2_service 资源在 template.scaling 下指定了 1 的实例数下限。将 1 替换为您自己的实例数下限。

查看修订版本级实例数下限

如需查看 Cloud Run 服务的当前修订版本级实例数下限设置,请按照以下所述操作:

控制台

  1. 在 Google Cloud 控制台中,前往 Cloud Run:

    转到 Cloud Run

  2. 点击您感兴趣的服务以打开服务详细信息面板。

  3. 点击修订版本标签页。

  4. 在右侧的详细信息面板中,容器标签页下列出了修订版本级实例数下限设置。

gcloud

  1. 使用以下命令:

    gcloud run services describe SERVICE
  2. 在返回的配置中找到实例数下限:的值。

示例

以下部分展示了配置实例数下限时的服务行为。

同时使用服务级和修订版本级实例数下限或上限

下表显示了将服务级实例数下限和修订版本级实例数下限或上限值结合使用时的行为:

配置设置 行为
已同时设置服务级实例数下限和修订版本级实例数下限。 修订版本的有效值为修订版本级实例数下限和服务级实例数下限中的较大者。
已同时设置服务级实例数下限和修订版本级实例数上限。 修订版本的有效值为修订版本级实例数上限和服务级实例数下限中的较小值。

即使修订版本级实例数上限阻止服务达到为服务级实例数下限配置的实例数,也是如此。

将服务级实例数下限与流量拆分结合使用

如果您使用流量拆分,则系统会根据流量分配的比例在修订版本之间分配服务级实例数下限。例如,如果服务级实例数下限为 10,则按 50/50 的流量分配比例为每个修订版本分配 5 个服务级实例数下限。

下表显示了示例配置场景:

示例用例 配置示例 引发的行为
没有修订版本级设置 服务级实例数下限:10
  • 修订版本 A 的实例数下限:0
  • 修订版本 B 的实例数下限:0
  • 流量分配:60/40
修订版本 A 根据与流量分配成比例的服务级实例数下限接收 6 个实例。修订版本 B 根据与流量分配成比例的服务级实例数下限接收 4 个实例。
由于存在修订版本级实例数下限,接收的实例数超过了服务级实例数下限 服务级实例数下限:10
  • 修订版本 A 的实例数下限:6
  • 修订版本 B 的实例数下限:0
  • 流量分配:50/50
修订版本 A 根据修订版本级实例下限接收 6 个实例。修订版本 B 根据与流量分配成比例的服务级实例数下限接收 5 个实例。这超出了服务级实例数下限,符合预期。
由于存在修订版本级实例数上限,接收的实例数少于服务级实例数下限。 服务级实例数下限:10
  • 修订版本 A 的实例数下限:0
  • 修订版本 A 的实例数上限:3
  • 修订版本 B 的实例数下限:0
  • 流量分配:50/50
修订版本 A 根据由流量分配驱动的服务级实例数下限接收 3 个实例,但受限于其修订版本级实例数上限。
修订版本 B 根据与流量分配成比例的服务级实例数下限接收 5 个实例。这会导致 8 个服务级实例,因为 2 个实例会因为修订版本 A 的修订版本级实例数上限而丢失。
服务级实例数下限大于流分配中的修订版本数,并且有一小部分实例与流量分配成正比 服务级实例数下限:3
  • 修订版本 A 的实例数下限:0
  • 修订版本 B 的实例数下限:0
  • 修订版本 B 是服务配置流量部分中的第一个
  • 流量分配:50/50
修订版本 A 得到的实例数下限为 1,修订版本 B 得到的实例数下限为 2。服务的实例数为 3。

确定所需的实例数下限

如果实例数下限高于典型流量所需,许多实例可能处于略微活跃状态,每个实例只处理少量请求。例如,如果您的服务在峰值负载时通常需要 200 个实例,但实例数下限设置为 600,则传入请求将分布在所有 600 个实例中。这样一来,这 600 个实例中的许多都会变得略为活跃,每个实例处理少量流量;相比之下,理想情况下约有 200 个实例高度活跃,其余 400 个实例则完全处于空闲状态。

为了优化费用(通过在较少的实例上实现更高的利用率),请将实例数下限设置为与处理典型流量所需的实际实例数非常接近的值。

此外,当自动扩缩功能预配的额外实例数超过配置的实例数下限时,Cloud Run 会优先将传入请求路由到配置的最小数量的实例,然后再将请求发送到自动扩缩的实例。采用基于请求的结算方式时,这种优先路由到配置的最小数量的实例的方式可在使用自动扩缩的实例之前先填充配置的最小数量的实例,从而降低费用。请注意,根据流量情况,这种优先路由方式也可能使配置的最小数量的实例的利用率高于自动扩缩的实例。