為 Cloud Run 服務設定暫時性磁碟

Cloud Run 提供暫時性磁碟區,只會在執行個體存續期間保留。這項功能可讓您指定所需的磁碟空間大小,以及掛接磁碟的位置。Cloud Run 隨後會將該磁碟空間量分配給資源。

系統會在啟動時自動佈建磁碟、預先格式化為 ext4,並使用執行個體專屬金鑰加密。暫時磁碟會建立磁碟區,供任何使用者讀取或寫入。由於儲存空間是暫時性的,執行個體關閉時,所有資料都會永久刪除。包括因下列原因造成的關機:

  • 執行個體當機
  • 服務資源調度
  • 將流量遷移至新修訂版本

磁碟專屬於特定執行個體,不會與其他執行個體或修訂版本共用。您可以為每個磁碟區設定掛接點,藉此控管檔案系統結構。

關閉執行個體前,Cloud Run 會向執行個體中的所有容器傳送 SIGTERM 訊號,表示實際關閉前有 10 秒的緩衝時間,屆時 Cloud Run 會傳送 SIGKILL 訊號。您可以在這 10 秒內執行清理作業,例如最後一次複製磁碟內容永久儲存空間。

用途

暫時性磁碟可用於下列用途:

  • 資料處理工作負載:在 Cloud Run 中處理大型資料檔案時,您通常會將整個檔案儲存在記憶體中,或是協調將檔案分割成較小的部分。使用暫時性儲存空間時,您不需要支付大量記憶體費用,即可建立資料的暫時本機副本。您也可以處理較大的資料集。
  • 快取:在網路服務用途中,將資料快取到磁碟,而不是從遠端儲存空間擷取資料,可最佳化應用程式的延遲時間。

儲存空間和執行個體限制

適用的限制如下:

  • 執行個體儲存空間上限:每個執行個體的總空間預設上限為 10 GB。 如有需要,請申請提高配額
  • 執行個體磁碟區限制:每個執行個體最多只能有 10 個磁碟區。
  • 專案限制:每個專案在每個區域的預設上限為 100 GB。 如有需要,請申請提高配額

申請提高配額

首次在某個區域使用 Cloud Run 暫時性磁碟的專案,系統會自動授予每個執行個體 10 GB 的配額,每個專案在每個區域的配額為 100 GB。

如需額外容量,請為 Cloud Run 服務申請提高配額。請使用下列按鈕提供的連結,申請所需配額。

目前的配額 配額連結
每個執行個體 10 GB 要求提高每個執行個體的配額
每項專案 100 GB 申請提高每個專案的配額

如要進一步瞭解如何要求增加配額,請參閱「如何增加配額」。

限制

只有第二代執行環境支援暫時磁碟。

不允許的路徑

Cloud Run 不允許您在 /dev/proc/sys,或其子目錄中掛接磁碟區。

支援的地區

暫時磁碟功能適用於下列區域:

事前準備

  1. 登入 Google Cloud 帳戶。如果您是 Google Cloud新手,歡迎 建立帳戶,親自評估產品在實際工作環境中的成效。新客戶還能獲得價值 $300 美元的免費抵免額,可用於執行、測試及部署工作負載。
  2. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Roles required to select or create a project

    • Select a project: Selecting a project doesn't require a specific IAM role—you can select any project that you've been granted a role on.
    • Create a project: To create a project, you need the Project Creator role (roles/resourcemanager.projectCreator), which contains the resourcemanager.projects.create permission. Learn how to grant roles.

    Go to project selector

  3. Verify that billing is enabled for your Google Cloud project.

  4. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Roles required to select or create a project

    • Select a project: Selecting a project doesn't require a specific IAM role—you can select any project that you've been granted a role on.
    • Create a project: To create a project, you need the Project Creator role (roles/resourcemanager.projectCreator), which contains the resourcemanager.projects.create permission. Learn how to grant roles.

    Go to project selector

  5. Verify that billing is enabled for your Google Cloud project.

  6. 安裝並初始化 gcloud CLI。
  7. 更新元件:
    gcloud components update
  8. 如要瞭解 CPU、記憶體和網路輸出費用,請參閱 Cloud Run 定價頁面。您需要支付的費用取決於佈建的磁碟大小,以及使用該磁碟的執行個體存續時間。

必要的角色

如要取得設定暫時磁碟所需的權限,請要求系統管理員授予您下列 IAM 角色:

