為 Cloud Run 服務設定 Cloud Storage 磁碟區掛載

本頁面說明如何使用 Cloud Run 磁碟區掛接,將 Cloud Storage bucket 掛接為儲存空間磁碟區。

在 Cloud Run 中將 bucket 掛接為磁碟區,會將 bucket 內容呈現為容器檔案系統中的檔案。將 bucket 掛接為磁碟區後,您就能像存取本機檔案系統中的目錄一樣存取 bucket,並使用程式設計語言的檔案系統作業和程式庫,而非 Google API 用戶端程式庫。

您可以將磁碟區掛接為唯讀,也可以為磁碟區指定掛接選項。

記憶體需求

Cloud Storage 磁碟區掛接會使用 Cloud Run 容器記憶體執行下列活動:

  • Cloud Run 預設會使用 stat 快取設定,存留時間 (TTL) 為 60 秒,適用於所有 Cloud Storage FUSE 快取。統計資料快取的大小上限預設為 32 MB,類型快取的大小上限預設為 4 MiB。

  • 從 Cloud Storage 讀取資料時,Cloud Storage FUSE 會發出 API 呼叫,直接讀取物件,不會將整個檔案下載至本機目錄。Cloud Storage FUSE 會建立 TCP 連線,並讀回整個 Cloud Storage 物件,或只讀取您在應用程式或作業系統中透過偏移量指定的檔案部分。讀取時,Cloud Storage FUSE 也會耗用 stat 和類型快取以外的記憶體,例如讀取的每個檔案和 goroutines 都有 1 MiB 陣列。

  • 寫入 Cloud Storage 時,Cloud Storage FUSE 預設支援 streaming-writes (寫入路徑)。Cloud Storage FUSE 會直接將資料上傳至 Cloud Storage,不需完整暫存檔案。每個開啟用於串流寫入的檔案,在上傳過程中會耗用約 64 MiB 的記憶體。這可縮短延遲時間並減少磁碟空間用量,特別適合用於大型序列寫入作業。

限制

Cloud Run 會使用 Cloud Storage FUSE 掛接這個磁碟區,因此將 Cloud Storage bucket 掛接為磁碟區時,請注意下列事項:

  • Cloud Storage FUSE 不會對同一檔案的多個寫入作業提供並行控制 (檔案鎖定)。如果有多個寫入作業嘗試取代檔案,系統會以最後一個寫入作業為準,並遺失所有先前的寫入作業。
  • Cloud Storage FUSE 並非完全符合 POSIX 標準的檔案系統。詳情請參閱 Cloud Storage FUSE 說明文件。

禁止的路徑

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

事前準備

您需要 Cloud Storage bucket,才能掛接為磁碟區。

如要提升 Cloud Storage 的讀取/寫入效能,請參閱「最佳化 Cloud Storage FUSE 網路頻寬效能」。

必要的角色

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

如要取得服務身分所需的權限,以便存取檔案和 Cloud Storage bucket,請要求管理員授予服務身分 Storage 物件檢視者 (roles/storage.objectViewer) 角色。如果服務身分也需要在 bucket 中執行寫入作業,請改為授予 Storage 物件使用者 (roles/storage.objectUser) 角色。

如要進一步瞭解 Cloud Storage 角色和權限,請參閱「Cloud Storage 的 IAM」。

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

掛接 Cloud Storage 磁碟區

您可以在不同的掛接路徑掛接多個 bucket。您也可以使用相同或不同的掛接路徑,將磁碟區掛接至多個容器。

如果您使用多個容器,請先指定磁碟區,然後再指定每個容器的磁碟區掛接。

磁碟區掛接需要第二代執行環境。如果未明確設定執行環境,Cloud Run 會自動為服務選取第二代執行環境。

控制台

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

    前往 Cloud Run。

  2. 從 Cloud Run 導覽選單中選取「Services」(服務):

    1. 如要設定新服務,請按一下「Deploy container」(部署容器),然後填寫初始服務設定頁面。接著,按一下「Containers, Networking, Security」(容器、網路、安全性) 展開服務設定頁面,然後點選「Volumes」(磁碟區)。

    2. 如要設定現有服務,請按一下該服務,然後按一下「Containers」(容器) 分頁標籤。

  3. 按一下「Mount volume」。

  4. 選取「Cloud Storage bucket」做為磁碟區類型。

  5. 在「Mount path」(掛接路徑) 欄位中,輸入要掛接磁碟區的路徑。

  6. 瀏覽並選取要用於磁碟區的 Cloud Storage bucket 或特定目錄。(選用) 建立新的 bucket。

  7. 如要將 bucket 設為唯讀,請勾選「Read-only」(唯讀) 核取方塊。

  8. (選用) 展開「Mount options」(掛接選項),指定掛接選項。

  9. 按一下 [儲存]。

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

