本頁說明如何設定專用的記憶體內磁碟區,以便使用 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 開發人員 (
roles/run.developer
) 在 Cloud Run 服務上 -
服務帳戶使用者 (
roles/iam.serviceAccountUser
) 服務身分
如果您要從原始碼部署服務或函式,您也必須在專案和 Cloud Build 服務帳戶中獲得額外角色。
如需與 Cloud Run 相關的 IAM 角色和權限清單,請參閱 Cloud Run IAM 角色和 Cloud Run IAM 權限。如果 Cloud Run 服務與Google Cloud API (例如 Cloud 用戶端程式庫) 介接,請參閱服務身分設定指南。 如要進一步瞭解如何授予角色,請參閱部署權限和管理存取權。
設定記憶體內磁碟區
變更任何設定都會建立新的修訂版本。除非您明確做出更新,變更這項設定,否則後續的修訂版本也會自動取得這個設定。
為 Cloud Run 服務設定記憶體內磁碟區後,系統會為啟動的每個 Cloud Run 執行個體建立空白磁碟區,且只要該執行個體正在執行,磁碟區就會存在。執行個體停止執行後,磁碟區中的資料就會永久刪除。
控制台
前往 Google Cloud 控制台的 Cloud Run:
從選單中選取「服務」,然後按一下「部署容器」來設定新服務。如要設定現有服務,請按一下該服務,然後點選「Edit and deploy new revision」(編輯及部署新修訂版本)。
如要設定新服務,請填寫初始服務設定頁面,然後按一下「容器、磁碟區、網路與安全性」,展開服務設定頁面。
按一下「Volumes」(磁碟區) 分頁標籤。
- 在「磁碟區」下方:
- 按一下「新增磁碟區」。
- 在「Volume type」(磁碟區類型) 下拉式選單中,選取「In-memory」(記憶體內) 做為磁碟區類型。
- 在「磁碟區名稱」欄位中,輸入要使用的磁碟區名稱。
- 按一下 [完成]。
- 按一下「容器」分頁標籤。
- 按一下「Volume Mounts」分頁標籤。
- 按一下「掛接磁碟區」。
- 從選單中選取記憶體內磁碟區。
- 指定要掛接磁碟區的路徑。
- 按一下「掛接磁碟區」。
- 在「磁碟區」下方:
按一下 [Create] (建立) 或 [Deploy] (部署)。
gcloud
如要新增磁碟區並掛接,請按照下列步驟操作:
gcloud run services update SERVICE \ --add-volume=name=VOLUME_NAME,type=in-memory,size-limit=SIZE_LIMIT \ --add-volume-mount=volume=VOLUME_NAME,mount-path=MOUNT_PATH
更改下列內容:
SERVICE
:服務名稱。- VOLUME_NAME:磁碟區的任意名稱。 VOLUME_NAME 值用於將磁碟區對應至磁碟區掛接點。
MOUNT_PATH
:要在這個磁碟區掛接的容器檔案系統內相對路徑,例如/mnt/my-volume
。- SIZE_LIMIT:要指派給磁碟區的記憶體上限,單位為 MiB 或 GiB (指定為 Mi 或 Gi),例如
500Mi
。這個上限必須低於為容器指定的記憶體總量。
如果您使用多個容器,請先指定磁碟區,然後為每個容器指定磁碟區掛接點:
gcloud run services update SERVICE \ --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
如要建立新服務,請略過這個步驟。 如要更新現有服務,請下載其 YAML 設定:
gcloud run services describe SERVICE --format export > service.yaml
如圖所示,設定
volumeMounts
和volumes
屬性:apiVersion: serving.knative.dev/v1 kind: Service metadata: name: SERVICE_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/hello:latest
。如果您使用 Artifact Registry,則必須先建立存放區 REPO_NAME。網址格式為LOCATION-docker.pkg.dev/PROJECT_ID/REPO_NAME/PATH:TAG
。 - VOLUME_NAME:磁碟區的任意名稱。 VOLUME_NAME 值用於將磁碟區對應至磁碟區掛接點。
MOUNT_PATH
:要在這個磁碟區掛接的容器檔案系統內相對路徑,例如/mnt/my-volume
。- SIZE_LIMIT:要指派給磁碟區的記憶體上限,單位為 MiB 或 GiB (指定為 Mi 或 Gi),例如
500Mi
。這個上限必須低於為容器指定的記憶體總量。
- IMAGE_URL:容器映像檔的參照,例如
使用下列指令建立或更新服務:
gcloud run services replace service.yaml
Terraform
如要瞭解如何套用或移除 Terraform 設定,請參閱「基本 Terraform 指令」。
在 Terraform 設定中,將下列內容新增至google_cloud_run_v2_service
資源:resource "google_cloud_run_v2_service" "default" {
name = "SERVICE_NAME"
location = "REGION"
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"
}
}
}
}
更改下列內容:
- SERVICE_NAME:Cloud Run 服務的名稱。
- REGION: Google Cloud 區域。例如:
europe-west1
。 - 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:磁碟區的任意名稱。VOLUME_NAME 值用於將磁碟區對應至磁碟區掛接點。
- MOUNT_PATH:要在容器檔案系統中掛接這個磁碟區的相對路徑,例如
/mnt/my-volume
。 - SIZE_LIMIT:要指派給磁碟區的記憶體上限,單位為 MiB 或 GiB (指定為 Mi 或 Gi),例如
500Mi
。這項限制必須低於為容器指定的總記憶體。
讀取及寫入磁碟區
如果您使用 Cloud Run 磁碟區掛接功能,可以透過程式設計語言中用來讀取及寫入本機檔案系統的相同程式庫,存取已掛接的磁碟區。
如果您使用現有容器,且容器預期資料會儲存在本機檔案系統,並使用一般檔案系統作業存取資料,這個方法就特別實用。
下列程式碼片段假設磁碟區掛接點設為 /mnt/my-volume
,且 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