如需與 Cloud Run 相關聯的 IAM 角色和權限清單,請參閱「Cloud Run IAM 角色」和「Cloud Run IAM 權限」。如果 Cloud Run 服務與Google Cloud API (例如 Cloud 用戶端程式庫) 介接,請參閱服務身分設定指南。 如要進一步瞭解如何授予角色,請參閱「部署權限」和「管理存取權」。

建立及掛接暫時磁碟

您可以使用 Google Cloud 控制台、Google Cloud CLI 或 Terraform 建立及掛接暫時性磁碟:

控制台

  1. 前往 Google Cloud 控制台的 Cloud Run:

    前往 Cloud Run

  2. 從 Cloud Run 導覽選單中選取「服務」,然後點選「部署容器」,設定新服務。如要設定現有服務,請按一下該服務,然後按一下「編輯及部署新的修訂版本」

  3. 如要設定新服務,請填寫初始服務設定頁面,然後按一下「Containers, Networking, Security」(容器、網路、安全性) 展開服務設定頁面。

  4. 按一下「容器」分頁標籤。

    圖片

    • 在「資源」下方:
      • 選取「暫時磁碟」
      • 從選單指定暫時磁碟大小。
      • 輸入掛接路徑。
  5. 按一下 [Create] (建立) 或 [Deploy] (部署)

gcloud

如要新增及掛接磁碟區,請按照下列步驟操作:

gcloud beta run services update SERVICE \
    --execution-environment=gen2 \
    --add-volume=name=VOLUME_NAME,type=ephemeral-disk,size=SIZE \
    --add-volume-mount=volume=VOLUME_NAME,mount-path=MOUNT_PATH

更改下列內容:

  • SERVICE:服務名稱。
  • VOLUME_NAME:您要授予磁碟區的名稱。
  • SIZE:磁碟大小,例如 100Giephemeral-disk 磁碟區的大小至少須為 10Gi
  • MOUNT_PATH:要掛接磁碟區的相對路徑,例如 /mnt/my-volume

Terraform

如要瞭解如何套用或移除 Terraform 設定,請參閱「基本 Terraform 指令」。

在 Terraform 設定的 google_cloud_run_v2_service 資源中新增下列項目:
  resource "google_cloud_run_v2_service" "default" {
    name     = "SERVICE"
    location = "REGION"
    launch_stage = "BETA"
    deletion_protection =  "true"
    ingress = "INGRESS_TRAFFIC_ALL"

  template {
    containers {
        image = "IMAGE_URL"
        volume_mounts {
          name = "VOLUME_NAME"
          mount_path = "MOUNT_PATH"
        }
    }
    volumes {
        name = "VOLUME_NAME"
        empty_dir {
          medium = "DISK"
          size_limit = "SIZE"
        }
    }
  }
  lifecycle {
    ignore_changes = [
      launch_stage,
    ]
  }
}

更改下列內容:

  • SERVICE:服務名稱。
  • REGION: Google Cloud 區域。
  • IMAGE_URL:容器映像檔的參照,例如 us-docker.pkg.dev/cloudrun/container/hello:latest。如果您使用 Artifact Registry,則必須先建立存放區 REPO_NAME。網址格式為 LOCATION-docker.pkg.dev/PROJECT_ID/REPO_NAME/PATH:TAG
  • VOLUME_NAME:您要授予磁碟區的名稱。
  • MOUNT_PATH:要掛接磁碟區的相對路徑,例如 /mnt/my-volume
  • SIZE:磁碟大小,例如 100Giephemeral-disk 磁碟區的大小至少須為 10Gi

讀取及寫入磁碟區

如果您使用 Cloud Run 磁碟區掛接功能,可以透過程式設計語言中的相同程式庫存取已掛接的磁碟區,以便讀取及寫入本機檔案系統中的檔案。

如果您使用現有容器,且容器預期資料會儲存在本機檔案系統,並使用一般檔案系統作業存取資料,這個選項就特別實用。

下列程式碼片段假設磁碟區掛接點設為 /mnt/my-volumemountPath

NodeJS

使用 File System 模組在磁碟區中建立新檔案,或附加至現有檔案,/mnt/my-volume

var fs = require('fs');
fs.appendFileSync('/mnt/my-volume/sample-logfile.txt', 'Hello logs!', { flag: 'a+' });

Python

寫入磁碟區中保留的檔案 /mnt/my-volume

f = open("/mnt/my-volume/sample-logfile.txt", "a")

Go

使用 os 套件在磁碟區中建立新檔案 /mnt/my-volume

f, err := os.Create("/mnt/my-volume/sample-logfile.txt")

Java

