為工作設定在記憶體中的磁碟區掛載

本頁說明如何設定專用的記憶體內磁碟區,以便使用 Cloud Run 磁碟區掛接功能讀取及寫入檔案。請注意,這項功能與 Cloud Run 提供的內建記憶體內檔案系統不同。

在 Cloud Run 中掛接記憶體內磁碟區時,記憶體內磁碟區會顯示為容器檔案系統中的檔案。掛接記憶體內磁碟區後,您可以使用程式設計語言的檔案系統作業和程式庫,存取該磁碟區,就像存取本機檔案系統中的目錄一樣。

您可以使用記憶體內磁碟區執行下列操作:

  • 限制記憶體內磁碟區的大小。限制磁碟區大小後,寫入已滿磁碟區的作業會失敗,這比磁碟區耗用過多記憶體而導致 Cloud Run 終止執行個體要好。
  • 在一個 Cloud Run 執行個體中,於不同容器之間共用記憶體內磁碟區。當 Cloud Run 擴充至多個工作工作執行個體時,每個工作都會有自己的記憶體內磁碟區,該工作上的所有容器都會共用這個磁碟區。當 Cloud Run 擴充資源來處理流量時,所有容器都能使用這個磁碟區。

行為

建立記憶體內磁碟區時,建議您指定大小限制。如果磁碟區達到大小上限,後續寫入作業就會因記憶體不足而失敗。您的執行個體可以處理這項錯誤,並繼續執行。

請注意,大小限制只是限制,不會為記憶體內磁碟區分配額外空間。而是會耗用您為容器設定的記憶體。如果部署多個容器,每次寫入磁碟區時使用的記憶體,都會計入寫入資料的容器記憶體用量。

如未指定大小限制,系統會自動設為工作或服務中所有容器總大小的一半。舉例來說,磁碟區大小 = [記憶體 (容器 A) + 記憶體 (容器 B) + 記憶體 (容器 N)]/2。emptyDir這項預設行為可能會導致記憶體內磁碟區的大小上限,高於為部分容器分配的記憶體。即使磁碟區大小未達上限,如果單一容器在嘗試將更多資料寫入磁碟區時,超出自身分配到的記憶體,仍可能導致意外當機。

雖然設定大小限制是選用功能,但我們建議您設定限制,以免容器記憶體不足而當機。

不允許的路徑

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

必要的角色

如要取得設定 Cloud Run 作業所需的權限,請要求管理員授予您下列 IAM 角色:

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

設定記憶體內磁碟區

變更任何設定都會建立新的修訂版本。除非您明確做出更新,改變這項設定,否則後續的修訂版本也會自動取得這個設定。

為 Cloud Run 服務設定記憶體內磁碟區後,系統會為啟動的每個 Cloud Run 執行個體建立空白磁碟區,且只要該執行個體正在執行,磁碟區就會存在。執行個體停止執行後,磁碟區中的資料就會永久刪除。

控制台

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

    前往 Cloud Run

  2. 按一下「Deploy container」(部署容器),填寫初始工作設定頁面。如要設定現有工作,請選取該工作,然後按一下「查看及編輯工作設定」

  3. 按一下「容器、連線、安全性」,展開工作屬性頁面。

  4. 按一下「Volumes」(磁碟區) 分頁標籤。

    圖片

    • 按一下「掛接磁碟區」
    • 按一下「記憶體內」做為磁碟區類型。
    • 在「Mount path」(掛接路徑) 欄位中,輸入要掛接磁碟區的路徑。
    • 在「磁碟區名稱」欄位中輸入磁碟區名稱。
    • 選用:輸入「大小限制」和「記憶體單位」,指定要指派給磁碟區的記憶體限制。這個上限必須低於為容器指定的總記憶體。這個磁碟區中儲存的資料會耗用資料寫入容器預留的記憶體。
    • 按一下 [儲存]
  5. 按一下「建立」或「更新」

