Cloud Storage-Buckets als sitzungsspezifische CSI-Volumes bereitstellen


In diesem Leitfaden erfahren Sie, wie Sie sitzungsspezifische CSI-Volumes verwenden, die von Ihren Cloud Storage-Buckets unterstützt werden, um Speicherressourcen für Ihre Kubernetes-Pods oder Jobs in der Google Kubernetes Engine (GKE) automatisch zu verwalten. Sitzungsspezifische CSI-Volumes sind an den Pod- oder Job-Lebenszyklus gebunden. Sie müssen PersistentVolume- und PersistentVolumeClaim-Objekte nicht manuell verwalten.

Dieser Leitfaden richtet sich an Plattformadministratoren und ‑betreiber, die die Speicherverwaltung für ihre GKE-Anwendungen vereinfachen möchten.

Machen Sie sich vor dem Lesen dieser Seite mit CSI-sitzungsspezifischen Volumes, Kubernetes-Pods und ‑Jobs sowie Cloud Storage-Buckets vertraut.

Wenn Sie mit PersistentVolumes bereits vertraut sind und für Ihre vorhandenen Bereitstellungen, die auf diesem Ressourcentyp basieren, Konsistenz wünschen, lesen Sie den Hilfeartikel Cloud Storage-Buckets als nichtflüchtige Volumes bereitstellen.

Hinweise

Prüfen Sie, ob folgende Voraussetzungen erfüllt sind:

Funktionsweise von sitzungsspezifischem CSI-Speicher für Cloud Storage-Buckets

Sitzungsspezifische CSI-Volumes vereinfachen die Speicherverwaltung für Ihre Anwendungen in GKE. Sie definieren sitzungsspezifische CSI-Volumes direkt in Ihrer Pod- oder Job-Spezifikation. Durch die Verwendung von sitzungsspezifischen CSI-Volumes sind keine separaten PersistentVolume- und PersistentVolumeClaim-Objekte erforderlich.

Die Verwendung eines sitzungsspezifischen CSI-Volumes umfasst folgende Vorgänge:

  1. Speicherdefinition: Sie geben den Speicher in der YAML-Datei Ihres Pods oder Jobs an, einschließlich des zu verwendenden CSI-Treibers und aller erforderlichen Parameter. Geben Sie für den CSI-Treiber für Cloud Storage FUSE den Bucketnamen und andere relevante Details an.

    Optional können Sie die Leistung Ihres CSI-Treibers mithilfe der Funktion Datei-Caching optimieren. Durch das Datei-Caching lässt sich die Leistung von GKE-Anwendungen steigern, da häufig aufgerufene Cloud Storage-Dateien auf einem schnelleren Laufwerk zwischengespeichert werden.

    Außerdem können Sie die Funktion paralleler Download verwenden, um das Lesen großer Dateien aus Cloud Storage für Downloads mit mehreren Threads zu beschleunigen. Mit dieser Funktion können Sie die Modellladezeiten verbessern, insbesondere bei Lesevorgängen mit einer Größe von mehr als 1 GB.

  2. Treiberaufruf: Wenn Sie den Pod oder Job erstellen, erkennt GKE die Anfrage für das sitzungsspezifische Volume und ruft den Cloud Storage FUSE CSI-Treiber auf.

  3. Volume bereitstellen und anhängen: Der CSI-Treiber stellt das sitzungsspezifische CSI-Volume bereit (das auf den zugrunde liegenden Cloud Storage-Bucket verweist) und macht es für den Pod oder Job verfügbar, sodass es für Ihre Anwendung zugänglich ist. Mit Bereitstellungsoptionen können Sie die Bereitstellung von Buckets im Dateisystem optimieren. Sie können auch Volume-Attribute verwenden, um das Verhalten des Cloud Storage FUSE CSI-Treibers zu konfigurieren.

  4. Lebenszyklusverwaltung: Das sitzungsspezifische Volume existiert während der gesamten Lebensdauer des Pods oder Jobs. Wenn der Pod gelöscht oder der Job abgeschlossen wird, übernimmt der CSI-Treiber automatisch die Bereinigung und das Trennen des Volumes.

Sitzungsspezifisches CSI-Volume anhängen

Folgen Sie dieser Anleitung, je nachdem, ob Sie das CSI-sitzungsspezifische Volume an einen Pod oder Job anhängen möchten.

Pod

