為 GKE 設定 Cloud Storage FUSE CSI 驅動程式

本文說明如何設定 Cloud Storage FUSE CSI 驅動程式,以便從 Google Kubernetes Engine (GKE) 存取 Cloud Storage bucket。

有了 Cloud Storage FUSE CSI 驅動程式,GKE 工作負載就能將 Cloud Storage bucket 當做本機檔案系統存取。CSI 驅動程式可將 Cloud Storage 與 GKE 整合,簡化容器化應用程式與儲存在 bucket 中的大型資料集互動的方式。CSI 驅動程式提供 GKE 儲存空間的標準介面。本文將說明如何準備環境,並使用 Cloud Storage FUSE CSI 驅動程式,將 GKE 叢集連線至 Cloud Storage bucket。

本文適用對象為開發人員、管理員和儲存空間專家,說明如何將 GKE 工作負載與物件儲存庫整合。如要進一步瞭解 Google Cloud 內容中提及的常見角色和工作範例,請參閱「常見的 GKE 使用者角色和工作」。

建立 Cloud Storage bucket

如果尚未建立 Cloud Storage bucket,請先建立 bucket。 您會將這些 bucket 掛接為 GKE 叢集中的磁碟區。為提升效能,請將「位置類型」設為「區域」,並選取與 GKE 叢集相符的區域。

啟用 Cloud Storage FUSE CSI 驅動程式

請按照下列步驟操作,具體做法取決於您使用的是 GKE Autopilot 或 Standard 叢集。建議使用 Autopilot 叢集,享受全代管的 Kubernetes 體驗。如要選擇最適合工作負載的模式,請參閱「選擇 GKE 作業模式」。

Autopilot

Autopilot 叢集預設會啟用 Cloud Storage FUSE CSI 驅動程式。您可以跳到「設定 Cloud Storage bucket 的存取權」一節。

標準

如果 Standard 叢集已啟用 Cloud Storage FUSE CSI 驅動程式,請跳至「設定 Cloud Storage bucket 的存取權」。

Standard 叢集預設不會啟用 Cloud Storage FUSE CSI 驅動程式。如要建立已啟用 Cloud Storage FUSE CSI 驅動程式的標準叢集,可以使用 gcloud container clusters create 指令:

gcloud container clusters create CLUSTER_NAME \
    --addons GcsFuseCsiDriver \
    --cluster-version=VERSION \
    --location=LOCATION \
    --workload-pool=PROJECT_ID.svc.id.goog

更改下列內容:

  • CLUSTER_NAME:叢集名稱。
  • VERSION:GKE 版本號碼。 必須選取 1.24 以上版本。
  • LOCATION:叢集的 Compute Engine 區域或可用區。
  • PROJECT_ID:您的專案 ID。

如要在現有標準叢集上啟用驅動程式,請使用 gcloud container clusters update 指令:

gcloud container clusters update CLUSTER_NAME \
    --update-addons GcsFuseCsiDriver=ENABLED \
    --location=LOCATION

如要確認叢集是否已啟用 Cloud Storage FUSE CSI 驅動程式,請執行下列指令:

gcloud container clusters describe CLUSTER_NAME \
    --location=LOCATION \
    --project=PROJECT_ID \
    --format="value(addonsConfig.gcsFuseCsiDriverConfig.enabled)"

設定 Cloud Storage bucket 的存取權

Cloud Storage FUSE CSI 驅動程式使用 Workload Identity Federation for GKE,因此您可以設定精細權限,控管 GKE Pod 如何存取儲存在 Cloud Storage 中的資料。

