Persistent Disk-Speicher mit Volume-Snapshots sichern


Auf dieser Seite erfahren Sie, wie Sie nichtflüchtigen Speicher mit Volume-Snapshots sichern und wiederherstellen.

Eine Einführung finden Sie unter Kubernetes-Volume-Snapshots.

Voraussetzungen

Zur Verwendung von Volume-Snapshots in GKE müssen Sie die folgenden Anforderungen erfüllen:

  • Sie benötigen einen vorhandenen PersistentVolumeClaim, der für einen Snapshot verwendet werden kann. Der PersistentVolume, den Sie für eine Snapshot-Quelle verwenden, muss von einem CSI-Treiber verwaltet werden. Prüfen Sie, ob Sie einen CSI-Treiber verwenden. Bestätigen Sie dazu, dass die PersistentVolume-Spezifikation den Abschnitt csi mit driver: pd.csi.storage.gke.io oder filestore.csi.storage.gke.io enthält. Wenn das PersistentVolume vom CSI-Treiber dynamisch bereitgestellt wird, wie in den folgenden Abschnitten beschrieben, wird es vom CSI-Treiber verwaltet.

Beschränkungen

Alle Einschränkungen zum Erstellen eines Laufwerk-Snapshots in Compute Engine gelten auch für GKE.

Best Practices

Befolgen Sie die Best Practices für Compute Engine-Laufwerk-Snapshots, wenn Sie Volume-Snapshots von nichtflüchtigem Speicher in GKE verwenden.

Hinweise

Führen Sie die folgenden Schritte durch, bevor Sie beginnen:

  • Aktivieren Sie die Google Kubernetes Engine API.
  • Google Kubernetes Engine API aktivieren
  • Wenn Sie die Google Cloud CLI für diese Aufgabe verwenden möchten, müssen Sie die gcloud CLI installieren und dann initialisieren. Wenn Sie die gcloud CLI bereits installiert haben, rufen Sie die neueste Version mit gcloud components update ab.

Volume-Snapshot erstellen und verwenden

Die Beispiele in diesem Dokument beschreiben die Ausführung der folgenden Aufgaben:

  1. Eine PersistentVolumeClaim und ein Deployment erstellen.
  2. Dem PersistentVolume eine Datei hinzufügen, die vom Deployment verwendet wird.
  3. Ein VolumeSnapshotClass erstellen, um den Snapshot zu konfigurieren
  4. Einen Volume-Snapshot vom PersistentVolume erstellen
  5. Die Testdatei löschen
  6. Stellen Sie PersistentVolume auf den von Ihnen erstellten Snapshot wieder her.
  7. Prüfen, ob die Wiederherstellung funktioniert hat

So verwenden Sie einen Volume-Snapshot:

  1. Erstellen Sie ein VolumeSnapshotClass-Objekt, um die CSI-Treiber- und Löschrichtlinie für Ihren Snapshot anzugeben.
  2. Erstellen Sie ein VolumeSnapshot-Objekt, um einen Snapshot eines vorhandenen PersistentVolumeClaim anzufragen.
  3. Verweisen Sie auf den VolumeSnapshot in einer PersistentVolumeClaim, um ein Volume anhand dieses Snapshots wiederherzustellen, oder erstellen Sie ein neues Volume mithilfe dieses Snapshots.

