手动扩缩

本页介绍了如何手动扩缩服务。此外,该文档还提供了有关常见用例的说明,即使用 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

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

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 服务的名称
    • MODEmanual(用于手动扩缩),或 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。

查看服务的扩缩配置

如需查看 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。

基于时间表的扩缩示例

手动扩缩的一个常见用例是根据预定义的时间表更改实例数量。在此示例中,我们使用 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。该示例为 Cloud Scheduler 作业使用 Compute Engine 默认服务账号 PROJECT_NUMBER-compute@developer.gserviceaccount.com。您可以使用任何有权更新 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 个实例(并重新启用)。