手動調整資源配置

本頁面說明如何手動調整服務規模。這份文件也提供常見用途的操作說明,說明如何使用 Cloud Scheduler 工作和 Cloud Run Admin API,依排程變更執行個數。

總覽

根據預設,Cloud Run 會根據流量和 CPU 使用率自動擴充至指定或預設的執行個體數量上限。不過,在某些用途中,您可能會想要使用手動調整功能,設定特定的執行個體數量。

您可以使用手動資源調度功能,不必考量流量或使用率,即可設定特定的執行個體數量,且無需重新部署。有了這些功能,您就能選擇使用外部系統編寫自己的調整邏輯。如需相關範例,請參閱「以時間表為依據的調整」。

修訂版本層級的最低和最高設定,以及手動調整資源配置

如果您將服務設為手動調度資源,系統會忽略任何修訂版本層級的執行個體數量下限和上限設定。

手動調整資源配置的流量分配

下列清單說明在手動調整資源配置下,如何分配執行個體。這包括僅限流量代碼修訂版本的行為。

  • 在流量分配期間,每個修訂版本都會根據流量分配比例分配執行個體,類似於使用服務層級最小執行個體進行流量分配

  • 如果接收流量的修訂版本數量超過手動指定的執行個體數量,部分修訂版本就不會有執行個體。傳送至這些修訂版本的流量會收到與停用修訂版本相同的錯誤訊息。

  • 對於在流量拆分中接收流量的所有修訂版本,系統會停用所有修訂版本層級的最低和最高執行個體。

  • 如果修訂版本僅因 流量標記而啟用,則:

    • 如果設定修訂版本層級的執行個體數量下限,系統會啟動指定數量的執行個體,但不會計入服務手動執行個體總數。修訂版本「不會」自動調整。
    • 如果未設定修訂版本層級的執行個體數量下限,則修訂版本會根據傳送至標記網址的流量,最多調度一個執行個體。

使用手動調整資源配置的結帳行為

使用手動調整資源配置時,帳單行為類似於使用最少執行個體功能時的行為。

也就是說,如果您使用手動調整資源調度和以執行個體為基礎的計費,手動調整資源調度的閒置執行個體會計為活動執行個體。

如果您使用手動調整資源配置搭配以要求為準的計費,系統會以閒置執行個體數量下限計費。如需完整的帳單詳細資料,請參閱定價頁面

必要的角色

如要取得部署 Cloud Run 服務所需的權限,請要求管理員授予您下列 IAM 角色:

  • Cloud Run 服務中的 Cloud Run 開發人員 (roles/run.developer)
  • 服務身分中的「服務帳戶使用者」 (roles/iam.serviceAccountUser)
  • 在已部署容器映像檔的 Artifact Registry 存放區中,指派 Artifact Registry Reader (roles/artifactregistry.reader) 角色 (如適用)

如需與 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. 如果您要設定新服務,請從選單中選取「Services」,然後按一下「Deploy container」,顯示「Create service」表單。如果您要設定現有服務,請按一下該服務來顯示詳細資料面板,然後點選詳細資料面板右上角「Scaling」旁的筆圖示。

  3. 找出「服務調整」表單 (適用於新服務),或「編輯調整」表單 (適用於現有服務)。

    圖片

    在標示為「Number of instances」的欄位中,指定服務的容器執行個體數量。

  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

如要更新特定服務的服務層級最低執行個體,請將 PATCH HTTP 要求傳送至 Cloud Run Admin API service 端點

例如使用 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 = "us-central1"
  launch_stage = "BETA"

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

取代:

  • SERVICE_NAME 改為 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
  • 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. 按一下要停用的服務,以顯示詳細資料面板,然後按一下詳細資料面板右上角「Scaling」旁邊的鉛筆圖示。

  3. 找出「編輯縮放」表單,然後選取「手動縮放」

    圖片

    在標示為「Number of instances」的欄位中,輸入值 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

如要停用服務,請將 PATCH HTTP 要求傳送至 Cloud Run Admin API service 端點

例如使用 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 = "us-central1"
  launch_stage = "BETA"

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

取代:

  • SERVICE_NAME 改為 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

以時間表為依據的資源調度範例

手動調整資源配置的常見用途,就是根據預先定義的時間表變更執行個體數量。在這個範例中,我們使用 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 個執行個體。