gcloud

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

    gcloud run deploy SERVICE \
      --image IMAGE_URL \
      --add-volume mount-path=MOUNT_PATH,type=cloud-storage,bucket=BUCKET_NAME,readonly=READ_ONLY

    更改下列內容:

    • SERVICE:服務名稱。
    • IMAGE_URL:容器映像檔的參照,例如 us-docker.pkg.dev/cloudrun/container/hello:latest。如果使用 Artifact Registry,則必須預先建立存放區 REPO_NAME。網址格式為 LOCATION-docker.pkg.dev/PROJECT_ID/REPO_NAME/PATH:TAG
    • MOUNT_PATH:掛接磁碟區的相對路徑,例如 /mnt/my-volume。
    • BUCKET_NAME:Cloud Storage bucket 的名稱。
    • READ_ONLY:true 可將磁碟區設為唯讀,false 則可允許寫入。
  • 如果您使用多個容器,請先指定磁碟區,然後指定每個容器的磁碟區掛接:

    gcloud run services update SERVICE \
      --add-volume name=VOLUME_NAME,type=cloud-storage,bucket=BUCKET_NAME \
      --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 services describe SERVICE --format export > service.yaml
  2. 視需要更新。

    apiVersion: serving.knative.dev/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
            csi:
              driver: gcsfuse.run.googleapis.com
              readOnly: IS_READ_ONLY
              volumeAttributes:
                bucketName: BUCKET_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。
    • MOUNT_PATH:掛接磁碟區的相對路徑,例如 /mnt/my-volume。
    • VOLUME_NAME:磁碟區名稱,可任意命名。VOLUME_NAME 值用於將磁碟區對應至磁碟區掛接。
    • IS_READ_ONLY:True 會將磁碟區設為唯讀,False 則允許寫入。
    • BUCKET_NAME:Cloud Storage bucket 的名稱。
  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"

    template {
      containers {
        image = "IMAGE_URL"
        volume_mounts {
          name = "VOLUME_NAME"
          mount_path = "MOUNT_PATH"
        }
      }

      volumes {
        name = "VOLUME_NAME"
        gcs {
          bucket = google_storage_bucket.default.name
          read_only = IS_READ_ONLY
        }
      }
    }
  }

  resource "google_storage_bucket" "default" {
    name     = "BUCKET_NAME"
    location = "REGION"
  }

更改下列內容:

  • SERVICE:Cloud Run 服務的名稱。
  • 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:磁碟區名稱,可任意命名。VOLUME_NAME 值用於將磁碟區對應至磁碟區掛接。
  • MOUNT_PATH:掛接磁碟區的相對路徑,例如 /mnt/my-volume。
  • IS_READ_ONLY:True 會將磁碟區設為唯讀,False 則允許寫入。
  • BUCKET_NAME:Cloud Storage bucket 的名稱。

撰寫

如要在 compose.yaml 檔案中指定磁碟區掛接,請在服務定義中新增 volumes 屬性。頂層 volumes 或 configs 會對應至 Cloud Storage bucket。

  services:
    web:
      image: IMAGE
      volumes:
        - VOLUME_NAME:MOUNT_PATH
  volumes:
    VOLUME_NAME:

更改下列內容:

  • IMAGE:容器映像檔的網址。
  • VOLUME_NAME:磁碟區名稱。
  • MOUNT_PATH:要掛接磁碟區的路徑。

部署服務

  1. 如要部署服務,請執行 gcloud run compose up 指令:

    gcloud run compose up compose.yaml
  2. 請按照提示y安裝必要元件或啟用 API。

  3. 選用:如要允許未經驗證的使用者存取服務,請公開服務。

部署完成後,系統會顯示 Cloud Run 服務網址。複製這個網址並貼到瀏覽器,即可查看執行中的容器。您可以在 Google Cloud 控制台停用預設驗證。

讀取及寫入磁碟區

如果您使用 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");

使用掛接選項設定磁碟區

您可以視需要使用掛接選項,設定磁碟區掛接項目的各種屬性。您可以使用可用的掛接選項,設定快取、掛接特定目錄、啟用偵錯記錄檔等行為。