PersistentVolumeClaim und Deployment erstellen

  1. Speichern Sie zum Erstellen des PersistentVolumeClaim-Objekts das folgende Manifest als my-pvc.yaml:

    Persistent Disk

     apiVersion: v1
     kind: PersistentVolumeClaim
     metadata:
       name: my-pvc
     spec:
       storageClassName: standard-rwo
       accessModes:
       - ReadWriteOnce
       resources:
         requests:
           storage: 1Gi
    

    In diesem Beispiel wird die Speicherklasse standard-rwo verwendet, die standardmäßig mit dem CSI-Treiber für den nichtflüchtigen Speicher der Compute Engine installiert ist. Weitere Informationen finden Sie unter CSI-Treiber für nichtflüchtigen Speicher der Compute Engine verwenden.

    Für spec.storageClassName können Sie jede Speicherklasse angeben, die einen unterstützten CSI-Treiber verwendet.

  2. Wenden Sie das Manifest an:

    kubectl apply -f my-pvc.yaml
    
  3. Speichern Sie zum Erstellen eines Deployment das folgende Manifest als my-deployment.yaml:

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: hello-app
    spec:
      selector:
        matchLabels:
          app: hello-app
      template:
        metadata:
          labels:
            app: hello-app
        spec:
          containers:
          - name: hello-app
            image: google/cloud-sdk:slim
            args: [ "sleep", "3600" ]
            volumeMounts:
            - name: sdk-volume
              mountPath: /usr/share/hello/
          volumes:
          - name: sdk-volume
            persistentVolumeClaim:
              claimName: my-pvc
    
  4. Wenden Sie das Manifest an:

    kubectl apply -f my-deployment.yaml
    
  5. Prüfen Sie den Status des Deployment:

    kubectl get deployment hello-app
    

    Es kann einige Zeit dauern, bis das Deployment bereit ist. Sie können den vorherigen Befehl so lange ausführen, bis eine Ausgabe wie diese angezeigt wird:

    NAME        READY   UP-TO-DATE   AVAILABLE   AGE
    hello-app   1/1     1            1           2m55s
    

Testdatei zum Volume hinzufügen

  1. Listen Sie die Pods im Deployment auf:

    kubectl get pods -l app=hello-app
    

    Die Ausgabe sieht in etwa so aus:

    NAME                         READY   STATUS    RESTARTS   AGE
    hello-app-6d7b457c7d-vl4jr   1/1     Running   0          2m56s
    
  2. Erstellen Sie in einem Pod eine Testdatei:

    kubectl exec POD_NAME \
        -- sh -c 'echo "Hello World!" > /usr/share/hello/hello.txt'
    

    Ersetzen Sie POD_NAME durch den Namen des Pod.

  3. Prüfen Sie, ob die Datei vorhanden ist:

    kubectl exec POD_NAME \
        -- sh -c 'cat /usr/share/hello/hello.txt'
    

    Die Ausgabe sieht in etwa so aus:

    Hello World!
    

Erstellen Sie ein VolumeSnapshotClass-Objekt

Erstellen Sie ein VolumeSnapshotClass-Objekt, um den CSI-Treiber und die deletionPolicy für Ihren Volume-Snapshot anzugeben. Sie können auf VolumeSnapshotClass-Objekte verweisen, wenn Sie VolumeSnapshot-Objekte erstellen.

  1. Speichern Sie das folgende Manifest als volumesnapshotclass.yaml.

    Persistent Disk

    Verwenden Sie die API-Version v1 für Cluster mit Version 1.21 oder höher.

    apiVersion: snapshot.storage.k8s.io/v1
    kind: VolumeSnapshotClass
    metadata:
      name: my-snapshotclass
    driver: pd.csi.storage.gke.io
    deletionPolicy: Delete
    

    In diesem Fall gilt Folgendes:

    • Das Feld driver wird vom CSI-Treiber zum Bereitstellen des Snapshots verwendet. In diesem Beispiel verwendet pd.csi.storage.gke.io den CSI-Treiber für nichtflüchtigen Speicher der Compute Engine.

    • Das Feld deletionPolicy teilt GKE mit, was mit dem VolumeSnapshotContent-Objekt und dem zugrunde liegenden Snapshot geschieht, wenn das gebundene VolumeSnapshot-Objekt gelöscht wird. Geben Sie Delete an, um das VolumeSnapshotContent-Objekt und den zugrunde liegenden Snapshot zu löschen. Geben Sie Retain an, wenn Sie VolumeSnapshotContent und den zugrunde liegenden Snapshot beibehalten möchten.

      Wenn Sie einen benutzerdefinierten Speicherort verwenden möchten, fügen Sie der Snapshot-Klasse den Parameter storage-locations hinzu. Zur Verwendung dieses Parameters muss die Version 1.21 oder höher auf Ihren Clustern ausgeführt werden.

      apiVersion: snapshot.storage.k8s.io/v1
      kind: VolumeSnapshotClass
      metadata:
        name: my-snapshotclass
      parameters:
        storage-locations: us-east2
      driver: pd.csi.storage.gke.io
      deletionPolicy: Delete
      
    • Fügen Sie dem Feld parameters Folgendes hinzu, um ein Laufwerk-Image zu erstellen:

      parameters:
        snapshot-type: images
        image-family: IMAGE_FAMILY
      

      Ersetzen Sie IMAGE_FAMILY durch den Namen Ihrer bevorzugten Image-Familie, z. B. preloaded-data.

  2. Wenden Sie das Manifest an:

    kubectl apply -f volumesnapshotclass.yaml
    

