CSI-Treiber für Cloud Storage FUSE für GKE einrichten

In diesem Dokument wird beschrieben, wie Sie den CSI-Treiber für Cloud Storage FUSE einrichten, um von Google Kubernetes Engine (GKE) aus auf Cloud Storage-Buckets zuzugreifen.

Mit dem Cloud Storage FUSE CSI-Treiber können Ihre GKE-Arbeitslasten auf Cloud Storage-Buckets als lokales Dateisystem zugreifen. Der CSI-Treiber integriert Cloud Storage in GKE und vereinfacht die Interaktion Ihrer containerisierten Anwendungen mit großen Datasets, die in Buckets gespeichert sind. Der CSI-Treiber bietet eine Standardschnittstelle für GKE-Speicher. In diesem Dokument bereiten Sie Ihre Umgebung vor und verbinden Ihre GKE-Cluster mit Cloud Storage-Buckets, indem Sie den Cloud Storage FUSE CSI-Treiber verwenden.

Dieses Dokument richtet sich an Entwickler, Administratoren und Speicherexperten, die GKE-Arbeitslasten in den Objektspeicher einbinden. Weitere Informationen zu gängigen Rollen und Beispielaufgaben, auf die wir in Google Cloud Inhalten verweisen, finden Sie unter Häufig verwendete GKE-Nutzerrollen und -Aufgaben.

Cloud Storage-Bucket erstellen

Erstellen Sie Ihre Cloud Storage-Buckets, falls noch nicht geschehen. Sie stellen diese Buckets als Volumes in Ihrem GKE-Cluster bereit. Zur Verbesserung der Leistung setzen Sie den Standorttyp auf Region und wählen eine Region aus, die Ihrem GKE-Cluster entspricht.

CSI-Treiber für Cloud Storage FUSE aktivieren

Führen Sie die folgenden Schritte aus, je nachdem, ob Sie GKE Autopilot- oder Standardcluster verwenden. Für eine vollständig verwaltete Kubernetes-Umgebung empfehlen wir die Verwendung eines Autopilot-Clusters. Informationen zum Auswählen des Modus, der für Ihre Arbeitslasten am besten geeignet ist, finden Sie unter GKE-Betriebsmodus auswählen.

Autopilot

Der CSI-Treiber für Cloud Storage FUSE ist standardmäßig für Autopilot-Cluster aktiviert. Sie können direkt zu Zugriff auf Cloud Storage-Buckets konfigurieren springen.

Standard

Wenn in Ihrem Standardcluster der CSI-Treiber für Cloud Storage FUSE aktiviert ist, fahren Sie mit Zugriff auf Cloud Storage-Buckets konfigurieren fort.

Der Cloud Storage FUSE CSI-Treiber ist in Standardclustern nicht standardmäßig aktiviert. Zum Erstellen eines Standardclusters mit aktiviertem Cloud Storage FUSE CSI-Treiber können Sie den Befehl gcloud container clusters create verwenden:

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

Ersetzen Sie Folgendes:

  • CLUSTER_NAME: Der Name Ihres Clusters.
  • VERSION: Die GKE-Versionsnummer. Sie müssen mindestens 1.24 auswählen.
  • LOCATION: die Compute Engine-Region oder -Zone für den Cluster.
  • PROJECT_ID: Ihre Projekt-ID.

Verwenden Sie den Befehl gcloud container clusters update, um den Treiber auf einem vorhandenen Standardcluster zu aktivieren:

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

Führen Sie den folgenden Befehl aus, um zu prüfen, ob der CSI-Treiber für Cloud Storage FUSE in Ihrem Cluster aktiviert ist:

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

Zugriff auf Cloud Storage-Buckets konfigurieren

Der Cloud Storage FUSE-CSI-Treiber verwendet die Workload Identity Federation for GKE, damit Sie detaillierte Berechtigungen dafür festlegen können, wie Ihre GKE-Pods auf in Cloud Storage gespeicherte Daten zugreifen können.