指定掛接選項

您可以使用 Google Cloud 控制台、Google Cloud CLI、YAML 或 Terraform 指定掛接選項。在 Google Cloud CLI 中,掛接選項以分號 (;) 分隔,在 YAML 中則以半形逗號分隔,如下列分頁所示:

控制台

如要為現有磁碟區指定掛接選項,請按照下列步驟操作:

  1. 前往 Google Cloud 控制台的 Cloud Run「Services」(服務) 頁面:

    前往 Cloud Run。

  2. 按一下服務,開啟服務詳細資料頁面。

  3. 按一下「容器」分頁標籤。

    1. 找出要編輯的磁碟區,然後按一下旁邊的「編輯」圖示。
    2. 展開「Mount options」(掛接選項)。
    3. 更新適當欄位或手動新增掛接選項,即可設定掛接選項。
    4. 按一下 [儲存]。
  4. 依序點選「查看差異並重新部署」和「部署變更」。

gcloud

如要新增磁碟區並使用掛接選項掛接:

  gcloud run deploy SERVICE \
      --image IMAGE_URL \
      --add-volume mount-path=MOUNT_PATH,type=cloud-storage,bucket=BUCKET_NAME,readonly=READ_ONLY,mount-options="OPTION_1=VALUE_1;OPTION_N=VALUE_N"

更改下列內容:

  • SERVICE:服務名稱。
  • IMAGE_URL:容器映像檔的參照,例如 us-docker.pkg.dev/cloudrun/container/hello:latest。如果使用 Artifact Registry,則必須預先建立存放區 REPO_NAME。網址格式為 LOCATION-docker.pkg.dev/PROJECT_ID/REPO_NAME/PATH:TAG
  • MOUNT_PATH:掛接磁碟區的相對路徑,例如 /cache。
  • BUCKET_NAME:Cloud Storage bucket 的名稱。
  • READ_ONLY:true 可將磁碟區設為唯讀,false 則可允許寫入。
  • OPTION_1:第一個掛接選項。請注意,您可以視需要指定多個掛接選項,每個掛接選項和值組合之間以分號分隔。
  • VALUE_1:第一個掛接選項的設定。
  • OPTION_N:下一個掛接選項。
  • VALUE_N:下一個掛接選項的設定。

YAML

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

    gcloud run services describe SERVICE --format export > service.yaml
  2. 視需要更新。

    apiVersion: serving.knative.dev/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
            csi:
              driver: gcsfuse.run.googleapis.com
              readOnly: IS_READ_ONLY
              volumeAttributes:
                bucketName: BUCKET_NAME
                mountOptions: OPTION_1=VALUE_1,OPTION_N=VALUE_N

    更改下列內容:

    • IMAGE_URL:容器映像檔的參照,例如 us-docker.pkg.dev/cloudrun/container/hello:latest。如果使用 Artifact Registry,則必須預先建立存放區 REPO_NAME。網址格式為 LOCATION-docker.pkg.dev/PROJECT_ID/REPO_NAME/PATH:TAG
    • MOUNT_PATH:掛接磁碟區的相對路徑,例如 /cache。
    • VOLUME_NAME:磁碟區名稱,可任意命名。VOLUME_NAME 值用於將磁碟區對應至磁碟區掛接。
    • IS_READ_ONLY:True 可將磁碟區設為唯讀,False 則可允許寫入。
    • BUCKET_NAME:Cloud Storage bucket 的名稱。
    • OPTION_1:第一個掛接選項。請注意,您可以視需要指定多個掛接選項,每個掛接選項和值組合之間以半形逗號分隔。
    • VALUE_1:第一個掛接選項的設定。
    • OPTION_N:下一個掛接選項。
    • VALUE_N:下一個掛接選項的設定。
  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"

    template {
      containers {
        image = "IMAGE_URL"
        volume_mounts {
          name = "VOLUME_NAME"
          mount_path = "MOUNT_PATH"
        }
      }

      volumes {
        name = "VOLUME_NAME"
        gcs {
            bucket = google_storage_bucket.default.name
            read_only = IS_READ_ONLY
            mount_options = ["OPTION_1=VALUE_1", "OPTION_N=VALUE_N", "OPTION_O"]
        }
      }
    }
  }

