手动扩缩

本页介绍了如何手动扩缩服务。本文还针对一个常见用例提供了相关说明,即使用 Cloud Scheduler 作业和 Cloud Run Admin API 根据时间表调整实例数量。

概览

默认情况下,Cloud Run 会根据流量和 CPU 利用率自动扩容到指定或默认的最大实例数。不过,在某些使用情形下,您可能希望能够使用手动扩缩来设置特定数量的实例。

手动扩缩功能可让您设置特定的实例数量,而无需考虑流量或利用率,也无需重新部署。这样一来,您就可以选择使用外部系统编写自己的扩缩逻辑。如需查看相关示例,请参阅基于时间表的扩缩

修订版本级实例数下限和上限设置以及手动扩缩

如果您将服务设置为手动扩缩,系统会忽略所有修订版本级实例数下限和上限设置。

手动扩缩的流量分配

下表介绍了在手动扩缩下拆分流量时如何分配实例。这包括仅限流量标记的修订版本的行为。

  • 在流量拆分期间,系统会根据流量拆分按比例为每个修订版本分配实例,这与将流量拆分与服务级实例数下限结合使用类似。

  • 如果接收流量的修订版本数量超过手动实例数,部分修订版本将不会获得实例。发送到这些修订版本的流量会收到与修订版本被停用时相同的错误。

  • 对于流量分配中接收流量的所有修订版本,系统会停用任何修订版本级实例数下限和上限。

  • 如果修订版本仅因流量标记而处于有效状态

    • 如果设置了修订版本级实例数下限,系统将启动指定数量的实例,但这些实例不会计入服务手动实例总数。修订版本将不会自动扩缩。
    • 如果未设置修订版本级层的最小实例数,则修订版本最多会扩缩到 1 个实例,以响应发送到标记网址的流量。

使用手动扩缩的结算行为

使用手动扩缩时,结算行为与使用最少实例功能时的行为类似。

也就是说,如果采用手动扩缩方式和基于实例的结算方式,手动扩缩的空闲实例将按活跃实例计费。

如果您将手动扩缩与基于请求的结算方式搭配使用,则手动扩缩的空闲实例将按空闲最小实例数进行结算。如需了解完整的结算详情,请参阅价格页面

所需的角色

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

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

配置扩缩

您可以在创建更新服务时使用 Google Cloud 控制台、Google Cloud CLI、YAML 文件或 API 来配置扩缩模式:

控制台

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

    转到 Cloud Run

  2. 如果您要配置新服务,请从菜单中选择服务,然后点击部署容器以显示创建服务表单。如果您要配置现有服务,请点击该服务以显示其详情面板,然后点击详情面板右上角的扩缩旁边的笔图标。

  3. 找到服务扩缩表单(针对新服务)或修改扩缩设置表单(针对现有服务)。

    图片

    在标为实例数的字段中,指定服务的容器实例数。

  4. 点击创建(对于新服务)或保存(对于现有服务)。

gcloud

如需为新服务指定扩缩,请使用 deploy 命令:

gcloud beta run deploy SERVICE \
    --scaling=INSTANCE_COUNT \
    --image IMAGE_URL

替换以下内容:

  • SERVICE 替换为服务的名称
  • INSTANCE_COUNT 替换为服务的实例数。 这会将服务设置为手动扩缩。指定值 0 可停用相应服务。指定值 auto 以使用默认的 Cloud Run 自动扩缩行为。
  • IMAGE_URL 替换为对容器映像的引用,例如 us-docker.pkg.dev/cloudrun/container/hello:latest。 如果您使用 Artifact Registry,则必须预先创建制品库 REPO_NAME。网址格式为 LOCATION-docker.pkg.dev/PROJECT_ID/REPO_NAME/PATH:TAG

使用以下 update 命令为现有服务指定扩缩:

gcloud beta run services update SERVICE \
   --scaling=INSTANCE_COUNT

YAML

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

    gcloud run services describe SERVICE --format export > service.yaml
  2. 更新 scalingModemanualInstanceCount 特性:

    apiVersion: serving.knative.dev/v1
    kind: Service
    metadata:
      name: SERVICE
      annotations:
      run.googleapis.com/launch-stage: BETA
      run.googleapis.com/scalingMode: MODE
      run.googleapis.com/manualInstanceCount: INSTANCE_COUNT

    替换以下内容:

    • SERVICE 替换为您的 Cloud Run 服务的名称
    • MODE,其中 manual 用于手动扩缩,automatic 用于默认的 Cloud Run 自动扩缩行为。
    • INSTANCE_COUNT,并指定您要为服务手动扩缩的实例数。指定值 0 可停用相应服务。
  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 '{"launchStage":"BETA","scaling":{"manualInstanceCount":MANUAL_INSTANCE_COUNT }}' \
    https://run.googleapis.com/v2/projects/PROJECT_ID/locations/REGION/services/SERVICE?update_mask=launchStage,scaling.manualInstanceCount