So hängen Sie das sitzungsspezifische CSI-Volume in einem Pod an:

  1. Erstellen Sie ein Pod-YAML-Manifest mit der folgenden Spezifikation:

    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" 
    

    Ersetzen Sie die folgenden Werte:

    • NAMESPACE: der Kubernetes-Namespace, in dem Sie Ihren Pod bereitstellen möchten.
    • KSA_NAME: Der Name des Kubernetes-Dienstkontos, das Sie beim Konfigurieren des Zugriffs auf die Cloud Storage-Buckets angegeben haben.
    • BUCKET_NAME: den Namen des Cloud Storage-Bucket, den Sie beim Konfigurieren des Zugriffs auf die Cloud Storage-Buckets angegeben haben. Sie können einen Unterstrich (_) angeben, um alle Buckets bereitzustellen, auf die das Kubernetes-Dienstkonto zugreifen kann. Weitere Informationen finden Sie unter Dynamische Bereitstellung in der Cloud Storage FUSE-Dokumentation.

    Das Beispielmanifest enthält die folgenden erforderlichen Einstellungen:

    • metadata.annotations: Die Anmerkung gke-gcsfuse/volumes: "true" ist erforderlich. Optionale Anmerkungen finden Sie unter Sidecar-Container konfigurieren.
    • spec.volumes[n].csi.driver: Verwenden Sie gcsfuse.csi.storage.gke.io als Namen für den CSI-Treiber.

    Optional können Sie die folgenden Variablen anpassen:

    • spec.terminationGracePeriodSeconds: Standardmäßig ist dies auf 30 festgelegt. Wenn Sie große Dateien in den Cloud Storage-Bucket schreiben müssen, erhöhen Sie diesen Wert, damit Cloud Storage FUSE genügend Zeit hat, um die Daten nach dem Beenden Ihrer Anwendung zu leeren. Weitere Informationen finden Sie im Blog Kubernetes best practices: terminating with grace.
    • spec.volumes[n].csi.volumeAttributes.mountOptions: Übergeben Sie Optionen zur Bereitstellung an Cloud Storage FUSE. Geben Sie die Flags in einem String durch Kommas getrennt ohne Leerzeichen an.
    • spec.volumes[n].csi.volumeAttributes: Übergeben Sie zusätzliche Volume-Attribute an Cloud Storage FUSE.
    • spec.volumes[n].csi.readOnly: Geben Sie „wahr“ an, wenn alle Volume-Bereitstellungen schreibgeschützt sind.
    • spec.containers[n].volumeMounts[m].readOnly: Geben Sie „wahr“ an, wenn nur eine bestimmte Volume-Bereitstellung schreibgeschützt ist.
  2. Führen Sie den folgenden Befehl aus, um das Manifest auf Ihren Cluster anzuwenden:

    kubectl apply -f FILE_PATH
    

    Ersetzen Sie FILE_PATH durch den Pfad zu Ihrer YAML-Datei.

Pod (Datei-Caching)

So hängen Sie das sitzungsspezifische CSI-Volume mit Datei-Caching in einem Pod an:

  1. Erstellen Sie einen Cluster oder Knotenpool mit sitzungsspezifischem lokalen SSD-Speicher. Folgen Sie dazu der Anleitung unter Cluster oder Knotenpool mit sitzungsspezifischem lokalen SSD-Speicher erstellen.

  2. Erstellen Sie ein Pod-YAML-Manifest mit der folgenden Spezifikation:

    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"
    

    Ersetzen Sie die folgenden Werte:

    • NAMESPACE: der Kubernetes-Namespace, in dem Sie Ihren Pod bereitstellen möchten.
    • KSA_NAME: Der Name des Kubernetes-Dienstkontos, das Sie beim Konfigurieren des Zugriffs auf die Cloud Storage-Buckets angegeben haben.
    • BUCKET_NAME: den Namen des Cloud Storage-Bucket, den Sie beim Konfigurieren des Zugriffs auf die Cloud Storage-Buckets angegeben haben. Sie können einen Unterstrich (_) angeben, um alle Buckets bereitzustellen, auf die das Kubernetes-Dienstkonto zugreifen kann. Weitere Informationen finden Sie unter Dynamische Bereitstellung in der Cloud Storage FUSE-Dokumentation.

      Im Beispielmanifest generiert der Datenlader des Init-Containers 1.000 Dateien mit einer Größe von 64 KiB und lädt sie in einen Cloud Storage-Bucket hoch. Der Hauptcontainer data-validator liest alle Dateien aus dem Bucket zweimal und protokolliert die Dauer.

  3. Führen Sie den folgenden Befehl aus, um das Manifest auf Ihren Cluster anzuwenden:

    kubectl apply -f FILE_PATH
    

    Ersetzen Sie FILE_PATH durch den Pfad zu Ihrer YAML-Datei.

  4. Führen Sie folgenden Befehl aus, um sich die Logausgabe anzeigen zu lassen:

    kubectl logs -n NAMESPACE gcs-fuse-csi-file-cache-example -c data-validator
    

    Ersetzen Sie NAMESPACE durch den Namespace Ihrer Arbeitslast.

    Die Ausgabe sollte in etwa so aussehen:

    first read with cache miss
    real    0m 54.68s
    ...
    second read from local cache
    real    0m 0.38s
    ...
    

    Die Ausgabe zeigt, dass der zweite Lesevorgang mit lokalem Cache viel schneller erfolgt als der erste Lesevorgang mit Cache-Fehler.