更改下列內容:

  • SERVICE:Cloud Run 服務的名稱。
  • REGION: Google Cloud 區域。
  • IMAGE_URL:參照含有 worker 集區的容器映像檔,例如 us-docker.pkg.dev/cloudrun/container/worker-pool:latest
  • VOLUME_NAME:磁碟區名稱,可任意命名。VOLUME_NAME 值用於將磁碟區對應至磁碟區掛接。
  • MOUNT_PATH:掛接磁碟區的相對路徑,例如 /mnt/my-volume。
  • IS_READ_ONLY:True 會將磁碟區設為唯讀,False 則允許寫入。
  • BUCKET_NAME:Cloud Storage bucket 的名稱。
  • OPTION_1:第一個掛接選項。請注意,您可以視需要指定多個掛接選項,每個掛接選項和值組合之間以半形逗號分隔。
  • VALUE_1:第一個掛接選項的設定。
  • OPTION_N:第二個掛接選項 (如適用)。
  • VALUE_N:第二個掛接選項的設定。
  • OPTION_O:第三個掛接選項 (如適用)。部分掛接選項沒有值。

常用掛接選項

掛接選項通常用於:

  • 設定快取
  • 僅掛接 Cloud Storage bucket 中的特定目錄
  • 設定磁碟區的擁有權 (uid、gid)
  • 停用隱性目錄
  • 指定偵錯記錄層級。

調整快取設定

您可以設定與快取相關的掛接選項,變更磁碟區的快取設定。下表列出設定和預設 Cloud Run 值:

快取設定 說明 預設
cache-dir 記憶體內磁碟區名稱,用於做為基礎目錄,以 cr-volume:{volume name} 格式保留 Cloud Storage bucket 中的檔案。舉例來說,如果您有名為 in-memory-1 的記憶體內磁碟區,並想將其做為快取目錄,請指定 cr-volume:in-memory-1。如要瞭解如何設定記憶體內磁碟區,請參閱「設定服務的記憶體內磁碟區掛接」。啟用這些功能後,Cloud Run 會變更 Cloud Storage FUSE 程序的資源計算方式,並將其計入容器記憶體限制。如要提高容器記憶體限制,請參閱「設定服務的記憶體限制」。
file-cache-download-chunk-size-mb 指定每個 goroutine 將物件下載至檔案快取時,向 Cloud Storage 提出的各項讀取要求大小 (以 MiB 為單位)。 200
file-cache-enable-parallel-downloads 將檔案快取目錄做為預先擷取緩衝區,並使用多個 worker 同時下載檔案的多個部分,加快大型檔案的讀取速度。 true
file-cache-max-parallel-downloads 在所有檔案下載工作中,任何時間點可產生的 goroutine 數量上限。 機器 CPU 核心數量的兩倍或 16,以較高者為準。
file-cache-parallel-downloads-per-file 每個檔案的並行下載要求數量。 16
file-cache-cache-file-for-range-read 決定是否要在從非零偏移量完成第一次讀取時,以非同步方式下載完整物件,並儲存在 Cloud Storage FUSE 快取目錄中。 false
stat-cache-max-size-mb 統計資料快取可使用的最大大小 (以 MiB 為單位)。統計資料快取一律會完整保留在記憶體中,因此會影響記憶體用量。如果工作負載最多包含 20,000 個檔案,請指定 32 值。如果工作負載使用的檔案超過 20,000 個,每增加 6,000 個檔案,請將大小增加 10,其中統計資料快取平均每個檔案使用 1,500 個位元組。

如要讓統計資料快取視需要使用記憶體,請指定 -1 值。如要停用統計資料快取,請將值指定為 0。
32
type-cache-max-size-mb 類型快取可使用的每個目錄大小上限 (以 MiB 為單位)。類型快取一律會完整保留在記憶體中,因此會影響記憶體用量。

如果掛接的 bucket 中,單一目錄最多包含 20,000 個檔案,請指定 4 值。如果掛接的單一目錄中最多包含超過 20,000 個檔案,請每 5,000 個檔案將值增加 1,平均每個檔案約 200 個位元組。

如要讓類型快取使用所需記憶體,請指定 -1 值。

如要停用類型快取,請指定 0 值。
4

下列 Google Cloud CLI 指令會將 metadata-cache-ttl-secs 設為 120 秒,並將統計資料和類型快取容量分別增加至 52 和 7 MiB:

gcloud run services update SERVICE \
    --add-volume mount-path=MOUNT_PATH,type=cloud-storage,bucket=BUCKET_NAME,mount-options="metadata-cache-ttl-secs=120;stat-cache-max-size-mb=52;type-cache-max-size-mb=7"
    

