Volume aus einem Snapshot wiederherstellen

In diesem Dokument wird beschrieben, wie Sie einen Volume-Snapshot erstellen und dann das Volume mithilfe des Snapshots wiederherstellen. Die folgende Anleitung gilt für Cluster, die den vSphere CSI-Treiber verwenden.

Vorbereitung

Lesen Sie Mit dem vSphere-CSI-Treiber (Container Storage Interface) arbeiten.

Prüfen Sie, ob Ihr Cluster eine StorageClass mit dem Namen standard-rwo hat und der vSphere CSI-Treiber installiert ist.

Die vSphere-Version, ESXi und vCenter Server müssen Version 7.0 Update 3 oder höher sein. Weitere Informationen finden Sie unter Fehlerbehebung bei Speicherproblemen.

Die einzelnen Schritte im Überblick

Das sind die wichtigsten Schritte der in diesem Dokument beschriebenen Übung:

  1. PersistentVolumeClaim erstellen.
    Erstellen Sie einen PersistentVolumeClaim, der die Speicherklasse standard-rwo anfordert. Der Cluster stellt dann dynamisch ein PersistentVolume bereit und verknüpft es mit Ihrem PersistentVolumeClaim.
  2. Deployment erstellen.
    Erstellen Sie ein Deployment mit einem Pod. Der Pod gibt ein Volume an, das auf Ihrem PersistentVolumeClaim basiert. Der einzige Container im Pod stellt das Volume unter /hello/ bereit.
  3. Schreiben Sie eine Datei in das Pod-Volume.
    Erstellen Sie im Pod-Volume eine Datei mit dem Namen hello.txt. Der Inhalt der Datei lautet „Hallo Welt!“.
  4. VolumeSnapshot erstellen.
    Erstellen Sie einen VolumeSnapshot, der den Status des Pod-Volumes erfasst.
  5. Die Datei beschädigen.
    Ändern Sie die Datei hello.txt so, dass sie wie eine beschädigte Datei aussieht. Der Inhalt der Datei lautet jetzt „Hallo W-corrupted-file-orld!“.
  6. Verwenden Sie den Snapshot, um das Volume wiederherzustellen.
    Erstellen Sie einen zweiten PersistentVolumeClaim, der Ihren VolumeSnapshot als Datenquelle verwendet. Bearbeiten Sie die Bereitstellung so, dass das Volume mit dem neuen PersistentVolumeClaim verknüpft ist. Prüfen Sie dann, ob die hello.txt-Datei wiederhergestellt wurde.

PersistentVolumeClaim erstellen

Hier ist ein Manifest für einen PersistentVolumeClaim:

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

Im vorherigen Manifest ist storageClassName auf standard-rwo festgelegt. Dies ist die Speicherklasse, die mit dem vSphere CSI-Treiber verknüpft ist.

Speichern Sie das Manifest in einer Datei mit dem Namen my-pvc.yaml: PersistentVolumeClaim erstellen und aufrufen:

kubectl --kubeconfig CLUSTER_KUBECONFIG apply -f my-pvc.yaml

kubectl --kubeconfig CLUSTER_KUBECONFIG get pvc my-pvc

In der Ausgabe sehen Sie, dass der PersistentVolumeClaim an ein dynamisch bereitgestelltes PersistentVolume gebunden ist. In der folgenden Ausgabe ist beispielsweise zu sehen, dass der PersistentVolumeClaim my-pvc an ein PersistentVolume namens pvc-467d211c-26e4-4d69-aaa5-42219aee6fd5 gebunden ist:

my-pvc   Bound    pvc-467d211c-26e4-4d69-aaa5-42219aee6fd5  …  standard-rwo   100s

Deployment erstellen

Hier ist ein Manifest für ein Deployment:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: my-deployment
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: my-volume
          mountPath: /hello/
      volumes:
      - name: my-volume
        persistentVolumeClaim:
          claimName: my-pvc

Im Zusammenhang mit dieser Übung sind dies die wichtigsten Punkte zum Verständnis des vorherigen Bereitstellungsmanifests:

  • Der Pod fordert Speicher an, indem er den zuvor erstellten PersistentVolumeClaim my-pvc angibt.

  • Der Pod hat einen Container und der Container stellt das Volume unter /hello/ bereit.

