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

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

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

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

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

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

用途

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

  • 資料處理工作負載:在 Cloud Run 中處理大型資料檔案時,通常會將整個檔案儲存在記憶體中,或將檔案分割成較小的片段。有了臨時儲存空間,您就不必為了建立資料的臨時本機副本,而支付大量記憶體費用。您也可以處理較大的資料集。
  • 快取:在網路服務用途中,將資料快取至磁碟,而非從遠端儲存空間擷取,可最佳化應用程式的延遲時間。

儲存空間和執行個體限制

適用的限制如下:

  • 磁碟區大小限制:每個磁碟區的大小必須介於 1Gi 至 100Gi 之間。
  • 執行個體儲存空間限制:根據預設,每個執行個體的總空間上限為 10 GiB。如要為每個執行個體設定超過 10 GiB 的記憶體,請申請提高配額。
  • 執行個體磁碟區限制:每個執行個體最多只能有 10 個暫時磁碟區。
  • 專案限制:根據預設,每項專案一開始的區域分配總量限制為 0 GiB。首次在某個區域部署具有暫時磁碟的資源時,專案會自動在該區域獲得 100 GiB 的配額。在執行階段,這項區域配額會由該區域內所有執行中的執行個體共用。部署資源時,每個執行個體的暫時磁碟大小總和乘以執行個體數量上限,不得超過區域分配限制。舉例來說,如果區域限制為 100 GiB,則磁碟為 10 GiB 的資源最多可設定 10 個執行個體。如有需要,請申請提高配額。

申請提高配額

如需更多容量,請要求提高 Cloud Run 服務的配額。請點選下列按鈕中的連結,要求所需配額。

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

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

限制

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

不允許的路徑

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

支援的地區

所有 Cloud Run 位置都可使用暫時磁碟。

事前準備

  1. 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

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

  3. 安裝並初始化 gcloud CLI。
  4. 更新元件:
    gcloud components update
  5. 查看 Cloud Run 定價頁面,瞭解 CPU、記憶體和網路輸出費用。佈建磁碟的完整大小和使用該磁碟的執行個體生命週期,都會影響費用。

必要的角色

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

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

建立及掛接暫時磁碟

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

控制台

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

    前往 Cloud Run。

  2. 從 Cloud Run 導覽選單中選取「Services」(服務),然後按一下「Deploy container」(部署容器),設定新服務。如要設定現有服務,請按一下該服務,然後按一下「Containers」(容器) 分頁標籤。

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

  4. 選取「Ephemeral disk」(暫時磁碟)。

  5. 從選單中選取大小,然後在「Mount path」(掛接路徑) 欄位中輸入掛接路徑。

  6. 按一下「建立」,建立新服務。依序點選「查看差異並重新部署」和「部署變更」,即可更新現有服務。

gcloud

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

gcloud 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:磁碟大小,例如 10Gi。ephemeral-disk 磁碟區的大小必須介於 1Gi 至 100Gi 之間。
  • MOUNT_PATH:掛接磁碟區的相對路徑,例如 /mnt/my-volume。

YAML

  1. 如要建立新服務,請略過這個步驟。如要更新現有服務,請下載其 YAML 設定:

    gcloud run services describe SERVICE --format export > service.yaml
  2. 設定 YAML 檔案:

    apiVersion: serving.knative.dev/v1
    kind: Service
    metadata:
      name: SERVICE
      labels:
        cloud.googleapis.com/location: REGION
    spec:
      template:
        spec:
          containers:
          - name: CONTAINER_NAME
            image: IMAGE_URL
            volumeMounts:
            - name: VOLUME_NAME
              mountPath: MOUNT_PATH
          volumes:
          - name: VOLUME_NAME
            emptyDir:
              medium: Disk
              sizeLimit: SIZE
    

    更改下列內容:

    • SERVICE:服務名稱。
    • REGION: Google Cloud 區域。
    • CONTAINER_NAME:要為容器指定的名稱。
    • 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:磁碟大小,例如 10Gi。ephemeral-disk 磁碟區的大小必須介於 1Gi 至 100Gi 之間。
  3. 使用下列指令建立或更新服務:

    gcloud run services replace service.yaml

    gcloud run services replace 指令預設會使用 service.yaml 檔案 (如有)。

Terraform

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

在 Terraform 設定中,將下列內容新增至 google_cloud_run_v2_service 資源:
  resource "google_cloud_run_v2_service" "default" {
    name     = "SERVICE"
    location = "REGION"
    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:磁碟大小,例如 10Gi。ephemeral-disk 磁碟區的大小必須介於 1Gi 至 100Gi 之間。

讀取及寫入磁碟區

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

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

下列程式碼片段假設磁碟區掛接的 mountPath 設為 /mnt/my-volume。

NodeJS

使用檔案系統模組,在磁碟區 /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-volume 和 remove-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 bucket),建議您逐步複製,而不是依賴 10 秒的 SIGTERM 到 SIGKILL 寬限期。如要進一步瞭解執行個體關閉作業,請參閱「容器執行階段合約」。

Cloud Run 可以讀取及寫入 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. 在「Traffic routing」(流量轉送) 部分,選取「Route all traffic to the VPC」(將所有流量轉送至虛擬私有雲),透過虛擬私有雲網路傳送所有傳出流量。

    1. 按一下「建立」,建立新服務。依序點選「查看差異並重新部署」和「部署變更」,即可更新現有服務。

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

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

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

疑難排解

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

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