您需要进行如下替换:

  • ACCESS_TOKEN 替换为具有更新服务的 IAM 权限的账号的有效访问令牌。例如,如果您已登录 gcloud,则可以使用 gcloud auth print-access-token 检索访问令牌。在 Cloud Run 容器实例中,您可以使用容器实例元数据服务器检索访问令牌。
  • MANUAL_INSTANCE_COUNT 替换为服务的实例数。 这会将服务设置为手动扩缩。指定值 0 可停用相应服务。
  • SERVICE 替换为相应服务的名称。
  • REGION 替换为在其中部署服务的 Google Cloud 区域。
  • PROJECT_ID 替换为 Google Cloud 项目 ID。

Terraform

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

将以下内容添加到 Terraform 配置中的 google_cloud_run_v2_service 资源:
resource "google_cloud_run_v2_service" "default" {
  name     = "SERVICE_NAME"
  location = "REGION"
  launch_stage = "BETA"

  template {
    containers {
      image = "IMAGE_URL"
    }
  }
  scaling {
    scaling_mode = "MANUAL"
    manual_instance_count = "INSTANCE_COUNT"
  }
}

您需要进行如下替换:

  • SERVICE_NAME 替换为您的 Cloud Run 服务的名称。
  • REGION 替换为 Google Cloud 区域。 例如 europe-west1
  • IMAGE_URL 替换为对容器映像的引用,例如 us-docker.pkg.dev/cloudrun/container/hello:latest。 如果您使用 Artifact Registry,则必须预先创建制品库 REPO_NAME。网址格式为 LOCATION-docker.pkg.dev/PROJECT_ID/REPO_NAME/PATH:TAG
  • INSTANCE_COUNT,并指定您要为服务手动扩缩的实例数。这些实例会根据各个分配了流量的修订版本所接收的流量百分比进行分配。

查看服务的扩缩配置

如需查看 Cloud Run 服务的扩缩配置实例,请执行以下操作:

控制台

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

    转到 Cloud Run

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

  3. 当前扩缩设置会显示在“服务详细信息”面板右上角的扩缩标签后面,笔图标旁边。

gcloud

使用以下命令查看服务的当前扩缩配置:

gcloud beta run services describe SERVICE

SERVICE 替换为服务的名称。

describe 返回的文本顶部附近查找 Scaling: Manual (Instances: ) 字段。

YAML

使用以下命令下载服务的 YAML 配置

gcloud run services describe SERVICE --format export > service.yaml

缩放配置包含在 scalingModemanualInstanceCount 属性中。

停用服务

停用服务后,系统会允许完成当前正在处理的所有请求。 但是,对服务网址发出的任何后续请求都会失败并显示 Service unavailableService disabled 错误。

仅因流量标记而处于活动状态的服务修订版本不会受到影响,因为这些版本不会被停用。

如需停用服务,请将扩缩设置为零。您可以使用 Google Cloud 控制台、Google Cloud CLI、YAML 文件或 API 停用服务:

控制台

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

    转到 Cloud Run

  2. 点击您要停用的服务以显示其详细信息面板,然后点击详细信息面板右上角的扩缩旁边的笔图标。

  3. 找到修改扩缩表单,然后选择手动扩缩

    图片

    在标记为实例数字段中,输入值 0(零)。

  4. 点击保存

gcloud

如需停用服务,请使用以下命令将扩缩设置为零:

gcloud beta run services update SERVICE --scaling=0

SERVICE 替换为服务的名称。

YAML

  1. 下载服务的 YAML 配置

    gcloud run services describe SERVICE --format export > service.yaml
  2. manualInstanceCount 属性设置为零 (0):

    apiVersion: serving.knative.dev/v1
    kind: Service
    metadata:
      name: SERVICE
      annotations:
      run.googleapis.com/launch-stage: BETA
      run.googleapis.com/scalingMode: manual
      run.googleapis.com/manualInstanceCount: `0`

    SERVICE 替换为您的 Cloud Run 服务的名称。

  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 '{"launchStage":"BETA","scaling":{"manualInstanceCount":0 }}' \
    https://run.googleapis.com/v2/projects/PROJECT_ID/locations/REGION/services/SERVICE?update_mask=launchStage,scaling.manualInstanceCount

您需要进行如下替换:

  • ACCESS_TOKEN 替换为具有更新服务的 IAM 权限的账号的有效访问令牌。例如,如果您已登录 gcloud,则可以使用 gcloud auth print-access-token 检索访问令牌。在 Cloud Run 容器实例中,您可以使用容器实例元数据服务器检索访问令牌。
  • SERVICE 替换为相应服务的名称。
  • REGION 替换为在其中部署服务的 Google Cloud 区域。
  • PROJECT_ID 替换为 Google Cloud 项目 ID。