VolumeSnapshot erstellen

Ein VolumeSnapshot-Objekt ist eine Anfrage für einen Snapshot eines vorhandenen PersistentVolumeClaim-Objekts. Wenn Sie ein VolumeSnapshot-Objekt erstellen, erstellt GKE automatisch ein VolumeSnapshotContent-Objekt, das wie ein PersistentVolume-Objekt eine Ressource in Ihrem Cluster ist, und bindet es an dieses.

  1. Speichern Sie das folgende Manifest als volumesnapshot.yaml.

    apiVersion: snapshot.storage.k8s.io/v1
    kind: VolumeSnapshot
    metadata:
      name: my-snapshot
    spec:
      volumeSnapshotClassName: my-snapshotclass
      source:
        persistentVolumeClaimName: my-pvc
    
  2. Wenden Sie das Manifest an:

    kubectl apply -f volumesnapshot.yaml
    

    Nachdem Sie einen Volume erstellt haben, erstellt GKE ein entsprechendes VolumeSnapshotContent-Objekt im Cluster. Dieses Objekt speichert den Snapshot und die Bindungen von VolumeSnapshot-Objekten. Sie interagieren nicht direkt mit VolumeSnapshotContents-Objekten.

  3. Prüfen Sie, ob GKE das VolumeSnapshotContents-Objekt erstellt hat:

    kubectl get volumesnapshotcontents
    

    Die Ausgabe sieht in etwa so aus:

    NAME                                               AGE
    snapcontent-cee5fb1f-5427-11ea-a53c-42010a1000da   55s
    

Nachdem der Inhalt des Volume-Snapshots erstellt wurde, erstellt der CSI-Treiber, den Sie in VolumeSnapshotClass angegeben haben, einen Snapshot im entsprechenden Speichersystem. Nachdem GKE einen Snapshot im Speichersystem erstellt und mit einem VolumeSnapshot-Objekt im Cluster verknüpft hat, kann der Snapshot verwendet werden. Sie können den Status prüfen, indem Sie den folgenden Befehl ausführen:

kubectl get volumesnapshot \
  -o custom-columns='NAME:.metadata.name,READY:.status.readyToUse'

Wenn der Snapshot einsatzbereit ist, sieht die Ausgabe in etwa so aus:

NAME               READY
my-snapshot        true

Die Testdatei löschen

  1. Löschen Sie die erstellte Testdatei:

    kubectl exec POD_NAME \
        -- sh -c 'rm /usr/share/hello/hello.txt'
    
  2. Prüfen Sie, ob die Datei nicht mehr existiert:

    kubectl exec POD_NAME \
        -- sh -c 'cat /usr/share/hello/hello.txt'
    

    Die Ausgabe sieht in etwa so aus:

    cat: /usr/share/hello/hello.txt: No such file or directory
    

Volume-Snapshot wiederherstellen

Sie können auf einen VolumeSnapshot in einem PersistentVolumeClaim verweisen, um ein neues Volume mit Daten aus einem vorhandenen Volume bereitzustellen oder ein Volume in einem Zustand wiederherzustellen, den Sie im Snapshot erfasst haben.

Um auf einen VolumeSnapshot in einem PersistentVolumeClaim zu verweisen, fügen Sie das Feld dataSource zu Ihrem PersistentVolumeClaim hinzu. Derselbe Prozess wird verwendet, unabhängig davon, ob sich VolumeSnapshotContents auf ein Laufwerk-Image oder einen Snapshot bezieht.

