Cloud Storage-Buckets als persistente Volumes bereitstellen


In diesem Leitfaden erfahren Sie, wie Sie nichtflüchtige Kubernetes-Volumes verwenden, die von Ihren Cloud Storage-Buckets unterstützt werden, um Speicherressourcen für Ihre Kubernetes-Pods in der Google Kubernetes Engine (GKE) zu verwalten. Diese Speicheroption eignet sich, wenn Sie bereits mit PersistentVolumes vertraut sind und für Ihre vorhandenen Bereitstellungen, die auf diesem Ressourcentyp basieren, für Einheitlichkeit sorgen möchten.

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

Machen Sie sich vor dem Lesen dieser Seite mit Kubernetes-persistenten Volumes, Kubernetes-Pods und Cloud Storage-Buckets vertraut.

Wenn Sie eine optimierte podbasierte Benutzeroberfläche benötigen, für die keine Vorkenntnisse mit nichtflüchtigen Kubernetes-Volumes erforderlich sind, lesen Sie den Hilfeartikel Cloud Storage-Buckets als CSI-sitzungsspezifische Volumes bereitstellen.

Hinweise

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

Funktionsweise von nichtflüchtigen Volumes für Cloud Storage-Buckets

Bei der statischen Bereitstellung erstellen Sie ein oder mehrere PersistentVolume-Objekte, die die Details des zugrunde liegenden Speichersystems enthalten. Pods in Ihren Clustern können dann den Speicher über PersistentVolumeClaims nutzen.

Die Verwendung eines persistenten Volumes, das von einem Cloud Storage-Bucket unterstützt wird, umfasst folgende Vorgänge:

  1. Speicherdefinition: Sie definieren ein PersistentVolume in Ihrem GKE-Cluster, einschließlich des zu verwendenden CSI-Treibers und aller erforderlichen Parameter. Geben Sie für den Cloud Storage FUSE CSI-Treiber den Bucket-Namen und andere relevante Details an.

    Optional können Sie die Leistung Ihres CSI-Treibers mithilfe der Funktion Datei-Caching optimieren. Das Datei-Caching kann die Leistung von GKE-Anwendungen steigern, indem häufig aufgerufene Cloud Storage-Dateien auf einem schnelleren lokalen 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 ein PersistentVolumeClaim Speicher anfordert, der der Spezifikation des PersistentVolumes entspricht, ruft GKE den Cloud Storage FUSE CSI-Treiber auf.

  3. Bucket-Bereitstellung: Der CSI-Treiber stellt den Bucket auf dem Knoten bereit, auf dem der anfragende Pod geplant ist. So ist der Inhalt des Buckets für den Pod als Verzeichnis im lokalen Dateisystem des Pods zugänglich. 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. Neuverknüpfung: Wenn der Pod neu gestartet oder auf einen anderen Knoten verschoben wird, hängt der CSI-Treiber denselben Bucket wieder am neuen Knoten an, um die Datenzugänglichkeit zu gewährleisten.

PersistentVolume erstellen

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

    Pod

    apiVersion: v1
    kind: PersistentVolume
    metadata:
      name: gcs-fuse-csi-pv
    spec:
      accessModes:
      - ReadWriteMany
      capacity:
        storage: 5Gi
      storageClassName: example-storage-class  
      mountOptions:
        - implicit-dirs
      csi:
        driver: gcsfuse.csi.storage.gke.io
        volumeHandle: BUCKET_NAME
      claimRef:
        name: gcs-fuse-csi-static-pvc
        namespace: NAMESPACE  
    

    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 Cloud Storage FUSE-Dokumentation.

    Das Beispielmanifest enthält die folgenden erforderlichen Einstellungen:

    • spec.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.mountOptions: Übergeben Sie Optionen zur Bereitstellung an Cloud Storage FUSE. Geben Sie die Flags in einem String durch Kommas getrennt ohne Leerzeichen an.
    • spec.csi.volumeAttributes: Übergeben Sie zusätzliche Volume-Attribute an Cloud Storage FUSE.

    Pod (Datei-Caching)

    apiVersion: v1
    kind: PersistentVolume
    metadata:
      name: gcs-fuse-csi-pv
    spec:
      accessModes:
      - ReadWriteMany
      capacity:
        storage: 5Gi
      storageClassName: example-storage-class 
      mountOptions:
        - implicit-dirs
        - file-cache:max-size-mb:-1
      csi:
        driver: gcsfuse.csi.storage.gke.io
        volumeHandle: BUCKET_NAME
      claimRef:
        name: gcs-fuse-csi-static-pvc
        namespace: NAMESPACE 
    

    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.

    Pod (paralleler Download)

    apiVersion: v1
    kind: PersistentVolume
    metadata:
      name: gcs-fuse-csi-pv
    spec:
      accessModes:
      - ReadWriteMany
      capacity:
        storage: 5Gi
      storageClassName: example-storage-class 
      mountOptions:
        - implicit-dirs
        - file-cache:enable-parallel-downloads:true
        - file-cache:max-size-mb:-1
      csi:
        driver: gcsfuse.csi.storage.gke.io
        volumeHandle: BUCKET_NAME
      claimRef:
        name: gcs-fuse-csi-static-pvc
        namespace: NAMESPACE 
    

    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. Wenden Sie das Manifest auf den Cluster an:

    kubectl apply -f PV_FILE_PATH
    

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