如要讓 GKE 叢集存取 Cloud Storage bucket,請使用 Workload Identity Federation for GKE 進行驗證,並在 Pod 規格中掛接 Cloud Storage bucket:

  1. 如果尚未啟用 GKE 適用的工作負載身分聯盟,請按照這些步驟啟用。如要使用現有節點集區,請在叢集上啟用 GKE 適用的工作負載身分聯盟後,手動在節點集區上啟用 GKE 適用的工作負載身分聯盟。
  2. 取得叢集憑證:

    gcloud container clusters get-credentials CLUSTER_NAME \
        --location=LOCATION
    

    更改下列內容:

  3. 建立要用於 Kubernetes ServiceAccount 的命名空間。您也可以使用 default 命名空間或任何現有命名空間。

    kubectl create namespace NAMESPACE
    

    將 NAMESPACE 替換為 Kubernetes ServiceAccount 的 Kubernetes 命名空間名稱。

  4. 為應用程式建立要使用的 Kubernetes ServiceAccount。您也可以在任何命名空間中使用任何現有的 Kubernetes ServiceAccount,包括 default Kubernetes ServiceAccount。

    kubectl create serviceaccount KSA_NAME \
        --namespace NAMESPACE
    

    將 KSA_NAME 替換為 Kubernetes ServiceAccount 的名稱。

  5. 將其中一個 Cloud Storage 的 IAM 角色授予 Kubernetes ServiceAccount。請按照下列步驟操作,視您是要授予 Kubernetes ServiceAccount 存取特定 Cloud Storage bucket 的權限,還是授予專案中所有 bucket 的全域存取權而定。

    特定 bucket 存取權

    gcloud storage buckets add-iam-policy-binding gs://BUCKET_NAME \
        --member "principal://iam.googleapis.com/projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/PROJECT_ID.svc.id.goog/subject/ns/NAMESPACE/sa/KSA_NAME" \
        --role "ROLE_NAME"
    

    更改下列內容:

    • BUCKET_NAME:Cloud Storage bucket 名稱。
    • PROJECT_NUMBER:GKE 叢集的專案編號。如要找出專案編號,請參閱「識別專案」。
    • PROJECT_ID:GKE 叢集的專案 ID。
    • NAMESPACE:Kubernetes ServiceAccount 的 Kubernetes 命名空間名稱。
    • KSA_NAME:新 Kubernetes ServiceAccount 的名稱。
    • ROLE_NAME:要指派給 Kubernetes ServiceAccount 的 IAM 角色。
      • 如果是唯讀工作負載,請使用 Storage 物件檢視者角色 (roles/storage.objectViewer)。
      • 如果是讀寫工作負載,請使用「Storage 物件使用者」角色 (roles/storage.objectUser)。

    全域 bucket 存取權

    gcloud projects add-iam-policy-binding GCS_PROJECT \
        --member "principal://iam.googleapis.com/projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/PROJECT_ID.svc.id.goog/subject/ns/NAMESPACE/sa/KSA_NAME" \
        --role "ROLE_NAME"
    

    更改下列內容:

    • GCS_PROJECT:Cloud Storage bucket 的專案 ID。
    • PROJECT_NUMBER:GKE 叢集的專案編號。如要找出專案編號,請參閱「識別專案」。
    • PROJECT_ID:GKE 叢集的專案 ID。
    • NAMESPACE:Kubernetes ServiceAccount 的 Kubernetes 命名空間名稱。
    • KSA_NAME:新 Kubernetes ServiceAccount 的名稱。
    • ROLE_NAME:要指派給 Kubernetes ServiceAccount 的 IAM 角色。
      • 如果是唯讀工作負載,請使用 Storage 物件檢視者角色 (roles/storage.objectViewer)。
      • 如果是讀寫工作負載,請使用「Storage 物件使用者」角色 (roles/storage.objectUser)。

設定 Pod 的主機網路存取權

如果 GKE 叢集版本早於 1.33.3-gke.1226000,Cloud Storage FUSE CSI 驅動程式不支援在主機網路 (hostNetwork: true) 上執行的 Pod,因為 Workload Identity Federation for GKE 有所限制。不過,在較新的 GKE 版本中,當您使用 Cloud Storage FUSE CSI 驅動程式掛接 Cloud Storage bucket 時,可以為已啟用 hostNetwork 的 Pod 設定安全驗證機制。主機網路支援僅適用於 Standard GKE 叢集。

請確認 GKE 叢集符合下列規定:

在 Pod 或 PersistentVolume 定義中指定磁碟區屬性 hostNetworkPodKSA: "true",即可讓 HostNetwork Pod 存取 Cloud Storage 磁碟區。實際設定會因管理 Cloud Storage FUSE Sidecar 容器的方式而異。

代管的 Sidecar

