本指南說明如何使用 Cloud Storage bucket 支援的 CSI 臨時磁碟區,自動管理 Google Kubernetes Engine (GKE) 上 Kubernetes Pod 或 Job 的儲存空間資源。CSI 暫時磁碟區會繫結至 Pod 或工作的生命週期,您不需要手動處理 PersistentVolume 和 PersistentVolumeClaim 物件。
本指南適用於平台管理員和營運人員,可協助他們簡化 GKE 應用程式的儲存空間管理作業。
閱讀本頁內容前,請務必熟悉 CSI 臨時磁碟區、Kubernetes Pod 和工作,以及 Cloud Storage bucket。
如果您已熟悉 PersistentVolume,且希望與現有部署作業保持一致,請參閱「將 Cloud Storage bucket 掛接為永久磁碟區」。
事前準備
請確認您已完成下列事前準備事項:
- 瞭解 Cloud Storage FUSE CSI 驅動程式的需求和限制。
- 建立 Cloud Storage bucket
- 啟用 Cloud Storage FUSE CSI 驅動程式
- 設定 Cloud Storage bucket 的存取權
Cloud Storage bucket 的 CSI 暫時性儲存空間運作方式
CSI 暫時磁碟區可簡化 GKE 應用程式的儲存空間管理作業。您可以在 Pod 或 Job 規格中直接定義 CSI 臨時磁碟區。使用 CSI 臨時磁碟區時,不需要個別的 PersistentVolume 和 PersistentVolumeClaim 物件。
使用 CSI 暫時性磁碟區時,需要執行下列作業:
儲存空間定義:您可以在 Pod 或 Job 的 YAML 檔案中指定儲存空間,包括要使用的 CSI 驅動程式和任何必要參數。如果是 Cloud Storage FUSE CSI 驅動程式,請指定 bucket 名稱和其他相關詳細資料。
您可以視需要使用檔案快取功能,微調 CSI 驅動程式的效能。檔案快取功能可將經常存取的 Cloud Storage 檔案快取到速度較快的磁碟,藉此提升 GKE 應用程式效能。
此外,您可以使用平行下載功能,加快從 Cloud Storage 讀取大型檔案的速度,進行多執行緒下載。您可以使用這項功能縮短模型載入時間,特別是讀取超過 1 GB 的檔案時。
驅動程式叫用:建立 Pod 或 Job 時,GKE 會偵測到暫時磁碟區要求,並呼叫 Cloud Storage FUSE CSI 驅動程式。
掛接及附加磁碟區:CSI 驅動程式會掛接 CSI 臨時磁碟區 (指向基礎 Cloud Storage bucket),並提供給 Pod 或工作,讓應用程式可以存取。如要微調檔案系統中 Bucket 的掛接方式,可以使用掛接選項。您也可以使用磁碟區屬性,設定 Cloud Storage FUSE CSI 驅動程式的特定行為。
生命週期管理:臨時磁碟區的生命週期與 Pod 或 Job 相同。刪除 Pod 或 Job 完成時,CSI 驅動程式會自動處理清除作業,並卸載磁碟區。
附加 CSI 暫時磁碟區
請根據您要將 CSI 暫時性磁碟區附加至 Pod 或 Job,按照下列操作說明操作。
Pod
如要在 Pod 中連接 CSI 暫時磁碟區,請按照下列步驟操作:
使用下列規格建立 Pod YAML 資訊清單:
apiVersion: v1 kind: Pod metadata: name: gcs-fuse-csi-example-ephemeral namespace: NAMESPACE annotations: gke-gcsfuse/volumes: "true" spec: terminationGracePeriodSeconds: 60 containers: - image: busybox name: busybox command: ["sleep"] args: ["infinity"] volumeMounts: - name: gcs-fuse-csi-ephemeral mountPath: /data readOnly: true serviceAccountName: KSA_NAME volumes: - name: gcs-fuse-csi-ephemeral csi: driver: gcsfuse.csi.storage.gke.io readOnly: true volumeAttributes: bucketName: BUCKET_NAME mountOptions: "implicit-dirs"替換下列值:
- NAMESPACE:要部署 Pod 的 Kubernetes 命名空間。
- KSA_NAME:設定 Cloud Storage bucket 存取權時指定的 Kubernetes ServiceAccount 名稱。
- BUCKET_NAME:設定 Cloud Storage bucket 存取權時指定的 Cloud Storage bucket 名稱。您可以指定底線 (
_),掛接 Kubernetes ServiceAccount 可存取的所有值區。詳情請參閱 Cloud Storage FUSE 說明文件的「動態掛接」一節。
資訊清單範例顯示了以下必要設定:
metadata.annotations:必須使用gke-gcsfuse/volumes: "true"註解。如要瞭解選用註解,請參閱「設定邊車容器」。spec.volumes[n].csi.driver:使用gcsfuse.csi.storage.gke.io做為 CSI 驅動程式名稱。
您也可以視需要調整下列變數:
spec.terminationGracePeriodSeconds:預設值為 30。如要將大型檔案寫入 Cloud Storage bucket,請提高這個值,確保 Cloud Storage FUSE 有足夠時間在應用程式結束後清除資料。詳情請參閱「Kubernetes 最佳做法:安全終止」。spec.volumes[n].csi.volumeAttributes.mountOptions:將掛接選項傳遞至 Cloud Storage FUSE。請在一個以半形逗號分隔的字串中指定旗標,不要加上空格。spec.volumes[n].csi.volumeAttributes:將其他磁碟區屬性傳遞至 Cloud Storage FUSE。spec.volumes[n].csi.readOnly:如果所有磁碟區掛接都是唯讀,請指定 true。spec.containers[n].volumeMounts[m].readOnly:如果只有特定磁碟區掛接為唯讀,請指定 true。
執行下列指令,將資訊清單套用至叢集:
kubectl apply -f FILE_PATH將 FILE_PATH 替換為 YAML 檔案的路徑。
Pod (檔案快取)
如要在 Pod 中附加 CSI 臨時磁碟區並啟用檔案快取,請按照下列步驟操作:
按照「建立叢集或節點集區,並採用本機 SSD 支援的臨時儲存空間」一文中的步驟,建立叢集或節點集區,並採用本機 SSD 支援的臨時儲存空間。
使用下列規格建立 Pod YAML 資訊清單:
apiVersion: v1 kind: Pod metadata: name: gcs-fuse-csi-file-cache-example namespace: NAMESPACE annotations: gke-gcsfuse/volumes: "true" gke-gcsfuse/ephemeral-storage-limit: "50Gi" spec: nodeSelector: cloud.google.com/gke-ephemeral-storage-local-ssd: "true" restartPolicy: Never initContainers: - name: data-loader image: gcr.io/google.com/cloudsdktool/google-cloud-cli:slim resources: limits: cpu: 500m memory: 1Gi requests: cpu: 500m memory: 1Gi command: - "/bin/sh" - "-c" - | mkdir -p /test_files for i in $(seq 1 1000); do dd if=/dev/zero of=/test_files/file_$i.txt bs=1024 count=64; done gcloud storage cp /test_files gs://BUCKET_NAME --recursive containers: - name: data-validator image: busybox resources: limits: cpu: 500m memory: 512Mi requests: cpu: 500m memory: 512Mi command: - "/bin/sh" - "-c" - | echo "first read with cache miss" time cat /data/test_files/file_* > /dev/null echo "second read from local cache" time cat /data/test_files/file_* > /dev/null volumeMounts: - name: gcs-fuse-csi-ephemeral mountPath: /data serviceAccountName: KSA_NAME volumes: - name: gcs-fuse-csi-ephemeral csi: driver: gcsfuse.csi.storage.gke.io volumeAttributes: bucketName: BUCKET_NAME mountOptions: "implicit-dirs,file-cache:max-size-mb:-1"替換下列值:
- NAMESPACE:要部署 Pod 的 Kubernetes 命名空間。
- KSA_NAME:您在設定 Cloud Storage bucket 存取權時指定的 Kubernetes ServiceAccount 名稱。
BUCKET_NAME:設定 Cloud Storage bucket 存取權時指定的 Cloud Storage bucket 名稱。您可以指定底線 (
_),掛接 Kubernetes ServiceAccount 可存取的所有值區。詳情請參閱 Cloud Storage FUSE 說明文件中的「動態掛接」。在範例資訊清單中,init container 資料載入器會產生 1,000 個大小為 64 KiB 的檔案,並將這些檔案上傳至 Cloud Storage bucket。主要容器
data-validator會從 bucket 讀取所有檔案兩次,並記錄時間長度。
執行下列指令,將資訊清單套用至叢集:
kubectl apply -f FILE_PATH將 FILE_PATH 替換為 YAML 檔案的路徑。
如要查看記錄輸出內容,請執行下列指令:
kubectl logs -n NAMESPACE gcs-fuse-csi-file-cache-example -c data-validator將 NAMESPACE 替換為工作負載的命名空間。
輸出內容應如下所示:
first read with cache miss real 0m 54.68s ... second read from local cache real 0m 0.38s ...輸出內容顯示,使用本機快取的第二次讀取速度,比快取失敗的第一次讀取快得多。
Pod (平行下載)
如要在 Pod 中附加 CSI 臨時磁碟區並行下載,請按照下列步驟操作:
使用下列規格建立 Pod YAML 資訊清單:
apiVersion: v1 kind: Pod metadata: name: gcs-fuse-csi-example-ephemeral namespace: NAMESPACE annotations: gke-gcsfuse/volumes: "true" gke-gcsfuse/ephemeral-storage-limit: "50Gi" spec: containers: ... volumes: - name: gcs-fuse-csi-ephemeral csi: driver: gcsfuse.csi.storage.gke.io volumeAttributes: bucketName: BUCKET_NAME mountOptions: "implicit-dirs,file-cache:enable-parallel-downloads:true,file-cache:max-size-mb:-1" fileCacheCapacity: "-1"替換下列值:
- NAMESPACE:要部署 Pod 的 Kubernetes 命名空間。
- BUCKET_NAME:設定 Cloud Storage bucket 存取權時指定的 Cloud Storage bucket 名稱。您可以指定底線 (
_),掛接 Kubernetes ServiceAccount 可存取的所有 bucket。詳情請參閱 Cloud Storage FUSE 說明文件的「動態掛接」一節。
執行下列指令,將資訊清單套用至叢集:
kubectl apply -f FILE_PATH將 FILE_PATH 替換為 YAML 檔案的路徑。
工作
如要在 Job 中附加 CSI 臨時磁碟區,請按照下列步驟操作:
使用下列規格建立 Job YAML 資訊清單:
apiVersion: batch/v1 kind: Job metadata: name: gcs-fuse-csi-job-example namespace: NAMESPACE spec: template: metadata: annotations: gke-gcsfuse/volumes: "true" spec: serviceAccountName: KSA_NAME containers: - name: writer image: busybox command: - "/bin/sh" - "-c" - touch /data/test && echo $(date) >> /data/test && sleep 10 volumeMounts: - name: gcs-fuse-csi-ephemeral mountPath: /data - name: reader image: busybox command: - "/bin/sh" - "-c" - sleep 10 && cat /data/test volumeMounts: - name: gcs-fuse-csi-ephemeral mountPath: /data readOnly: true volumes: - name: gcs-fuse-csi-ephemeral csi: driver: gcsfuse.csi.storage.gke.io volumeAttributes: bucketName: BUCKET_NAME restartPolicy: Never backoffLimit: 1替換下列值:
- NAMESPACE:部署 Pod 的 Kubernetes 命名空間。
- KSA_NAME:您在設定 Cloud Storage bucket 存取權時指定的 Kubernetes ServiceAccount 名稱。
- BUCKET_NAME:設定 Cloud Storage bucket 存取權時指定的 Cloud Storage bucket 名稱。您可以指定底線 (
_),掛接 Kubernetes ServiceAccount 可存取的所有 bucket。詳情請參閱 Cloud Storage FUSE 說明文件中的「動態掛接」。
以下是資訊清單範例,顯示這些必要設定:
metadata.annotations:必須提供註解gke-gcsfuse/volumes: "true"。如要瞭解選用註解,請參閱「設定邊車容器」。spec.volumes[n].csi.driver:使用gcsfuse.csi.storage.gke.io做為 CSI 驅動程式名稱。
您也可以視需要調整下列變數:
執行下列指令,將資訊清單套用至叢集:
kubectl apply -f FILE_PATH將
FILE_PATH替換為 YAML 檔案的路徑。
使用不同的 CSI 臨時磁碟區掛接同一個 Cloud Storage bucket
您也可以使用多個 CSI 臨時磁碟區,這些磁碟區由同一個 Cloud Storage bucket 提供支援。方法是附加兩個以上的磁碟區,並在不同的掛接路徑參照相同的 bucket 名稱。舉例來說,您可以將具有不同掛接選項的不同 CSI 臨時磁碟區掛接至同一個 Pod,而每個臨時磁碟區都參照同一個 Cloud Storage bucket。以下是使用這項功能的 Pod 資訊清單範例:
apiVersion: batch/v1
kind: Job
metadata:
name: gcs-fuse-csi-job-example
namespace: NAMESPACE
spec:
template:
metadata:
annotations:
gke-gcsfuse/volumes: "true"
spec:
serviceAccountName: KSA_NAME
containers:
- name: writer
image: busybox
command:
- "/bin/sh"
- "-c"
- touch /data/test && echo $(date) >> /data/test && sleep 10
volumeMounts:
- name: gcs-fuse-csi-ephemeral
mountPath: /data
volumeMounts:
- name: gcs-fuse-csi-ephemeral-with-mo
mountPath: /data2
volumes:
- name: gcs-fuse-csi-ephemeral
csi:
driver: gcsfuse.csi.storage.gke.io
volumeAttributes:
bucketName: BUCKET_NAME
- name: gcs-fuse-csi-ephemeral-with-mo
csi:
driver: gcsfuse.csi.storage.gke.io
volumeAttributes:
bucketName: BUCKET_NAME
mountOptions: "implicit-dirs"
restartPolicy: Never
backoffLimit: 1
排解問題
如要進一步瞭解如何排解 Cloud Storage FUSE CSI 驅動程式問題,請參閱 GitHub 專案說明文件中的疑難排解指南。