gcloud

  • 如要掛接磁碟區,請按照下列步驟操作:third_party/devsite/cloud/en/run/docs/images/nfs-volume-mount.png

    gcloud run jobs update JOB \
      --add-volume mount-path=MOUNT_PATH,type=in-memory,size-limit=SIZE_LIMIT

    更改下列內容:

    • JOB:作業名稱。
    • MOUNT_PATH:要在容器檔案系統中掛接這個磁碟區的相對路徑,例如 /mnt/my-volume
    • SIZE_LIMIT:要指派給磁碟區的記憶體限制,以 MiB 或 GiB 為單位 (指定為 Mi 或 Gi),例如 500Mi。這個上限必須低於為容器指定的記憶體總量
  • 如果您使用多個容器,請先指定磁碟區,然後為每個容器指定磁碟區掛接點:

    gcloud run jobs update JOB \
      --add-volume=name= VOLUME_NAME,type=in-memory,size-limit=SIZE_LIMIT \
      --container=CONTAINER_1 \
      --add-volume-mount=volume= VOLUME_NAME,mount-path=MOUNT_PATH \
      --container==CONTAINER_2 \
      --add-volume-mount=volume= VOLUME_NAME,mount-path=MOUNT_PATH2

YAML

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

    gcloud run jobs describe JOB_NAME --format export > job.yaml
  2. 如圖所示,設定 volumeMountsvolumes 屬性:

    apiVersion: run.googleapis.com/v1
    kind: Job
    metadata:
      name: JOB_NAME
    spec:
      template:
        spec:
          containers:
          - image: IMAGE_URL
            volumeMounts:
            - mountPath: MOUNT_PATH
              name: VOLUME_NAME
          volumes:
          - name: VOLUME_NAME
            emptyDir:
              sizeLimit: SIZE_LIMIT
              medium: Memory

    更改下列內容:

    • IMAGE_URL容器映像檔的參照,例如 us-docker.pkg.dev/cloudrun/container/job:latest
    • VOLUME_NAME:磁碟區的名稱。VOLUME_NAME 值用於將磁碟區對應至磁碟區掛接點。
    • MOUNT_PATH:要在這個磁碟區掛接的容器檔案系統內相對路徑,例如 /mnt/my-volume
    • SIZE_LIMIT:要指派給磁碟區的記憶體上限,以 MiB 或 GiB 為單位 (指定為 Mi 或 Gi),例如 500Mi。這個上限必須低於為容器指定的記憶體總量
  3. 使用下列指令建立或更新作業:

    gcloud run jobs replace job.yaml

    如果存在 job.yaml 檔案,gcloud run jobs replace 指令預設會使用該檔案。

Terraform

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

在 Terraform 設定中,將下列項目新增至 google_cloud_run_v2_job 資源:

resource "google_cloud_run_v2_job" "default" {
  name     = "JOB_NAME"
  location = "REGION"

  template {
    template {
      containers {
        image = "IMAGE_URL"
    volume_mounts {
      name = "VOLUME_NAME"
      mount_path = "MOUNT_PATH"
    }
      }
      volumes {
        name = "VOLUME_NAME"
    empty_dir {
      medium = "MEMORY"
      size_limit = "SIZE_LIMIT"
    }
      }
    }
  }
}

更改下列內容:

  • JOB_NAME:Cloud Run 工作名稱。
  • REGION 替換成 Google Cloud 區域。例如:europe-west1
  • IMAGE_URL容器映像檔的參照,例如 us-docker.pkg.dev/cloudrun/container/job:latest
  • VOLUME_NAME:磁碟區的名稱。VOLUME_NAME 值用於將磁碟區對應至磁碟區掛接點。
  • MOUNT_PATH:要在容器檔案系統中掛接這個磁碟區的相對路徑,例如 /mnt
  • SIZE_LIMIT:要指派給磁碟區的記憶體上限,以 MiB 或 GiB 為單位 (指定為 Mi 或 Gi),例如 128Mi。這個限制必須小於為容器指定的總記憶體

讀取及寫入磁碟區

如果您使用 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 jobs update JOB \
    --clear-volumes
    --clear-volume-mounts

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

gcloud run jobs update JOB \
    --clear-volumes \
    --clear-volume-mounts \
    --container=container1 \
    --clear-volumes \
    -–clear-volume-mounts \
    --container=container2 \
    --clear-volumes \
    -–clear-volume-mounts

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

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

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

gcloud run jobs update JOB \
    --remove-volume VOLUME_NAME
    --container=container1 \
    --remove-volume-mount MOUNT_PATH \
    --container=container2 \
    --remove-volume-mount MOUNT_PATH