更改下列內容:

  • SERVICE:服務名稱。
  • BUCKET_NAME:Cloud Storage bucket 的名稱。
  • MOUNT_PATH:掛接磁碟區的相對路徑,例如 /cache。

啟用偵錯記錄檔

根據預設,Cloud Storage FUSE 會記錄嚴重性為 Info 以上的事件。您可以使用下列任一記錄嚴重性層級 (由低到高排列) 變更記錄設定:

  • trace
  • debug
  • info
  • warning
  • error
  • 如要關閉所有記錄功能,請指定 off 值。

指定嚴重性等級後,Cloud Storage FUSE 會針對嚴重性等級等於或高於指定等級的事件產生記錄。舉例來說,如果您指定 warning 層級,Cloud Storage FUSE 會產生警告和錯誤記錄。

如果將記錄檔嚴重性設為高於 info 的層級,可能會影響效能並產生大量記錄資料,因此建議您只在必要時才這麼做。為與 Cloud Logging 相容,記錄格式為 text 格式,不支援 json 格式。

下列指令列會啟用偵錯記錄檔:

gcloud run services update SERVICE \
    --add-volume mount-path=MOUNT_PATH,type=cloud-storage,bucket=BUCKET_NAME,mount-options="log-severity=debug"

更改下列內容:

  • SERVICE:服務名稱。
  • BUCKET_NAME:Cloud Storage bucket 的名稱。
  • MOUNT_PATH:掛接磁碟區的相對路徑,例如 /cache。

停用隱性目錄

為使 Cloud Storage 更像標準檔案系統,Cloud Run 預設會在掛接 Cloud Storage bucket 時啟用隱含目錄。您可以使用 implicit-dirs 掛接選項關閉隱含目錄。如果停用隱性目錄,效能和成本效益都會提高,但可能無法兼顧相容性。

隱含目錄功能可讓 Cloud Run 辨識現有的 Cloud Storage 檔案,這些檔案的名稱會模擬目錄結構,例如 /mydir/myfile.txt。如果停用隱含目錄,Cloud Run 就無法列出或讀取這類檔案。

關閉隱含目錄可減少傳送至 Cloud Storage 的要求數量,進而提升應用程式效能並降低成本。詳情請參閱 Cloud Storage FUSE 檔案和目錄說明文件。

下列指令列會停用隱含目錄:

gcloud run services update SERVICE \
    --add-volume mount-path=MOUNT_PATH,type=cloud-storage,bucket=BUCKET_NAME,mount-options="implicit-dirs=false"

更改下列內容:

  • SERVICE:服務名稱。
  • BUCKET_NAME:Cloud Storage bucket 的名稱。
  • MOUNT_PATH:掛接磁碟區的相對路徑,例如 /cache。

掛接 Cloud Storage bucket 中的特定目錄

根據預設,Cloud Run 會掛接整個 Cloud Storage bucket,讓 Cloud Run 服務存取所有內容。在某些情況下,您可能只想掛接特定目錄。舉例來說,如果 bucket 包含大量檔案,掛接特定目錄可以提升效能。

您也可以基於隔離目的實作這項功能,讓不同服務存取 Storage bucket 中的不同目錄。

下列指令列會指定要掛接的目錄:

gcloud run services update SERVICE \
    --add-volume mount-path=MOUNT_PATH,type=cloud-storage,bucket=BUCKET_NAME,mount-options="only-dir=images"

更改下列內容:

  • SERVICE:服務名稱。
  • BUCKET_NAME:Cloud Storage bucket 的名稱。
  • MOUNT_PATH:掛接磁碟區的相對路徑,例如 /cache。

設定音量 UID 和 GID

使用 uid 和 gid 掛接選項,變更磁碟區的使用者 ID 和群組 ID。如果您想將檔案擁有權設給特定使用者或群組,且該使用者或群組與一或多個執行中容器的身分相符,這個選項就非常實用。根據預設,磁碟區由 root 擁有。

下列指令列會設定 uid 和 gid:

gcloud run services update SERVICE \
    --add-volume mount-path=MOUNT_PATH,type=cloud-storage,bucket=BUCKET_NAME,mount-options="uid=UID;gid=GID"