使用 Java.io.File 類別在磁碟區中建立記錄檔 /mnt/my-volume

import java.io.File;
File f = new File("/mnt/my-volume/sample-logfile.txt");

清除及移除磁碟區和磁碟區掛接

您可以清除所有磁碟區和掛接點,也可以移除個別磁碟區和磁碟區掛接點。

清除所有磁碟區和磁碟區掛接點

如要清除單一容器服務中的所有磁碟區和磁碟區掛接點,請執行下列指令:

gcloud run services update SERVICE \
    --clear-volumes
    --clear-volume-mounts

如果您有多個容器,請按照 Sidecar CLI 慣例清除磁碟區和磁碟區掛接:

gcloud run services update SERVICE \
    --container=container1 \
    --clear-volumes
    -–clear-volume-mounts \
    --container=container2 \
    --clear-volumes \
    -–clear-volume-mounts

移除個別磁碟區和磁碟區掛接點

如要移除磁碟區,也必須移除使用該磁碟區的所有磁碟區掛接。

如要移除個別磁碟區或磁碟區掛接,請使用 remove-volumeremove-volume-mount 旗標:

gcloud run services update SERVICE \
    --remove-volume VOLUME_NAME \
    --container=container1 \
    --remove-volume-mount MOUNT_PATH \
    --container=container2 \
    --remove-volume-mount MOUNT_PATH

最佳做法

請遵循下列最佳做法,有效管理暫時性資料並提升儲存空間效能。

複製到永久儲存空間

如果您打算將暫時磁碟內容複製到永久儲存空間 (例如 Cloud Storage 值區),建議您採取增量複製,而非依賴 10 秒的 SIGTERMSIGKILL 寬限期。如要進一步瞭解執行個體關機,請參閱容器執行階段合約

Cloud Run 可以讀取及寫入 Cloud Storage,不必進行任何額外的網路設定。為達到最佳效能,建議您使用直接虛擬私有雲,透過虛擬私有雲網路將流量傳送至 Cloud Storage,以及從 Cloud Storage 傳送流量。

如果 Cloud Run 資源不需要存取網際網路,這個方法就適用。如果需要網際網路存取權,請設定 Cloud NAT,或參閱「Google API 的內部流量」。

如要透過服務設定直接虛擬私有雲輸出流量,請完成下列步驟:

  1. 前往 Google Cloud 控制台的 Cloud Run 頁面:

    前往 Cloud Run

  2. 如要設定要部署的新服務,請按一下「Create Service」(建立服務)。如要設定及部署現有服務,請按一下該服務,然後點選「編輯及部署新的修訂版本」

  3. 如要設定新服務,請視需要填寫初始服務設定頁面,然後按一下「Containers, Networking, Security」(容器、網路、安全性) 展開服務設定頁面。

  4. 按一下 [網路] 分頁標籤。

  5. 按一下「連線至虛擬私有雲,以傳出流量」

  6. 按一下「直接將流量傳送至虛擬私有雲」

  7. 在「Network」(網路) 欄位中,選取要傳送流量的虛擬私有雲網路。

  8. 在「Subnet」(子網路) 欄位中,選取服務接收 IP 位址的子網路。您可以在同一個子網路上部署多項服務。

  9. 在「流量轉送」部分,選取「將所有流量轉送至虛擬私有雲」,透過虛擬私有雲網路傳送所有輸出流量。

    1. 按一下 [Create] (建立) 或 [Deploy] (部署)

    2. 如要確認服務是否位於虛擬私有雲網路上,請按一下服務,然後點選「網路」分頁標籤。網路和子網路會列在「VPC」資訊卡中。

      現在,您可以根據防火牆規則,從 Cloud Run 服務將要求傳送至虛擬私有雲網路上的任何資源。

    3. 在您連線的子網路上啟用Private Google Access

疑難排解

如果遇到問題,請檢查下列事項:

  • 如果容器的記憶體即將用盡,且您使用 Google Cloud 控制台部署服務的新修訂版本並附加暫時性磁碟, Google Cloud 控制台很可能已將磁碟磁區轉換為記憶體內磁區。這會導致磁碟寫入作業寫入記憶體,進而導致容器記憶體不足。如要修正這個問題,請再次使用 gcloud CLI 重新部署服務,並確認 YAML 檔案在 volumes 下方指定 medium: Disk
  • 如果將大量資料下載至暫時磁碟時,網路速度緩慢,請按照步驟開啟 Direct VPC。如果未啟用 Direct VPC,網路傳輸速度會較慢。