Kubernetes Volume Snapshots

← All Topics

Was sind Volume Snapshots?

Ein Volume Snapshot spiegelt den Zustand eines Persistent Volumes zu einem bestimmten Zeitpunkt wieder. Dazu erstellt das unterliegende Dateisystem eine COW-Kopie der veränderten Daten. Diese Kopie verbraucht kaum Speicherplatz, lediglich wenn am Persistent Volume etwas geändert wird, muss der Zustand zum Zeitpunkt des Snapshots kopiert und somit erneut gespeichert werden. Bei der Wiederherstellung eines Snapshots in ein neues PVC wird der gleiche Speicherplatz benötigt, den das ursprüngliche PVC zum Erstellungszeitpunkt belegt hat.

Sie können Volume Snapshots verwenden um PVCs zu klonen, ein Backup vor einer Migration zu erstellen oder um PVCs mit einem Snapshot vorbereitend mit Inhalten zu befüllen.

Komponenten von Volume Snapshots

Damit Sie einen Volume Snapshot erstellen können, benötigt es in Kubernetes verschiedene Ressourcen. Sie können in der folgenden Gegenüberstellung sehen was von uns, von Kubernetes und von Ihnen erstellt wird.

Klassischer Storage in Kubernetes Snapshots in Kubernetes
StorageClass (werden von uns bereitgestellt: rook-ceph-block, rook-cephfs, local-path) VolumeSnapshotClass (werden von uns bereitgestellt: csi-rbdplugin-snapclass, csi-cephfsplugin-snapclass)
PersistentVolume (wird von Kubernetes verwaltet) volumesnapshot.snapshot.storage.k8s.io (wird von Ihnen erstellt)
PersistentVolumeClaim (wird von Ihnen erstellt) volumesnapshotcontents.snapshot.storage.k8s.io (wird von Kubernetes verwaltet)

Snapshots werden aktuell nur von sogenannten CSI Drivern unterstützt, deshalb können wir diese nur für Ceph anbieten.

Wie erstellen Sie einen Volume Snapshot?

Abhängig von der StorageClass des originalen PVCs muss der Snapshot mit einer anderen volumeSnapshotClass erstellt werden. Hier gilt bei uns:

  • rook-ceph-block --> csi-rbdplugin-snapclass
  • rook-cephfs --> csi-cephfsplugin-snapclass

Um einen Snapshot von einem fiktiven PVC mit dem Namen "test1" im Namespace "snapshot-testing" zu erstellen legen Sie eine Datei (snapshot.yaml) mit dem folgenden Inhalt an

apiVersion: snapshot.storage.k8s.io/v1
kind: VolumeSnapshot
metadata:
  name: test1-snapshot
  namespace: snapshot-testing
spec:
  volumeSnapshotClassName: csi-rbdplugin-snapclass
  source:
    persistentVolumeClaimName: test1

Den Volume Snapshot erstellen Sie dann mit dem folgenden Befehl:

kubectl apply -f snapshot.yaml

Kubernetes erzeugt nun die dazugehörigen Inhalt (VolumeSnapshotContent). Sie können den Snapshot erst verwenden sobald dieser als "ReadyToUse" markiert ist. Sie können dies überprüfen indem Sie den folgenden Befehl nutzen:

kubectl get volumesnapshot.snapshot.storage.k8s.io -n snapshot-testing
NAMESPACE         NAME            READYTOUSE  SOURCEPVC  SOURCESNAPSHOTCONTENT  RESTORESIZE  SNAPSHOTCLASS            ...
snapshot-testing  test1-snapshot  true        test1                             8Gi          csi-rbdplugin-snapclass  ...

 

Verwendung eines Volume Snapshot

Um einen von Ihnen erstellten Snapshot (test1-snapshot) in ein neues PVC (test1-restore) wiederherzustellen legen Sie folgende Datei (snapshot-restore.yaml) an:

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: test1-restore
  namespace: snapshot-testing
spec:
  storageClassName: rook-ceph-block
  dataSource:
    name: test1-snapshot
    kind: VolumeSnapshot
    apiGroup: snapshot.storage.k8s.io
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 8Gi

Und wie bereits zuvor legen Sie die Ressource auf dem Cluster an:

kubectl apply -f snapshot-restore.yaml

Um ein PVC "test2" im Namespace "test" in ein neues PVC "test2-clone" zu klonen können Sie die folgende Datei (pvc-clone.yaml) anlegen:

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: test2-clone
  namespace: test
spec:
  storageClassName: rook-ceph-block
  dataSource:
    name: test2
    kind: PersistentVolumeClaim
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 1Gi

Nun legen Sie die Ressource auf dem Kubernetes Cluster an:

kubectl apply -f pvc-clone.yaml

Das geklonte oder wiederhergestellte PVC können Sie nun wie gewohnt in Ihren Deployments verwenden.