So machen Sie Ihre Cloud Storage-Buckets für Ihren GKE-Cluster zugänglich: Authentifizieren Sie sich mit der Workload Identity-Föderation für GKE mit dem Cloud Storage-Bucket, den Sie in Ihrer Pod-Spezifikation einbinden möchten:

  1. Wenn Sie die Workload Identity-Föderation für GKE nicht aktiviert haben, folgen Sie dieser Anleitung, um sie zu aktivieren. Wenn Sie einen vorhandenen Knotenpool verwenden möchten, aktivieren Sie Workload Identity Federation for GKE in Ihrem Knotenpool manuell, nachdem Sie Workload Identity Federation for GKE in Ihrem Cluster aktiviert haben.
  2. Rufen Sie Anmeldedaten für Ihren Cluster ab:

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

    Ersetzen Sie Folgendes:

    • CLUSTER_NAME: Der Name Ihres Clusters, für den Workload Identity Federation for GKE aktiviert ist.
    • LOCATION: die Compute Engine-Region oder -Zone für den Cluster.
  3. Erstellen Sie einen Namespace, der für das Kubernetes-Dienstkonto verwendet werden soll. Sie können auch den Namespace default oder einen vorhandenen Namespace verwenden.

    kubectl create namespace NAMESPACE
    

    Ersetzen Sie NAMESPACE durch den Namen des Kubernetes-Namespace für das Kubernetes-ServiceAccount.

  4. Erstellen Sie ein Kubernetes-ServiceAccount für die Anwendung: Sie können auch ein beliebiges Kubernetes-ServiceAccount in einem beliebigen Namespace verwenden, einschließlich des Kubernetes-ServiceAccount default.

    kubectl create serviceaccount KSA_NAME \
        --namespace NAMESPACE
    

    Ersetzen Sie KSA_NAME durch den Namen Ihres Kubernetes-Dienstkontos.

  5. Weisen Sie dem Kubernetes-Dienstkonto eine der IAM-Rollen für Cloud Storage zu. Führen Sie die folgenden Schritte aus, je nachdem, ob Sie dem Kubernetes-Dienstkonto nur Zugriff auf einen bestimmten Cloud Storage-Bucket oder globalen Zugriff auf alle Buckets im Projekt gewähren.

    Zugriff auf bestimmte Buckets

    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"
    

    Ersetzen Sie Folgendes:

    • BUCKET_NAME: Name Ihres Cloud Storage-Buckets.
    • PROJECT_NUMBER: Die numerische Projektnummer Ihres GKE-Clusters. Ihre Projektnummer finden Sie unter Projekte identifizieren.
    • PROJECT_ID: Die Projekt-ID Ihres GKE-Clusters.
    • NAMESPACE: der Name des Kubernetes-Namespace für das Kubernetes-ServiceAccount.
    • KSA_NAME: der Name des neuen Kubernetes-ServiceAccount.
    • ROLE_NAME: Die IAM-Rolle, die Ihrem Kubernetes-Dienstkonto zugewiesen werden soll.
      • Verwenden Sie für schreibgeschützte Arbeitslasten die Rolle "Storage-Objekt-Betrachter" (roles/storage.objectViewer).
      • Verwenden Sie für Lese-/Schreibarbeitslasten die Rolle „Storage-Objekt-Nutzer“ (roles/storage.objectUser).

    Globaler Bucket-Zugriff

    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"
    

    Ersetzen Sie Folgendes:

    • GCS_PROJECT: die Projekt-ID Ihrer Cloud Storage-Buckets.
    • PROJECT_NUMBER: Die numerische Projektnummer Ihres GKE-Clusters. Ihre Projektnummer finden Sie unter Projekte identifizieren.
    • PROJECT_ID: Die Projekt-ID Ihres GKE-Clusters.
    • NAMESPACE: der Name des Kubernetes-Namespace für das Kubernetes-ServiceAccount.
    • KSA_NAME: der Name des neuen Kubernetes-ServiceAccount.
    • ROLE_NAME: Die IAM-Rolle, die Ihrem Kubernetes-Dienstkonto zugewiesen werden soll.
      • Verwenden Sie für schreibgeschützte Arbeitslasten die Rolle "Storage-Objekt-Betrachter" (roles/storage.objectViewer).
      • Verwenden Sie für Lese-/Schreibarbeitslasten die Rolle „Storage-Objekt-Nutzer“ (roles/storage.objectUser).

