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


本頁說明如何設定及準備使用 GKE 的 Cloud Storage FUSE CSI 驅動程式

如要使用 Cloud Storage FUSE CSI 驅動程式,請完成下列步驟:

建立 Cloud Storage 值區

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

啟用 Cloud Storage FUSE CSI 驅動程式

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

Autopilot

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

標準

如果 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 值區的存取權

Cloud Storage FUSE CSI 驅動程式使用 GKE 適用的工作負載身分聯盟,因此您可以針對 GKE Pod 存取 Cloud Storage 中儲存資料的方式,設定精細的權限。

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

  1. 如果尚未啟用 GKE 適用的工作負載身分聯盟,請按照這些步驟啟用。如要使用現有節點集區,請在叢集上啟用 Workload Identity Federation for GKE 後,手動在節點集區上啟用 Workload Identity Federation for 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 存取權

    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 Object User 角色 (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 值區的專案 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 Object User 角色 (roles/storage.objectUser)。

為使用主機網路的 Pod 設定存取權

如果 GKE 叢集版本早於 1.33.3-gke.1226000,由於 GKE 工作負載身分聯盟的限制,Cloud Storage FUSE CSI 驅動程式不支援在主機網路 (hostNetwork: true) 上執行的 Pod。不過,如果是較新的 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 Sidecar 容器插入 Pod 並進行管理,則適用本節內容。這個選項是 Cloud Storage FUSE CSI 驅動程式的預設設定,也是建議的設定。

暫時磁碟區

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

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 容器,或使用自訂 Sidecar 映像檔,請參閱本節內容。

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

暫時磁碟區

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

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 資訊清單會為 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"
    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 叢集名稱。

後續步驟