Snapshot von PersistentVolume erstellen

Sie können die Volume-Snapshot-Funktion von Kubernetes für nichtflüchtige Volumes und dynamische Bereitstellung in Ihren GKE-Clustern verwenden.

Mit Volume-Snapshots können Sie eine Kopie Ihres Volumes zu einem bestimmten Zeitpunkt erstellen. Mit dieser Kopie können Sie ein Volume auf einen vorherigen Zustand zurücksetzen oder ein Ersatz-Volume bereitstellen.

Sie können Volume-Snapshots mit den folgenden Komponenten bereitstellen und anhängen:

Voraussetzungen

Wenn Sie Volume-Snapshots in GKE on Azure verwenden möchten, benötigen Sie Folgendes:

  • Volume mit einem CSI-Treiber (Container Storage Interface), der Snapshots unterstützt. Die von GKE on Azure verwendeten Azure Disk- und Azure-Dateitreiber unterstützen standardmäßig Snapshots.

    Eine Liste aller CSI-Treiber, die Snapshots unterstützen, finden Sie in der Kubernetes-Dokumentation in der Spalte "Weitere Funktionen" unter Treiber.

  • 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: disk.csi.azure.com oder file.csi.azure.com enthält. Wenn der Cluster wie im Folgenden beschrieben dynamisch PersistentVolumes vom CSI-Treiber bereitstellt, wird er vom CSI-Treiber verwaltet.

Hinweise

Volume-Snapshot erstellen und verwenden

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

  1. Beispiel für PersistentVolumeClaim und Pod erstellen
  2. VolumeSnapshot erstellen
  3. Volume-Snapshot wiederherstellen
  4. Prüfen, ob die Wiederherstellung funktioniert hat

So verwenden Sie einen Volume-Snapshot:

  1. Erstellen Sie ein VolumeSnapshot-Objekt, um einen Snapshot eines vorhandenen PersistentVolumeClaim anzufragen.
  2. Verweisen Sie auf die VolumeSnapshot in einer PersistentVolumeClaim, um ein Volume anhand dieses Snapshots wiederherzustellen oder ein neues Volume zu erstellen mithilfe dieses Snapshots.

Beispiel für PersistentVolumeClaim und Pod erstellen

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

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

    Für spec.storageClassName können Sie jede Speicherklasse angeben, die einen unterstützten CSI-Treiber verwendet. In diesem Beispiel wird die Standardspeicherklasse standard-rwo verwendet.

  2. Wenden Sie das Manifest an:

    kubectl apply -f example-pvc.yaml
    
  3. Erstellen Sie einen Pod, der das aktuelle Datum und die aktuelle Uhrzeit in das Volume schreibt. Speichern Sie zum Erstellen eines Pods das folgende Manifest als snapshot-shell.yaml:

    apiVersion: v1
    kind: Pod
    metadata:
      name: snapshot-shell
    spec:
      terminationGracePeriodSeconds: 10
      containers:
      - name: linux
        image: ubuntu:bionic
        command: ["/bin/sh"]
        args: ["-c", "echo $(date -u) >> /data/out.txt"]
        volumeMounts:
        - name: snapshot-volume
          mountPath: /data
      restartPolicy: Never
      volumes:
      - name: snapshot-volume
        persistentVolumeClaim:
          claimName: example-pvc
    
  4. Wenden Sie das Manifest an:

    kubectl apply -f snapshot-shell.yaml
    
  5. Prüfen Sie den Pod-Status:

    kubectl get pod snapshot-shell
    

    Es kann einige Zeit dauern, bis der Pod abschließend ausgeführt wurde. Sie können den vorherigen Befehl so lange ausführen, bis eine Ausgabe wie diese angezeigt wird:

    NAME             READY   STATUS      RESTARTS   AGE
    snapshot-shell   0/1     Completed   0          24s
    

VolumeSnapshot erstellen

Ein VolumeSnapshot-Objekt ist eine Anfrage für einen Snapshot eines vorhandenen PersistentVolumeClaim-Objekts. Wenn Sie ein VolumeSnapshot-Objekt erstellen, erstellt der Cluster 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: example-snapshot
    spec:
      source:
        persistentVolumeClaimName: example-pvc
    
  2. Wenden Sie das Manifest an:

    kubectl apply -f volumesnapshot.yaml
    

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

  3. Prüfen Sie, ob der Cluster das Objekt VolumeSnapshotContents erstellt hat:

    kubectl get volumesnapshotcontents
    

    Die Ausgabe sieht in etwa so aus:

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

Prüfen, ob der Volume-Snapshot bereit ist

Nachdem der Inhalt des Volume-Snapshots erstellt wurde, erstellt der CSI-Treiber, den Sie in VolumeSnapshotClass angegeben haben, einen Snapshot im entsprechenden Speichersystem. Nachdem der Cluster einen Snapshot im Speichersystem erstellt und an ein VolumeSnapshot-Objekt gebunden 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
example-snapshot        true

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.

In diesem Beispiel verweisen Sie auf den VolumeSnapshot, den Sie in einem neuen PersistentVolumeClaim erstellt haben, und erstellen einen Pod, der die PersistentVolumeClaim bereitstellt.

  1. Speichern Sie das folgende Manifest als pvc-restore.yaml:

    apiVersion: v1
    kind: PersistentVolumeClaim
    metadata:
     name: pvc-restore
    spec:
     dataSource:
       name: example-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. Starten Sie einen temporären Pod, der den PVC im Pod bereitstellt und den Inhalt von out.txt in Logs ausgibt.

    Speichern Sie das folgende Manifest als restore-log.yaml:

    apiVersion: v1
    kind: Pod
    metadata:
      name: restore-verify
    spec:
      volumes:
        - name: restore-data
          persistentVolumeClaim:
            claimName: pvc-restore
      containers:
        - name: shell-container
          image: ubuntu:bionic
          volumeMounts:
            - mountPath: "/data"
              name: restore-data
          command: [ "/bin/sh" ]
          args: ["-c", "cat /data/out.txt", "exit", "1"]
      restartPolicy: Never
    
  4. Wenden Sie das Manifest an:

    kubectl apply -f restore-log.yaml
    

Auf erfolgreiche Wiederherstellung des Snapshots prüfen

Der im vorherigen Schritt erstellte Pod liest aus dem Snapshot. Verwenden Sie den Befehl kubectl logs, um die Daten aus dem Snapshot aufzurufen.

kubectl logs restore-verify

Die Ausgabe sollte einen Zeitstempel aus dem Snapshot enthalten.

Bereinigen

So vermeiden Sie, dass Ihnen die auf dieser Seite verwendeten Ressourcen in Rechnung gestellt werden:

  1. Löschen Sie das VolumeSnapshot:

    kubectl delete volumesnapshot example-snapshot
    

  2. Löschen Sie den temporären Pod:

    kubectl delete -f restore-log.yaml
    
  3. Löschen Sie den Pod:

    kubectl delete -f snapshot-shell.yaml
    
  4. PersistentVolumeClaim-Objekte löschen:

    kubectl delete pvc example-pvc pvc-restore
    

Nächste Schritte