Pod (paralleler Download)

So hängen Sie das CSI-Sitzungsvolume mit parallelem Download in einem Pod an:

  1. Erstellen Sie ein Pod-YAML-Manifest mit der folgenden Spezifikation:

    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"
    

    Ersetzen Sie die folgenden Werte:

    • NAMESPACE: der Kubernetes-Namespace, in dem Sie Ihren Pod bereitstellen möchten.
    • BUCKET_NAME: den Namen des Cloud Storage-Bucket, den Sie beim Konfigurieren des Zugriffs auf die Cloud Storage-Buckets angegeben haben. Sie können einen Unterstrich (_) angeben, um alle Buckets bereitzustellen, auf die das Kubernetes-Dienstkonto zugreifen kann. Weitere Informationen finden Sie unter Dynamische Bereitstellung in der Cloud Storage FUSE-Dokumentation.
  2. Führen Sie den folgenden Befehl aus, um das Manifest auf Ihren Cluster anzuwenden:

    kubectl apply -f FILE_PATH
    

    Ersetzen Sie FILE_PATH durch den Pfad zu Ihrer YAML-Datei.

Job

So hängen Sie das sitzungsspezifische CSI-Volume in einem Job an:

  1. Erstellen Sie ein Job-YAML-Manifest mit der folgenden Spezifikation:

    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
    

    Ersetzen Sie die folgenden Werte:

    • NAMESPACE: der Kubernetes-Namespace, in dem Sie Ihren Pod bereitstellen.
    • KSA_NAME: Der Name des Kubernetes-Dienstkontos, das Sie beim Konfigurieren des Zugriffs auf die Cloud Storage-Buckets angegeben haben.
    • BUCKET_NAME: den Namen des Cloud Storage-Bucket, den Sie beim Konfigurieren des Zugriffs auf die Cloud Storage-Buckets angegeben haben. Sie können einen Unterstrich (_) angeben, um alle Buckets bereitzustellen, auf die das Kubernetes-Dienstkonto zugreifen kann. Weitere Informationen finden Sie unter Dynamische Bereitstellung in der Cloud Storage FUSE-Dokumentation.

    Das Beispielmanifest enthält die folgenden erforderlichen Einstellungen:

    • metadata.annotations: Die Annotation gke-gcsfuse/volumes: "true" ist erforderlich. Optionale Anmerkungen finden Sie unter Sidecar-Container konfigurieren.
    • spec.volumes[n].csi.driver: Verwenden Sie gcsfuse.csi.storage.gke.io als Namen für den CSI-Treiber.

    Optional können Sie die folgenden Variablen anpassen:

    • spec.volumes[n].csi.volumeAttributes.mountOptions: Übergeben Sie Optionen zur Bereitstellung an Cloud Storage FUSE. Geben Sie die Flags in einem String durch Kommas getrennt ohne Leerzeichen an.
    • spec.volumes[n].csi.volumeAttributes: Übergeben Sie zusätzliche Volume-Attribute an Cloud Storage FUSE.
    • spec.volumes[n].csi.readOnly: Geben Sie „wahr“ an, wenn alle Volume-Bereitstellungen schreibgeschützt sind.
    • spec.containers[n].volumeMounts[m].readOnly: Geben Sie „wahr“ an, wenn nur eine bestimmte Volume-Bereitstellung schreibgeschützt ist.
  2. Führen Sie den folgenden Befehl aus, um das Manifest auf Ihren Cluster anzuwenden:

    kubectl apply -f FILE_PATH
    

    Ersetzen Sie FILE_PATH durch den Pfad zu Ihrer YAML-Datei.

Probleme beheben

Wenn Sie Probleme mit Cloud Storage FUSE beheben müssen, können Sie das Flag log-severity auf TRACE setzen. Sie legen das Flag im Abschnitt args der Container-Spezifikation des Treibers in der YAML-Datei für die Bereitstellung fest. Dadurch wird das gcsfuseLoggingSeverity-Volumenattribut automatisch auf „Trace“ (Spuren) gesetzt.

Weitere Tipps zur Fehlerbehebung finden Sie in der Anleitung zur Fehlerbehebung in der GitHub-Projektdokumentation.

Nächste Schritte