In diesem Beispiel verweisen Sie auf den VolumeSnapshot, den Sie in einer neuen PersistentVolumeClaim erstellt haben, und aktualisieren das Deployment zur Verwendung der neuen Anforderung.

  1. Prüfen Sie, ob Sie einen Laufwerk- oder Image-Snapshot verwenden. Dieser unterscheidet sich so:

    • Laufwerk-Snapshots: Erstellen Sie häufig Snapshots und stellen Sie diese selten wieder her.
    • Image-Snapshots: Erstellen Sie selten Snapshots und stellen Sie diese häufig wieder her. Auch das Erstellen von Image-Snapshots kann langsamer sein als Laufwerk-Snapshots.

    Weitere Informationen finden Sie unter Limits für die Snapshot-Häufigkeit. Wenn Sie Ihren Snapshot-Typ kennen, können Sie Probleme beheben.

    Prüfen Sie VolumeSnapshot:

    kubectl describe volumesnapshot SNAPSHOT_NAME
    

    Das Feld volumeSnapshotClassName gibt die Snapshot-Klasse an.

    kubectl describe volumesnapshotclass SNAPSHOT_CLASS_NAME
    

    Der Parameter snapshot-type gibt snapshots oder images an. Wenn keine Angabe gemacht wird, lautet der Standardwert snapshots.

    Wenn keine Snapshot-Klasse vorhanden ist, z. B. wenn der Snapshot statisch erstellt wurde, prüfen Sie VolumeSnapshotContents. sh kubectl describe volumesnapshotcontents SNAPSHOT_CONTENTS_NAME Das Format eines Snapshot-Handles in der Ausgabe zeigt den Typ des Snapshots so an: * projects/PROJECT_NAME/global/snapshots/SNAPSHOT_NAME: Laufwerk-Snapshot

    • projects/PROJECT_NAME/global/images/IMAGE_NAME: Image-Snapshot
  1. Speichern Sie das folgende Manifest als pvc-restore.yaml:

    Persistent Disk

    apiVersion: v1
    kind: PersistentVolumeClaim
    metadata:
      name: pvc-restore
    spec:
      dataSource:
        name: my-snapshot
        kind: VolumeSnapshot
        apiGroup: snapshot.storage.k8s.io
      storageClassName: standard-rwo
      accessModes:
        - ReadWriteOnce
      resources:
        requests:
          storage: 1Gi
    
  2. Wenden Sie das Manifest an:

    kubectl apply -f pvc-restore.yaml
    
  3. Aktualisieren Sie die Datei my-deployment.yaml, um die neue PersistentVolumeClaim zu verwenden:

    ...
    volumes:
    - name: my-volume
      persistentVolumeClaim:
        claimName: pvc-restore
    
  4. Wenden Sie das aktualisierte Manifest an:

    kubectl apply -f my-deployment.yaml
    

Auf erfolgreiche Wiederherstellung des Snapshots prüfen

  1. Rufen Sie den Namen des neuen Pod ab, den GKE für das aktualisierte Deployment erstellt:

     kubectl get pods -l app=hello-app
    

Prüfen Sie, ob die Testdatei vorhanden ist:

   kubectl exec NEW_POD_NAME \
       -- sh -c 'cat /usr/share/hello/hello.txt'

Ersetzen Sie NEW_POD_NAME durch den Namen des neuen Pod, der von GKE erstellt wurde.

Die Ausgabe sieht in etwa so aus:

   Hello World!

Vorhandenen Snapshot importieren