如果 GKE 會自動將 Cloud Storage FUSE 邊車容器注入 Pod 並加以管理,則適用本節內容。這個選項是 Cloud Storage FUSE CSI 驅動程式的預設和建議設定。

暫時磁碟區

下列 Pod 資訊清單會設定 Pod 的臨時磁碟區,以存取 Cloud Storage bucket。HostNetwork

apiVersion: v1
kind: Pod
metadata:
  name: test-pod
  namespace: ns1
  annotations:
    gke-gcsfuse/volumes: "true"
spec:
  serviceAccountName: test-ksa-ns1
  hostNetwork: true
  containers:
  - image: busybox
    name: busybox
    command:
      - sleep
      - "3600"
    volumeMounts:
    - name: gcs-fuse-csi-ephemeral
      mountPath: /data
  volumes:
  - name: gcs-fuse-csi-ephemeral
    csi:
      driver: gcsfuse.csi.storage.gke.io
      volumeAttributes:
        bucketName: test-bucket
        hostNetworkPodKSA: "true"

永久磁碟區

下列 PV 資訊清單會為 HostNetwork Pod 設定 PV,以便存取 Cloud Storage bucket。

apiVersion: v1
kind: PersistentVolume
metadata:
name: gcp-cloud-storage-csi-pv
spec:
accessModes:
- ReadWriteMany
capacity:
  storage: 5Gi
persistentVolumeReclaimPolicy: Retain
# storageClassName does not need to refer to an existing StorageClass object.
storageClassName: test-storage-class
mountOptions:
  - uid=1001
  - gid=3003
csi:
  driver: gcsfuse.csi.storage.gke.io
  volumeHandle: test-wi-host-network-2
  volumeAttributes:
    hostNetworkPodKSA: "true"

私有 Sidecar

如果您在 Pod 中手動管理 Cloud Storage FUSE 邊車容器,或使用自訂邊車映像檔,請參閱本節內容。

確認 Sidecar 映像檔是以 Cloud Storage FUSE CSI 驅動程式 v1.17.2 以上版本為基礎。

暫時磁碟區

下列 Pod 資訊清單會設定 Pod 的臨時磁碟區,以存取 Cloud Storage bucket。HostNetwork

apiVersion: v1
kind: Pod
metadata:
  name: test-pod
  namespace: ns1
  annotations:
    gke-gcsfuse/volumes: "true"
spec:
  serviceAccountName: test-ksa-ns1
  hostNetwork: true
  containers:
  - image: busybox
    name: busybox
    command:
      - sleep
      - "3600"
    volumeMounts:
    - name: gcs-fuse-csi-ephemeral
      mountPath: /data
  volumes:
  - name: gcs-fuse-csi-ephemeral
    csi:
      driver: gcsfuse.csi.storage.gke.io
      volumeAttributes:
        bucketName: test-bucket
        hostNetworkPodKSA: "true"
        identityProvider: "https://container.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/clusters/CLUSTER_NAME"

在 identityProvider 欄位中,替換下列內容:

  • PROJECT_ID:您的 Google Cloud 專案 ID。
  • LOCATION:叢集位置。
  • CLUSTER_NAME:Standard GKE 叢集的名稱。

永久磁碟區

下列 PV 資訊清單會設定 PV,供 HostNetwork Pod 存取 Cloud Storage bucket。

apiVersion: v1
kind: PersistentVolume
metadata:
name: gcp-cloud-storage-csi-pv
spec:
accessModes:
- ReadWriteMany
capacity:
  storage: 5Gi
persistentVolumeReclaimPolicy: Retain
# storageClassName does not need to refer to an existing StorageClass object.
storageClassName: test-storage-class
mountOptions:
  - uid=1001
  - gid=3003
csi:
  driver: gcsfuse.csi.storage.gke.io
  volumeHandle: test-wi-host-network-2
  volumeAttributes:
    hostNetworkPodKSA: "true"
    identityProvider: "https://container.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/clusters/CLUSTER_NAME"

在 identityProvider 欄位中,替換下列內容:

  • PROJECT_ID:您的 Google Cloud 專案 ID。
  • LOCATION:叢集位置。
  • CLUSTER_NAME:Standard GKE 叢集的名稱。

後續步驟