Terraform

如需停用服务,请将 manual_instance_count 属性设置为零 (0):

resource "google_cloud_run_v2_service" "default" {
  name     = "SERVICE_NAME"
  location = "REGION"
  launch_stage = "BETA"

  template {
    containers {
      image = "IMAGE_URL"
    }
  }
  scaling {
    scaling_mode = "MANUAL"
    manual_instance_count = "0"
  }
}

您需要进行如下替换:

  • SERVICE_NAME 替换为您的 Cloud Run 服务的名称。
  • REGION 替换为 Google Cloud 区域。 例如 europe-west1
  • IMAGE_URL 替换为对容器映像的引用,例如 us-docker.pkg.dev/cloudrun/container/hello:latest。 如果您使用 Artifact Registry,则必须预先创建制品库 REPO_NAME。网址格式为 LOCATION-docker.pkg.dev/PROJECT_ID/REPO_NAME/PATH:TAG

基于时间表的扩缩示例

手动扩缩的一个常见使用场景是根据预定义的时间表调整实例数量。在此示例中,我们使用 Cloud Scheduler 安排了两个作业,每个作业都会调用 Cloud Run Admin API 来扩缩实例数量。第一个作业将服务设置为在工作时间(周一至周五上午 9 点至下午 5 点)手动扩容到 10 个实例。第二个作业将服务设置为在非工作时间缩减到零个实例。

请注意,如示例所示,将实例数设置为零会停用服务,但不会停用 Cloud Scheduler 作业。这些作业会继续运行,并按计划将服务重置(并重新启用)为 10 个实例。

在此示例中,为简单起见,我们使用 Cloud Run 快速入门,但您可以使用自己选择的服务。

如需设置基于时间表的手动扩缩,请执行以下操作:

  1. 使用以下命令部署服务:

    gcloud beta run deploy SERVICE \
       --image=us-docker.pkg.dev/cloudrun/container/hello \
       --region=REGION \
       --project PROJECT_ID

    执行以下变量替换操作:

    • REGION 替换为 Cloud Run 服务部署到的区域。
    • SERVICE 替换为 Cloud Run 服务的名称。
  2. 使用以下命令将服务配置为手动扩缩到 10 个实例:

    gcloud beta run services update SERVICE \
       --region=REGION \
       --scaling=10
  3. 创建 Cloud Scheduler 作业,在工作时间内手动将服务实例扩容至 10 个:

    gcloud scheduler jobs create http hello-start-instances \
      --location=REGION \
      --schedule="0 9 * * MON-FRI" \
      --time-zone=America/Los_Angeles \
      --uri=https://run.googleapis.com/v2/projects/PROJECT_ID/
      locations/REGION/services/hello?update_mask=launchStage,scaling.manualInstanceCount \
      --headers=Content-Type=application/json,X-HTTP-Method-Override=PATCH \
      --http-method=PUT \
      --message-body='{"launchStage":"BETA","scaling":{"manualInstanceCount":10}}' \
      --oauth-service-account-email=PROJECT_NUMBER-compute@developer.gserviceaccount.com

    此命令会创建一个 Cloud Scheduler 作业,该作业会向 Cloud Run Admin API 发出 HTTP 调用,并将实例数设置为 10。此示例使用 Compute Engine 默认服务账号 PROJECT_NUMBER-compute@developer.gserviceaccount.com 来运行 Cloud Scheduler 作业。您可以使用任何有权更新 Cloud Run 服务的服务账号。

  4. 创建 Cloud Scheduler 作业,在非工作时间手动将服务实例扩缩为零,以停用该服务:

    gcloud scheduler jobs create http hello-stop-instances \
      --location=REGION \
      --schedule="0 17 * * MON-FRI" \
      --time-zone=America/Los_Angeles \
      --uri=https://run.googleapis.com/v2/projects/PROJECT_ID/
      locations/REGION/services/hello?update_mask=launchStage,scaling.manualInstanceCount \
      --headers=Content-Type=application/json,X-HTTP-Method-Override=PATCH \
      --http-method=PUT \
      --message-body='{"launchStage":"BETA","scaling":{"manualInstanceCount":0}}' \
      --oauth-service-account-email=PROJECT_NUMBER-compute@developer.gserviceaccount.com

    此命令会创建一个 Cloud Scheduler 作业,该作业会对 Cloud Run Admin API 进行 HTTP 调用,并将手动缩容的实例数设置为零。这会有效地停用该服务,但不会停用 Cloud Scheduler 作业,这些作业将继续运行,并按计划将该服务重置(并重新启用)为 10 个实例。