本頁面說明如何在 Cloud Run 中,將 NFS 檔案共用區掛接為磁碟區。您可以使用任何 NFS 伺服器,包括託管於地端部署環境或 Compute Engine VM 的 NFS 伺服器。如果您還沒有 NFS 伺服器,建議使用 Filestore,這是 Google Cloud提供的全代管 NFS 服務。
在 Cloud Run 中將 NFS 檔案共用區掛接為磁碟區,檔案共用區就會以檔案形式顯示在容器檔案系統中。將檔案共用區掛接為磁碟區後,您可以使用程式設計語言的檔案系統作業和程式庫,像存取本機檔案系統上的目錄一樣存取該共用區。
限制
- Cloud Run 不支援 NFS 鎖定。NFS 磁碟區會自動以無鎖定模式掛接。
- 不允許的路徑:Cloud Run 不允許您在
/dev、/proc或/sys或其子目錄中掛接磁碟區。
事前準備
如要在 Cloud Run 中將 NFS 伺服器掛接為磁碟區,請確認您具備下列條件:
- 執行 NFS 伺服器或 Filestore 執行個體的虛擬私有雲網路。
- 在虛擬私有雲網路中執行的 NFS 伺服器,且 Cloud Run worker 集區已連線至該虛擬私有雲網路。如果您還沒有 NFS 伺服器,請建立 Filestore 執行個體。
- Cloud Run worker 集區已連結至 NFS 伺服器運作的虛擬私有雲網路。為獲得最佳效能,請使用直連虛擬私有雲,而非虛擬私有雲連接器。
- 如果您使用現有專案,請確認虛擬私有雲防火牆設定允許 Cloud Run 存取 NFS 伺服器。(如果是從新專案開始,則預設為 true)。如果您使用 Filestore 做為 NFS 伺服器,請按照 Filestore 說明文件建立防火牆輸出規則,讓 Cloud Run 能夠連線至 Filestore。
- 設定遠端 NFS 檔案共用區的權限,允許容器的使用者存取。根據預設,Filestore 會向所有使用者提供讀取權限,但僅限超級使用者 (
uid 0) 擁有寫入權限。如果容器需要寫入權限,且並非以超級使用者身分執行,則必須使用連線的用戶端 (以超級使用者身分執行) 修改共用權限。舉例來說,您可以使用chown指令,將檔案或目錄的擁有權變更為容器執行時使用的特定使用者 ID。
必要的角色
如要查看與 Cloud Run 相關聯的 IAM 角色和權限清單,請參閱「Cloud Run IAM 角色」和「Cloud Run IAM 權限」。如果 Cloud Run worker 集區與Google Cloud API (例如 Cloud 用戶端程式庫) 介接,請參閱服務身分設定指南。如要進一步瞭解如何授予角色,請參閱部署權限和管理存取權。
掛接 NFS 磁碟區
您可以在不同的掛接路徑上掛接多個 NFS 伺服器、Filestore 執行個體或其他磁碟區類型。
如果您使用多個容器,請先指定磁碟區,然後為每個容器指定磁碟區掛接。
使用 Google Cloud 控制台、Google Cloud CLI、YAML 或 Terraform 設定 NFS 磁碟區掛接。
控制台
前往 Google Cloud 控制台的「Cloud Run」頁面:
從 Cloud Run 導覽選單中選取「Worker pools」(工作站集區):
如要設定現有 worker 集區,請按一下該集區,然後點選「Edit and deploy new revision」(編輯並部署新的修訂版本)。
如要設定新的 worker 集區,請按一下「Deploy container」(部署容器),然後填寫初始 worker 集區頁面。然後按一下「容器、網路、安全性」,展開工作站集區設定頁面。
按一下「Volumes」分頁標籤。
按一下「Mount volume」。
點選「NFS」NFS做為磁碟區類型。
請按照下列步驟設定磁碟區:
- 在「Mount path」(掛接路徑) 欄位中,輸入要掛接磁碟區的路徑。
- 在「NFS server」(NFS 伺服器) 欄位中,輸入 NFS 檔案共用區的網域名稱或位置 (格式為
IP_ADDRESS)。 - 在「Path」(路徑) 欄位中,輸入要掛接的 NFS 伺服器目錄路徑。
- 按一下 [儲存]。
按一下 [Create] (建立) 或 [Deploy] (部署)。
gcloud
如要新增磁碟區掛接項目,請按照下列步驟操作:
gcloud run worker-pools update WORKER_POOL \ --add-volume mount-path=MOUNT_PATH,type=nfs,location=IP_ADDRESS:NFS_PATH,readonly=READ_ONLY
更改下列內容:
- WORKER_POOL:worker 集區的名稱。
- MOUNT_PATH:掛接磁碟區的相對路徑,例如
/mnt/my-volume。 - IP_ADDRESS:NFS 檔案共用區的位置。
- NFS_PATH:NFS 檔案共用區的路徑,開頭為正斜線,例如
/example-directory。 - READ_ONLY:
true可將磁碟區設為唯讀,false則可允許寫入。
如果您使用多個容器,請先指定磁碟區,然後指定每個容器的磁碟區掛接:
gcloud run worker-pools update WORKER_POOL \ --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
如要建立新的 worker 集區,請略過這個步驟。如要更新現有 worker 集區,請下載其 YAML 設定:
gcloud run worker-pools describe WORKER_POOL --format export > worker-pool.yaml
以下範例包含 YAML 設定:
apiVersion: run.googleapis.com/v1 kind: WorkerPool metadata: name: WORKER_POOL spec: template: spec: containers: - name: CONTAINER_NAME 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
更改下列內容:
- WORKER_POOL:Cloud Run worker 集區的名稱。
- CONTAINER_NAME:容器名稱。
IMAGE_URL:參照包含 worker 集區的容器映像檔,例如us-docker.pkg.dev/cloudrun/container/worker-pool:latest- VOLUME_NAME:磁碟區名稱,可任意命名。VOLUME_NAME 值用於將磁碟區對應至磁碟區掛接。
- MOUNT_PATH:掛接磁碟區的相對路徑,例如
/mnt/my-volume。 - IP_ADDRESS:NFS 檔案共用區的位址。
- NFS_PATH:NFS 檔案共用區的路徑,開頭為正斜線,例如
/example-directory。 - IS_READ_ONLY:
True會將磁碟區設為唯讀,False則允許寫入。
使用下列指令建立或更新 worker 集區:
gcloud run worker-pools replace worker-pool.yaml
gcloud run worker-pools replace指令預設會使用worker-pool.yaml檔案 (如有)。
Terraform
如要瞭解如何套用或移除 Terraform 設定,請參閱「基本 Terraform 指令」。
resource "google_cloud_run_v2_worker_pool" "default" {
name = "WORKER_POOL"
location = "REGION"
template {
containers {
image = "IMAGE_URL"
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-worker-pool"
location = "REGION"
tier = "BASIC_HDD"
file_shares {
capacity_gb = 1024
name = "share1"
}
networks {
network = "default"
modes = ["MODE_IPV4"]
}
}
更改下列內容:
- WORKER_POOL:worker 集區的名稱。
- REGION: Google Cloud 區域,例如
europe-west1。 IMAGE_URL:參照包含 worker 集區的容器映像檔,例如us-docker.pkg.dev/cloudrun/container/worker-pool:latest。- VOLUME_NAME:磁碟區名稱。VOLUME_NAME 值用於將磁碟區對應至磁碟區掛接。
- MOUNT_PATH:掛接磁碟區的相對路徑,例如
/mnt/my-volume。 - NFS_PATH:NFS 檔案共用區的路徑。
- IS_READ_ONLY:
True會將磁碟區設為唯讀,False則允許寫入。
查看 worker 集區的環境變數設定
前往 Google Cloud 控制台的「Cloud Run」頁面:
按一下「Worker pools」(worker 集區),即可顯示已部署的 worker 集區清單。
按一下要檢查的工作站集區,顯示詳細資料窗格。
按一下「Containers」(容器) 分頁標籤,顯示 worker 集區容器設定。
疑難排解 NFS
如果遇到問題,請檢查下列事項:
- Cloud Run worker 集區已連線至 NFS 伺服器所在的虛擬私有雲網路。
- 沒有任何防火牆規則會阻止 Cloud Run 存取 NFS 伺服器。
- 如果容器需要寫入資料,請務必設定 NFS 共用權限,允許容器使用者寫入。
容器啟動時間和 NFS 磁碟區掛接
使用 NFS 磁碟區掛接會稍微增加 Cloud Run 容器冷啟動時間,因為磁碟區掛接會在容器啟動前啟動。只有在 NFS 掛接成功時,容器才會啟動。
請注意,NFS 必須先連線至伺服器並擷取檔案控制代碼,才能成功掛接磁碟區。如果 Cloud Run 無法與伺服器建立連線,Cloud Run worker 集區就無法啟動。
此外,Cloud Run 的所有掛接作業總逾時時間為 30 秒,因此任何網路延遲都可能影響容器啟動時間。如果 NFS 掛接時間超過 30 秒,Cloud Run worker 集區就無法啟動。
NFS 效能特性
如果您建立多個 NFS 磁碟區,所有磁碟區都會平行掛接。
由於 NFS 是網路檔案系統,因此會受到頻寬限制,且頻寬有限可能會影響檔案系統的存取。
寫入 NFS 磁碟區時,寫入內容會儲存在 Cloud Run 記憶體中,直到資料清除為止。系統會在下列情況下清除資料:
- 應用程式使用 sync(2)、msync(2) 或 fsync(3) 明確清除檔案資料。
- 應用程式使用 close(2) 關閉檔案。
- 記憶體壓力會強制回收系統記憶體資源。
詳情請參閱 NFS 的 Linux 說明文件。
清除及移除磁碟區和磁碟區掛接
您可以清除所有磁碟區和掛接點,也可以移除個別磁碟區和磁碟區掛接點。
清除所有磁碟區和磁碟區掛接
如要清除單一容器 worker 集區中的所有磁碟區和磁碟區掛接,請執行下列指令:
gcloud run worker-pools update WORKER_POOL \ --clear-volumes \ --clear-volume-mounts
gcloud run worker-pools update WORKER_POOL \ --container=container1 \ --clear-volumes \ --clear-volume-mounts \ --container=container2 \ --clear-volumes \ --clear-volume-mounts
移除個別磁碟區和磁碟區掛接
如要移除磁碟區,您也必須移除使用該磁碟區的所有磁碟區掛接。
如要移除個別磁碟區或磁碟區掛接,請使用 remove-volume 和 remove-volume-mount 旗標:
gcloud run worker-pools update WORKER_POOL \ --remove-volume VOLUME_NAME \ --container=container1 \ --remove-volume-mount MOUNT_PATH \ --container=container2 \ --remove-volume-mount MOUNT_PATH