Cloud Storage-Buckets als sitzungsspezifische CSI-Volumes bereitstellen


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

Diese Anleitung richtet sich an Plattformadministratoren und ‑operatoren, die die Speicherverwaltung für ihre GKE-Anwendungen vereinfachen möchten.

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

Wenn Sie bereits mit PersistentVolumes vertraut sind und Konsistenz mit Ihren vorhandenen Bereitstellungen wünschen, die auf diesem Ressourcentyp basieren, lesen Sie den Abschnitt Cloud Storage-Buckets als nichtflüchtige Volumes einbinden.

Hinweise

Prüfen Sie, ob die folgenden 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 der Pod- oder Jobspezifikation. Durch die Verwendung von sitzungsspezifischen CSI-Volumes sind keine separaten PersistentVolume- und PersistentVolumeClaim-Objekte mehr erforderlich.

Die Verwendung eines sitzungsspezifischen CSI-Volumes umfasst die folgenden 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. Für den Cloud Storage FUSE CSI-Treiber geben Sie den Bucket-Namen und andere relevante Details an.

    Optional können Sie die Leistung Ihres CSI-Treibers mit dem Datei-Caching optimieren. Durch das Caching von Dateien kann die Leistung von GKE-Apps gesteigert werden, da häufig aufgerufene Cloud Storage-Dateien auf einer schnelleren Festplatte 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 Ladezeiten von Modellen verbessern, insbesondere bei Lesevorgängen 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-Bereitstellung und -Anhängen: Der CSI-Treiber stellt das sitzungsspezifische CSI-Volume (das auf den zugrunde liegenden Cloud Storage-Bucket verweist) bereit und macht es für den Pod oder Job verfügbar, sodass Ihre Anwendung darauf zugreifen kann. Mit Bereitstellungsoptionen können Sie genauer festlegen, wie Buckets im Dateisystem bereitgestellt werden. Sie können auch Volume-Attribute verwenden, um das Verhalten des Cloud Storage FUSE CSI-Treibers zu konfigurieren.

  4. Lebenszyklusverwaltung: Das sitzungsspezifische Volume ist für die Lebensdauer des Pods oder Jobs vorhanden. Wenn der Pod gelöscht wird oder der Job abgeschlossen ist, übernimmt der CSI-Treiber automatisch die Bereinigung und das Unmounten des Volumes.

Sitzungsspezifisches CSI-Volume anhängen

Folgen Sie dieser Anleitung, je nachdem, ob Sie das temporäre CSI-Volume an einen Pod oder einen 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: Der Name 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 Dokumentation zu Cloud Storage FUSE.

    Das Beispielmanifest enthält diese erforderlichen Einstellungen:

    • metadata.annotations: Die Annotation gke-gcsfuse/volumes: "true" ist erforderlich. Optionale Annotationen 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 diese Variablen anpassen:

    • spec.terminationGracePeriodSeconds: Standardmäßig ist dies auf 30 eingestellt. 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: Übergibt 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: Übergibt zusätzliche Volume-Attribute an Cloud Storage FUSE.
    • spec.volumes[n].csi.readOnly: Geben Sie „true“ an, wenn alle Volume-Bereitstellungen schreibgeschützt sind.
    • spec.containers[n].volumeMounts[m].readOnly: Geben Sie „true“ 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: Der Name 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 Dokumentation zu Cloud Storage FUSE.

      Im Beispielmanifest generiert der Init-Container „data-loader“ 1.000 Dateien mit einer Größe von 64 KiB und lädt die Dateien 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 Ihres Workloads.

    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 sitzungsspezifische CSI-Volume 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: Der Name 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 Dokumentation zu Cloud Storage FUSE.
  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 an einen 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: Der Name 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 Dokumentation zu Cloud Storage FUSE.

    Das Beispielmanifest enthält diese erforderlichen Einstellungen:

    • metadata.annotations: Die Annotation gke-gcsfuse/volumes: "true" ist erforderlich. Optionale Annotationen 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 diese Variablen anpassen:

    • spec.volumes[n].csi.volumeAttributes.mountOptions: Übergibt 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: Übergibt zusätzliche Volume-Attribute an Cloud Storage FUSE.
    • spec.volumes[n].csi.readOnly: Geben Sie „true“ an, wenn alle Volume-Bereitstellungen schreibgeschützt sind.
    • spec.containers[n].volumeMounts[m].readOnly: Geben Sie „true“ 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 Containerspezifikation des Treibers in der YAML-Datei für das Deployment fest. Dadurch wird das Attribut gcsfuseLoggingSeverity für das Volume automatisch auf „trace“ gesetzt.

Weitere Tipps zur Fehlerbehebung finden Sie in der Dokumentation zum GitHub-Projekt unter Anleitung zur Fehlerbehebung.

Nächste Schritte