本頁說明如何在 Cloud Run 中將 NFS 檔案共用區掛接為磁碟區。您可以使用任何 NFS 伺服器,包括您在內部部署系統或 Compute Engine VM 上代管的 NFS 伺服器。如果您還沒有 NFS 伺服器,建議使用 Filestore,這是 Google Cloud提供的全代管 NFS 服務。
如要使用 NBD、9P、CIFS/Samba 和 Ceph 網路檔案系統,請參閱使用 NBD、9P、CIFS/Samba 和 Ceph 網路檔案系統。
將 NFS 檔案共用區掛接為 Cloud Run 中的磁碟區後,檔案共用區就會以容器檔案系統中的檔案形式呈現。將檔案共用區掛接為磁碟區後,您可以使用程式設計語言的檔案系統作業和程式庫,存取檔案共用區,就像存取本機檔案系統中的目錄一樣。
不允許的路徑
Cloud Run 不允許您在 /dev
、/proc
或 /sys
,或其子目錄中掛接磁碟區。
限制
如要寫入 NFS 磁碟區,容器必須以根身分執行。如果容器只從檔案系統讀取資料,則可以以任何使用者身分執行。
Cloud Run 不支援 NFS 鎖定。系統會以無鎖定模式自動掛接 NFS 磁碟區。
事前準備
如要在 Cloud Run 中將 NFS 伺服器掛接為磁碟區,請確認您具備下列條件:
- NFS 伺服器或 Filestore 執行個體執行的虛擬私有雲網路。
- 在虛擬私有雲網路中執行的 NFS 伺服器,以及連線至該虛擬私有雲網路的 Cloud Run 服務。如果沒有 NFS 伺服器,請建立 Filestore 執行個體。
- Cloud Run 服務會附加至執行 NFS 伺服器的虛擬私有雲網路。如要獲得最佳效能,請使用直接虛擬私有雲,而非虛擬私有雲連接器。
- 如果您使用現有專案,請確認虛擬私有雲防火牆設定允許 Cloud Run 連線至 NFS 伺服器。(如果您是從新專案開始,這項設定預設為 true)。如果您使用 Filestore 做為 NFS 伺服器,請按照 Filestore 文件建立防火牆輸出規則,讓 Cloud Run 可以連線至 Filestore。
必要的角色
如要取得設定及部署 Cloud Run 服務所需的權限,請要求管理員在服務中授予下列 IAM 角色:
-
Cloud Run 開發人員 (
roles/run.developer
) - Cloud Run 服務 -
服務帳戶使用者 (
roles/iam.serviceAccountUser
) - 服務身分
如需與 Cloud Run 相關聯的 IAM 角色和權限清單,請參閱 Cloud Run IAM 角色和 Cloud Run IAM 權限。如果 Cloud Run 服務與Google Cloud API (例如 Cloud 用戶端程式庫) 介接,請參閱服務身分設定指南。 如要進一步瞭解如何授予角色,請參閱部署權限和管理存取權。
掛接 NFS 磁碟區
您可以在不同掛接路徑掛接多個 NFS 伺服器、Filestore 執行個體或其他磁碟區類型。
如果您使用多個容器,請先指定磁碟區,然後為每個容器指定磁碟區掛接點。
控制台
前往 Google Cloud 控制台的 Cloud Run:
從選單中選取「服務」,然後按一下「部署容器」,設定新服務。如要設定現有服務,請按一下該服務,然後點選「編輯並部署新修訂版本」。
如要設定新服務,請填寫初始服務設定頁面,然後按一下「容器、磁碟區、網路與安全性」,展開服務設定頁面。
按一下「Volumes」(磁碟區) 分頁標籤。
- 在「磁碟區」下方:
- 按一下「新增磁碟區」。
- 在「Volume type」(磁碟區類型) 下拉式選單中,選取「NFS」做為磁碟區類型。
- 在「磁碟區名稱」欄位中,輸入要使用的磁碟區名稱。
- 在「NFS server」(NFS 伺服器) 欄位中,輸入 NFS 檔案共用區的網域名稱或位置 (格式為
IP_ADDRESS
)。 - 在「路徑」欄位中,輸入要掛接的 NFS 伺服器目錄路徑。
- 按一下 [完成]。
- 按一下「容器」分頁,然後展開要掛接磁碟區的容器,即可編輯容器。
- 按一下「Volume Mounts」分頁標籤。
- 按一下「掛接磁碟區」。
- 從選單中選取 NFS 磁碟區。
- 指定要掛接磁碟區的路徑。
- 按一下「掛接磁碟區」。
- 在「磁碟區」下方:
按一下 [Create] (建立) 或 [Deploy] (部署)。
gcloud
如要新增磁碟區並掛接,請按照下列步驟操作:
gcloud run services update SERVICE \ --add-volume=name=VOLUME_NAME,type=nfs,location=IP_ADDRESS:NFS_PATH \ --add-volume-mount=volume=VOLUME_NAME,mount-path=MOUNT_PATH
取代:
- SERVICE 改為您的服務名稱。
- VOLUME_NAME 改成您要為磁碟區取的名稱。
- IP_ADDRESS,並提供 NFS 檔案共用位置。
- NFS_PATH,並以正斜線開頭,例如
/example-directory
。 - MOUNT_PATH,例如
/mnt/my-volume
。 - VOLUME_NAME 改成您要的磁碟區名稱。VOLUME_NAME 值用於將磁碟區對應至磁碟區掛接點。
如要將磁碟區掛接為唯讀磁碟區,請按照下列步驟操作:
--add-volume=name=VOLUME_NAME,type=nfs,location=IP_ADDRESS:NFS_PATH,readonly=true
如果您使用多個容器,請先指定磁碟區,然後為每個容器指定磁碟區掛接點:
gcloud run services update SERVICE \ --add-volume=name VOLUME_NAME,type=nfs,location=IP_ADDRESS:NFS_PATH \ --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
視需要更新 MOUNT_PATH、VOLUME_NAME、IP_ADDRESS 和 NFS_PATH。如果您有多個磁碟區掛接點,就會有多個這類屬性。
apiVersion: run.googleapis.com/v1 kind: Service metadata: name: SERVICE spec: template: metadata: annotations: run.googleapis.com/execution-environment: gen2 spec: containers: - image: IMAGE_URL volumeMounts: - name: VOLUME_NAME mountPath: MOUNT_PATH volumes: - name: VOLUME_NAME nfs: server: IP_ADDRESS path: NFS_PATH readOnly: IS_READ_ONLY
取代
- SERVICE 改為 Cloud Run 服務名稱
- MOUNT_PATH,例如
/mnt/my-volume
。 - VOLUME_NAME 改成您要的磁碟區名稱。VOLUME_NAME 值用於將磁碟區對應至磁碟區掛接點。
- IP_ADDRESS,並提供 NFS 檔案共用區的地址。
- 將 NFS_PATH 替換為 NFS 檔案共用路徑,並以正斜線開頭,例如
/example-directory
。 - IS_READ_ONLY,並使用
True
將磁碟區設為唯讀,或使用False
允許寫入。
使用下列指令建立或更新服務:
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"
template {
execution_environment = "EXECUTION_ENVIRONMENT_GEN2"
containers {
image = "us-docker.pkg.dev/cloudrun/container/hello"
volume_mounts {
name = "VOLUME_NAME"
mount_path = "MOUNT_PATH"
}
}
vpc_access {
network_interfaces {
network = "default"
subnetwork = "default"
}
}
volumes {
name = "VOLUME_NAME"
nfs {
server = google_filestore_instance.default.networks[0].ip_addresses[0]
path = "NFS_PATH"
read_only = IS_READ_ONLY
}
}
}
}
resource "google_filestore_instance" "default" {
name = "cloudrun-service-ro"
location = "REGION"
tier = "BASIC_HDD"
file_shares {
capacity_gb = 1024
name = "share1"
}
networks {
network = "default"
modes = ["MODE_IPV4"]
}
}
取代:
- SERVICE 改為您的 Cloud Run 服務名稱。
- REGION 替換成 Google Cloud 地區。例如:
europe-west1
。 - MOUNT_PATH 替換為要掛接磁碟區的相對路徑,例如
/mnt/nfs/filestore
。 - VOLUME_NAME 改成您要的磁碟區名稱。VOLUME_NAME 值用於將磁碟區對應至磁碟區掛接點。
- NFS_PATH,並以正斜線開頭,例如
/share1
。 - IS_READ_ONLY,使用
True
將磁碟區設為唯讀,或使用False
允許寫入。
讀取及寫入磁碟區
如果您使用 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");
排解 NFS 問題
如果遇到問題,請檢查下列事項:
- 您的 Cloud Run 服務已連線至 NFS 伺服器所在的 VPC 網路。
- 沒有任何防火牆規則會禁止 Cloud Run 連線至 NFS 伺服器。
- 如果容器會寫入 NFS 伺服器,請務必以根身分執行。
容器啟動時間和 NFS 磁碟區掛接
使用 NFS 磁碟區掛接時,Cloud Run 容器的冷啟動時間可能會稍微增加,因為系統會在啟動容器前啟動磁碟區掛接。只有在成功掛接 NFS 時,容器才會啟動。
請注意,NFS 必須先建立與伺服器的連線並擷取檔案控制代碼,才能成功掛接磁碟區。如果 Cloud Run 無法與伺服器建立連線,Cloud Run 服務將無法啟動。
此外,任何網路延遲都可能影響容器啟動時間,因為 Cloud Run 的所有掛接作業總共只有 30 秒的逾時時間。如果 NFS 掛接時間超過 30 秒,Cloud Run 服務就會啟動失敗。
NFS 效能特徵
如果您建立多個 NFS 磁碟區,系統會並行掛接所有磁碟區。
由於 NFS 是網路檔案系統,因此會受到頻寬限制,而頻寬有限可能會影響檔案系統的存取權。
寫入 NFS 磁碟區的資料會儲存在 Cloud Run 記憶體中,直到資料排清為止。在下列情況下,系統會排清資料:
- 您的應用程式會使用 sync(2)、msync(2) 或 fsync(3) 明確清除檔案資料。
- 您的應用程式會使用 close(2) 關閉檔案。
- 記憶體壓力會強制回收系統記憶體資源。
詳情請參閱 Linux 的 NFS 說明文件。
清除及移除磁碟區和磁碟區掛接
您可以清除所有磁碟區和掛接點,也可以移除個別磁碟區和磁碟區掛接點。
清除所有磁碟區和磁碟區掛接點
如要清除單一容器服務中的所有磁碟區和磁碟區掛接點,請執行下列指令:
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