PersistentVolumeClaim erstellen

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

    apiVersion: v1
    kind: PersistentVolumeClaim
    metadata:
      name: gcs-fuse-csi-static-pvc
      namespace: NAMESPACE
    spec:
      accessModes:
      - ReadWriteMany
      resources:
        requests:
          storage: 5Gi
      storageClassName: example-storage-class
    

    Ersetzen Sie NAMESPACE durch den Kubernetes-Namespace, in dem Sie Ihren Pod bereitstellen möchten.

    Prüfen Sie die folgenden Konfigurationseinstellungen, um Ihr PersistentVolume an einen PersistentVolumeClaim zu binden:

    • Die spec.storageClassName-Felder in den Manifesten für PersistentVolumes und PersistentVolumeClaims müssen übereinstimmen. Die storageClassName muss sich nicht auf ein vorhandenes StorageClass-Objekt beziehen. Zum Binden der Anforderung an ein Volume können Sie einen beliebigen Namen verwenden, der aber nicht leer sein kann.
    • Die spec.accessModes-Felder in den Manifesten für PersistentVolumes und PersistentVolumeClaims müssen übereinstimmen.
    • Das Feld spec.capacity.storage in Ihrem PersistentVolume-Manifest muss mit dem spec.resources.requests.storage im PersistentVolumeClaim-Manifest übereinstimmen. Da es bei Cloud Storage-Buckets keine Größenbeschränkung gibt, können Sie eine beliebige Anzahl von Kapazitäten eingeben. Diese dürfen aber nicht leer sein.
  2. Wenden Sie das Manifest auf den Cluster an:

    kubectl apply -f PVC_FILE_PATH
    

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

Volume in einem Pod verwenden

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

    apiVersion: v1
    kind: Pod
    metadata:
      name: gcs-fuse-csi-example-static-pvc  
      namespace: NAMESPACE
      annotations:
        gke-gcsfuse/volumes: "true"
        gke-gcsfuse/ephemeral-storage-limit: "50Gi" 
    spec:
      containers:
      - image: busybox
        name: busybox
        command: ["sleep"]
        args: ["infinity"]  
        volumeMounts:
        - name: gcs-fuse-csi-static
          mountPath: /data
          readOnly: true
      serviceAccountName: KSA_NAME
      volumes:
      - name: gcs-fuse-csi-static
        persistentVolumeClaim:
          claimName: gcs-fuse-csi-static-pvc
          readOnly: true  
    

    Ersetzen Sie die folgenden Werte:

    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.

    Optional können Sie die folgenden Variablen anpassen:

    • spec.containers[n].volumeMonts[n].readOnly: Geben Sie „wahr“ an, wenn nur bestimmte Volume-Bereitstellungen schreibgeschützt sind.
    • spec.volumes[n].persistentVolumeClaim.readOnly: Geben Sie „wahr“ an, wenn alle Volume-Bereitstellungen schreibgeschützt sind.
  2. Wenden Sie das Manifest auf den Cluster an:

    kubectl apply -f POD_FILE_PATH
    

    Ersetzen Sie POD_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 Deployment-YAML-Datei 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