Speichern Sie das Manifest in einer Datei mit dem Namen my-deployment.yaml und erstellen Sie die Bereitstellung:

kubectl --kubeconfig CLUSTER_KUBECONFIG apply -f my-deployment.yaml

Die Bereitstellung hat einen Pod. Rufen Sie den Namen des Pods ab:

kubectl --kubeconfig CLUSTER_KUBECONFIG get pods

Notieren Sie sich den Pod-Namen. In der folgenden Ausgabe lautet der Pod-Name beispielsweise my-deployment-7575c4f5bf-r59nt:

my-deployment-7575c4f5bf-r59nt   1/1     Running   0          65s

Erstellen Sie eine Datei im Pod-Volume und rufen Sie sie auf.

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

kubectl --kubeconfig CLUSTER_KUBECONFIG \
    exec POD_NAME \
    -- sh -c 'cat /hello/hello.txt'

Die Ausgabe zeigt den Inhalt der Datei /hello/hello.txt:

Hello World!

Snapshot erstellen

Hier ist ein Manifest für einen VolumeSnapshot:

apiVersion: snapshot.storage.k8s.io/v1
kind: VolumeSnapshot
metadata:
  name: my-snapshot
spec:
  volumeSnapshotClassName: csi-vsphere-snapshot-class
  source:
    persistentVolumeClaimName: my-pvc

Speichern Sie das Manifest in einer Datei mit dem Namen my-snapshot.yaml und erstellen Sie den VolumeSnapshot:

kubectl --kubeconfig CLUSTER_KUBECONFIG apply -f my-snapshot.yaml

Datei im Volume beschädigen

Ändern Sie den Inhalt der hello.txt so, dass es so aussieht, als wäre sie beschädigt:

kubectl --kubeconfig CLUSTER_KUBECONFIG \
    exec POD_NAME \
    -- sh -c 'echo "Hello W-corrupted-file-orld!" > /hello/hello.txt'

kubectl --kubeconfig CLUSTER_KUBECONFIG \
    exec POD_NAME \
    -- sh -c 'cat /hello/hello.txt'

In der Ausgabe sehen Sie, dass die Datei geändert wurde:

Hello W-corrupted-file-orld!

Wiederherstellen

Dies ist ein Manifest für einen zweiten PersistentVolumeClaim:

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: my-pvc-2
spec:
  storageClassName: standard-rwo
  dataSource:
    name: my-snapshot
    kind: VolumeSnapshot
    apiGroup: snapshot.storage.k8s.io
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 5Gi

Im vorherigen Manifest sehen Sie, dass die Datenquelle für den neuen PersistentVolumeClaim der zuvor erstellte VolumeSnapshot ist.

Speichern Sie das Manifest in einer Datei mit dem Namen my-pvc-2.yaml: PersistentVolumeClaim erstellen und aufrufen:

kubectl --kubeconfig CLUSTER_KUBECONFIG apply -f my-pvc-2.yaml

kubectl --kubeconfig CLUSTER_KUBECONFIG get pvc my-pvc-2

Öffnen Sie die Bereitstellung zum Bearbeiten:

kubectl --kubeconfig CLUSTER_KUBECONFIG edit deployment my-deployment

Ändern Sie my-pvc in my-pvc-2 und schließen Sie den Editor:

…
  volumes:
  - name: my-volume
    persistentVolumeClaim:
    claimName: my-pvc-2

Die Bereitstellung löscht den Pod und erstellt einen neuen Pod, der den neuen PersistentVolumeClaim verwendet.

Warten Sie einige Minuten und rufen Sie dann den neuen Pod-Namen ab:

kubectl --kubeconfig CLUSTER_KUBECONFIG get pods

Prüfen Sie, ob das Pod-Volume wiederhergestellt wurde:

kubectl --kubeconfig CLUSTER_KUBECONFIG \
   exec NEW_POD_NAME \
   -- sh -c 'cat /hello/hello.txt'

Die Ausgabe zeigt, dass das Volume wiederhergestellt wurde:

Hello World!

Fehlerbehebung

Eine Anleitung zur Fehlerbehebung finden Sie unter Fehlerbehebung bei Speicherproblemen.