Sie können einen vorhandenen Volume-Snapshot verwenden, der außerhalb des aktuellen Clusters erstellt wurde, um das VolumeSnapshotContents-Objekt manuell bereitzustellen. Sie können beispielsweise ein Volume in GKE mit einem Snapshot einer anderen Google Cloud-Ressource füllen, die in einem anderen Cluster erstellt wurde.

  1. Suchen Sie den Namen Ihres Snapshots.

    Google Cloud Console

    Rufen Sie https://console.cloud.google.com/compute/snapshots auf.

    Google Cloud CLI

    Führen Sie dazu diesen Befehl aus:

    gcloud compute snapshots list
    

    Die Ausgabe sieht in etwa so aus:

    NAME                                           DISK_SIZE_GB  SRC_DISK                                                     STATUS
    snapshot-5e6af474-cbcc-49ed-b53f-32262959a0a0  1             us-central1-b/disks/pvc-69f80fca-bb06-4519-9e7d-b26f45c1f4aa READY
    
  2. Speichern Sie das folgende VolumeSnapshot-Manifest als restored-snapshot.yaml.

    apiVersion: snapshot.storage.k8s.io/v1
    kind: VolumeSnapshot
    metadata:
      name: restored-snapshot
    spec:
      volumeSnapshotClassName: my-snapshotclass
      source:
        volumeSnapshotContentName: restored-snapshot-content
    
  3. Wenden Sie das Manifest an:

    kubectl apply -f restored-snapshot.yaml
    
  4. Speichern Sie das folgende VolumeSnapshotContent-Manifest als restored-snapshot-content.yaml. Ersetzen Sie das Feld snapshotHandle durch Ihre Projekt-ID und den Snapshot-Namen. Sowohl volumeSnapshotRef.name als auch volumeSnapshotRef.namespace müssen auf den zuvor erstellten VolumeSnapshot verweisen, damit die bidirektionale Bindung gültig ist.

    apiVersion: snapshot.storage.k8s.io/v1
    kind: VolumeSnapshotContent
    metadata:
      name: restored-snapshot-content
    spec:
      deletionPolicy: Retain
      driver: pd.csi.storage.gke.io
      source:
        snapshotHandle: projects/PROJECT_ID/global/snapshots/SNAPSHOT_NAME
      volumeSnapshotRef:
        kind: VolumeSnapshot
        name: restored-snapshot
        namespace: default
    
  5. Wenden Sie das Manifest an:

    kubectl apply -f restored-snapshot-content.yaml
    
  6. Speichern Sie das folgende PersistentVolumeClaim-Manifest als restored-pvc.yaml. Der Kubernetes-Speichercontroller sucht nach einem VolumeSnapshot mit dem Namen restored-snapshot und versucht dann, ein PersistentVolume als Datenquelle zu finden oder dynamisch zu erstellen. Sie können diesen PVC dann in einem Pod verwenden, um auf die wiederhergestellten Daten zuzugreifen.

    apiVersion: v1
    kind: PersistentVolumeClaim
    metadata:
      name: restored-pvc
    spec:
      dataSource:
        name: restored-snapshot
        kind: VolumeSnapshot
        apiGroup: snapshot.storage.k8s.io
      storageClassName: standard-rwo
      accessModes:
        - ReadWriteOnce
      resources:
        requests:
          storage: 1Gi
    
  7. Wenden Sie das Manifest an:

    kubectl apply -f restored-pvc.yaml
    
  8. Speichern Sie das folgende Pod-Manifest als restored-pod.yaml und verweisen Sie dabei auf den PersistentVolumeClaim. Der CSI-Treiber stellt ein PersistentVolume bereit und füllt es aus dem Snapshot aus.

    apiVersion: v1
    kind: Pod
    metadata:
      name: restored-pod
    spec:
      containers:
      - name: busybox
        image: busybox
        args:
        - sleep
        - "3600"
        volumeMounts:
        - name: source-data
          mountPath: /demo/data
      volumes:
      - name: source-data
        persistentVolumeClaim:
          claimName: restored-pvc
          readOnly: false
    
  9. Wenden Sie das Manifest an:

    kubectl apply -f restored-pod.yaml
    
  10. Prüfen Sie, ob die Datei wiederhergestellt wurde:

    kubectl exec restored-pod -- sh -c 'cat /demo/data/hello.txt'
    

Bereinigen

Mit den folgenden Schritten vermeiden Sie, dass Ihrem Google Cloud-Konto die in dieser Anleitung verwendeten Ressourcen in Rechnung gestellt werden:

  1. Löschen Sie das VolumeSnapshot:

    kubectl delete volumesnapshot my-snapshot
    
  2. Löschen Sie das VolumeSnapshotClass:

    kubectl delete volumesnapshotclass my-snapshotclass
    
  3. Löschen Sie das Deployment:

    kubectl delete deployments hello-app
    
  4. PersistentVolumeClaim-Objekte löschen:

    kubectl delete pvc my-pvc pvc-restore
    

Nächste Schritte