Zugriff für Pods mit Hostnetzwerk konfigurieren

Bei GKE-Clusterversionen vor 1.33.3-gke.1226000 unterstützt der Cloud Storage FUSE CSI-Treiber aufgrund von Einschränkungen der Workload Identity Federation for GKE keine Pods, die im Hostnetzwerk (hostNetwork: true) ausgeführt werden. Bei neueren GKE-Versionen können Sie jedoch eine sichere Authentifizierung für hostNetwork-aktivierte Pods konfigurieren, wenn Sie den Cloud Storage FUSE-CSI-Treiber zum Bereitstellen von Cloud Storage-Buckets verwenden. Die Unterstützung für Hostnetzwerke ist nur in Standard-GKE-Clustern verfügbar.

Ihr GKE-Cluster muss die folgenden Anforderungen erfüllen:

Sie geben das Volume-Attribut hostNetworkPodKSA: "true" in Ihrer Pod- oder PersistentVolume-Definition an, damit Ihre HostNetwork-Pods auf Cloud Storage-Volumes zugreifen können. Die genaue Konfiguration hängt davon ab, wie Sie den Cloud Storage FUSE-Sidecar-Container verwalten.

Verwaltete Sidecars

Dieser Abschnitt gilt, wenn GKE den Cloud Storage FUSE-Sidecar-Container automatisch in Ihre Pods einfügt und verwaltet. Diese Option ist die Standard- und empfohlene Einrichtung für den CSI-Treiber für Cloud Storage FUSE.

Sitzungsspezifisches Volume

Im folgenden Pod-Manifest wird ein sitzungsspezifisches Volume für einen HostNetwork-Pod konfiguriert, um auf einen Cloud Storage-Bucket zuzugreifen.

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"

Nichtflüchtiges Volume

Das folgende PV-Manifest konfiguriert ein PV für einen HostNetwork-Pod, um auf einen Cloud Storage-Bucket zuzugreifen.

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"

Private Sidecars

Dieser Abschnitt gilt, wenn Sie den Cloud Storage FUSE-Sidecar-Container in Ihren Pods manuell verwalten oder ein benutzerdefiniertes Sidecar-Image verwenden.

Achten Sie darauf, dass Ihr Sidecar-Image auf der Version v1.17.2 oder höher des CSI-Treibers für Cloud Storage FUSE basiert.

Sitzungsspezifisches Volumen

Im folgenden Pod-Manifest wird ein temporäres Volume für einen HostNetwork-Pod konfiguriert, damit er auf einen Cloud Storage-Bucket zugreifen kann.

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"

Ersetzen Sie im Feld identityProvider Folgendes:

  • PROJECT_ID: Projekt-ID in Google Cloud .
  • LOCATION: Der Standort Ihres Clusters.
  • CLUSTER_NAME: der Name Ihres GKE-Standardclusters.

Nichtflüchtiges Volume

Das folgende PV-Manifest konfiguriert ein PV für einen HostNetwork-Pod, um auf einen Cloud Storage-Bucket zuzugreifen.

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"

Ersetzen Sie im Feld identityProvider Folgendes:

  • PROJECT_ID: Projekt-ID in Google Cloud .
  • LOCATION: Der Standort Ihres Clusters.
  • CLUSTER_NAME: der Name Ihres GKE-Standardclusters.

Nächste Schritte