更改下列內容:

  • SERVICE:服務名稱。
  • MOUNT_PATH:掛接磁碟區的相對路徑,例如 /cache。
  • BUCKET_NAME:Cloud Storage bucket 的名稱。
  • UID:要掛接為磁碟區的使用者 ID。
  • GID:要掛接為磁碟區的群組 ID。

設定其他掛接選項

以下是 Cloud Run 支援的所有掛接選項完整清單。

目錄

  • implicit-dirs
  • only-dir
  • rename-dir-limit

偵錯

  • debug_fuse_errors
  • debug_fuse
  • debug_gcs
  • debug-invariants
  • debug_mutex

快取

  • stat-cache-capacity
  • stat-cache-ttl
  • type-cache-ttl
  • enable-nonexistent-type-cache

權限

  • uid
  • gid
  • file-mode
  • dir-mode

其他

  • billing-project
  • client-protocol
  • experimental-enable-json-read
  • experimental-opentelemetry-collector-address
  • http-client-timeout
  • limit-bytes-per-sec
  • limit-ops-per-sec
  • max-conns-per-host
  • max-idle-conns-per-host
  • max-retry-sleep
  • -o
  • retry-multiplier
  • sequential-read-size-mb
  • stackdriver-export-interval

如要進一步瞭解這些選項,請參閱「Cloud Storage FUSE 指令列掛接選項」。Cloud Storage FUSE 頁面會列出所有可用的 FUSE 選項,其中部分選項不適用於 Cloud Run。

查看磁碟區掛接設定

控制台

  1. 前往 Google Cloud 控制台的 Cloud Run「Services」(服務) 頁面:

    前往 Cloud Run。

  2. 在服務清單中,按一下您感興趣的服務,開啟服務詳細資料頁面。

  3. 按一下「Containers」(容器) 分頁標籤,查看磁碟區詳細資料。

gcloud

  1. 如要查看磁碟區掛接設定,請執行下列指令:

    gcloud run services describe SERVICE_NAME
  2. 在傳回的輸出內容中,找出「Volume mounts」(磁碟區掛接) 設定。

最佳化 Cloud Storage FUSE 網路頻寬效能

如要提升讀寫效能,請使用直連虛擬私有雲,將 Cloud Run 服務連至虛擬私有雲網路,並透過虛擬私有雲網路轉送所有傳出流量。你可以透過下列任一選項執行這項操作:

容器啟動時間和 Cloud Storage FUSE 掛接

使用 Cloud Storage FUSE 可能會稍微增加 Cloud Run 容器的冷啟動時間,因為 Cloud Run 會在啟動容器前先啟動磁碟區掛接。只有在 Cloud Storage FUSE 成功掛接時,容器才會啟動。

請注意,Cloud Storage FUSE 必須先與 Cloud Storage 建立連線,才能成功掛接磁碟區。任何網路延遲都可能影響容器啟動時間。同樣地,如果連線嘗試失敗,Cloud Storage FUSE 就無法掛接,Cloud Run 服務也無法啟動。此外,如果 Cloud Storage FUSE 掛接時間超過 30 秒,Cloud Run 服務將無法啟動,因為 Cloud Run 執行所有掛接作業的總逾時時間為 30 秒。

Cloud Storage FUSE 效能特性

如果您定義兩個磁碟區,且每個磁碟區都指向不同的 bucket,系統會啟動兩個 Cloud Storage FUSE 程序。掛接和程序會同時進行

Cloud Storage FUSE 會使用 Cloud Storage API 與 Cloud Storage 通訊,因此使用 Cloud Storage FUSE 的作業會受到網路頻寬影響。如果網路頻寬偏低,某些作業 (例如列出 bucket 內容) 可能會變慢。同樣地,讀取大型檔案也可能需要一些時間,因為這也受限於網路頻寬。

寫入 bucket 時,Cloud Storage FUSE 會在記憶體中完整暫存物件。這表示寫入大型檔案時,會受限於容器執行個體可用的記憶體量 (容器記憶體上限為 32 GiB)。

只有在執行 close 或 fsync 時,寫入作業才會排清至 bucket,然後將完整物件上傳至 bucket。只有在檔案大小為 2 MiB 以上且含有附加內容時,才不必將物件完整重新上傳至 bucket。

詳情請參閱下列資源:

清除及移除磁碟區和磁碟區掛接

您可以清除所有磁碟區和掛接點,也可以移除個別磁碟區和磁碟區掛接點。

清除所有磁碟區和磁碟區掛接

如要清除單一容器服務中的所有磁碟區和磁碟區掛接,請執行下列指令:

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