Mit Snapshots arbeiten
Kubernetes-Volume-Snapshots von Persistent Volumes (PVs) ermöglichen zeitpunktgenaue Kopien von Volumes. Sie können einen Snapshot eines mit Trident erstellten Volumes erstellen, einen außerhalb von Trident erstellten Snapshot importieren, ein neues Volume aus einem vorhandenen Snapshot erstellen und Volume-Daten aus Snapshots wiederherstellen.
Überblick
Volume-Snapshot wird von ontap-nas, ontap-nas-flexgroup, ontap-san, ontap-san-economy, solidfire-san, azure-netapp-files und google-cloud-netapp-volumes Treibern unterstützt.
Sie benötigen einen externen Snapshot-Controller und benutzerdefinierte Ressourcendefinitionen (CRDs), um mit Snapshots zu arbeiten. Dies ist die Aufgabe des Kubernetes-Orchestrators (zum Beispiel: Kubeadm, GKE, OpenShift).
Falls Ihre Kubernetes-Distribution den Snapshot-Controller und die CRDs nicht enthält, lesen Sie Einen Volume Snapshot Controller bereitstellen.
|
|
Erstellen Sie keinen Snapshot-Controller, wenn Sie in einer GKE-Umgebung bedarfsgesteuerte Volume-Snapshots erstellen. GKE verwendet einen integrierten, versteckten Snapshot-Controller. |
Erstellen Sie einen Volume-Snapshot
-
Erstellen Sie ein
VolumeSnapshotClass. Weitere Informationen finden Sie unter "VolumeSnapshotClass".-
Der
driververweist auf den Trident CSI driver. -
deletionPolicykannDeleteoderRetainsein. Wenn aufRetaingesetzt, bleibt der zugrunde liegende physische Snapshot auf dem Speichercluster auch dann erhalten, wenn dasVolumeSnapshotObjekt gelöscht wird.Beispielcat snap-sc.yaml
apiVersion: snapshot.storage.k8s.io/v1 kind: VolumeSnapshotClass metadata: name: csi-snapclass driver: csi.trident.netapp.io deletionPolicy: Delete
-
-
Erstellen Sie einen Snapshot eines bestehenden PVC.
Beispiele-
Dieses Beispiel erstellt eine Snapshot eines bestehenden PVC.
cat snap.yaml
apiVersion: snapshot.storage.k8s.io/v1 kind: VolumeSnapshot metadata: name: pvc1-snap spec: volumeSnapshotClassName: csi-snapclass source: persistentVolumeClaimName: pvc1 -
Dieses Beispiel erstellt ein Volume-Snapshot-Objekt für eine PVC mit dem Namen
pvc1und der Name des Snapshots wird aufpvc1-snapgesetzt. Ein VolumeSnapshot ist analog zu einer PVC und ist mit einemVolumeSnapshotContentObjekt verknüpft, das den eigentlichen Snapshot darstellt.kubectl create -f snap.yaml volumesnapshot.snapshot.storage.k8s.io/pvc1-snap created kubectl get volumesnapshots NAME AGE pvc1-snap 50s
-
Sie können das
VolumeSnapshotContentObjekt für daspvc1-snapVolumeSnapshot identifizieren, indem Sie es beschreiben. DasSnapshot Content Nameidentifiziert das VolumeSnapshotContent Objekt, das diesem Snapshot dient. DerReady To UseParameter zeigt an, dass der Snapshot zur Erstellung eines neuen PVC verwendet werden kann.kubectl describe volumesnapshots pvc1-snap Name: pvc1-snap Namespace: default ... Spec: Snapshot Class Name: pvc1-snap Snapshot Content Name: snapcontent-e8d8a0ca-9826-11e9-9807-525400f3f660 Source: API Group: Kind: PersistentVolumeClaim Name: pvc1 Status: Creation Time: 2019-06-26T15:27:29Z Ready To Use: true Restore Size: 3Gi ...
-
Erstellen Sie eine PVC aus einem Volume-Snapshot
Sie können dataSource verwenden, um eine PVC mithilfe eines VolumeSnapshot mit dem Namen <pvc-name> als Datenquelle zu erstellen. Nachdem die PVC erstellt wurde, kann sie einem Pod zugeordnet und wie jede andere PVC verwendet werden.
|
|
Die PVC wird im selben Backend wie das Quellvolume erstellt. Siehe "KB: Die Erstellung eines PVC aus einem Trident PVC Snapshot kann in einem alternativen Backend nicht durchgeführt werden". |
Im folgenden Beispiel wird die PVC unter Verwendung von pvc1-snap als Datenquelle erstellt.
cat pvc-from-snap.yaml
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: pvc-from-snap
spec:
accessModes:
- ReadWriteOnce
storageClassName: golden
resources:
requests:
storage: 3Gi
dataSource:
name: pvc1-snap
kind: VolumeSnapshot
apiGroup: snapshot.storage.k8s.io
Importieren eines Volume-Snapshots
Trident unterstützt die "Kubernetes pre-provisioned Snapshot-Prozess", damit der Cluster-Administrator ein VolumeSnapshotContent-Objekt erstellen und außerhalb von Trident erstellte Snapshots importieren kann.
Trident muss das übergeordnete Volume des Snapshots erstellt oder importiert haben.
-
Cluster-Administrator: Erstellen Sie ein
VolumeSnapshotContentObjekt, das auf den Backend-Snapshot verweist. Dadurch wird der Snapshot-Workflow in Trident gestartet.-
Geben Sie den Namen des Backend-Snapshots in
annotationsalstrident.netapp.io/internalSnapshotName: <"backend-snapshot-name">an. -
Geben Sie
<name-of-parent-volume-in-trident>/<volume-snapshot-content-name>insnapshotHandlean. Dies ist die einzige Information, die Trident vom externen Snapshotter imListSnapshots-Aufruf bereitgestellt wird.Der <volumeSnapshotContentName>kann aufgrund von Namensbeschränkungen der CRs nicht immer mit dem Backend-Snapshot-Namen übereinstimmen.BeispielDas folgende Beispiel erstellt ein
VolumeSnapshotContentObjekt, das auf einen Backend-Snapshotsnap-01verweist.
apiVersion: snapshot.storage.k8s.io/v1 kind: VolumeSnapshotContent metadata: name: import-snap-content annotations: trident.netapp.io/internalSnapshotName: "snap-01" # This is the name of the snapshot on the backend spec: deletionPolicy: Retain driver: csi.trident.netapp.io source: snapshotHandle: pvc-f71223b5-23b9-4235-bbfe-e269ac7b84b0/import-snap-content # <import PV name or source PV name>/<volume-snapshot-content-name> volumeSnapshotRef: name: import-snap namespace: default -
-
Cluster-Administrator: Erstellen Sie das
VolumeSnapshotCR, das auf dasVolumeSnapshotContentObjekt verweist. Dadurch wird der Zugriff auf die Verwendung desVolumeSnapshotin einem bestimmten Namespace angefordert.BeispielDas folgende Beispiel erstellt ein
VolumeSnapshotCR mit dem Namenimport-snap, das auf dasVolumeSnapshotContentmit dem Namenimport-snap-contentverweist.apiVersion: snapshot.storage.k8s.io/v1 kind: VolumeSnapshot metadata: name: import-snap spec: # volumeSnapshotClassName: csi-snapclass (not required for pre-provisioned or imported snapshots) source: volumeSnapshotContentName: import-snap-content -
Interne Verarbeitung (keine Aktion erforderlich): Der externe Snapshotter erkennt den neu erstellten
VolumeSnapshotContentund führt denListSnapshots-Aufruf aus. Trident erstellt dasTridentSnapshot.-
Der externe Snapshotter setzt das
VolumeSnapshotContentaufreadyToUseund dasVolumeSnapshotauftrue. -
Trident kehrt zurück
readyToUse=true.
-
-
Beliebiger Benutzer: Erstellen Sie ein
PersistentVolumeClaim, um auf das neueVolumeSnapshotzu verweisen, wobei derspec.dataSource(oderspec.dataSourceRef) Name derVolumeSnapshotName ist.BeispielDas folgende Beispiel erstellt eine PVC, die auf die
VolumeSnapshotmit dem Namenimport-snapverweist.apiVersion: v1 kind: PersistentVolumeClaim metadata: name: pvc-from-snap spec: accessModes: - ReadWriteOnce storageClassName: simple-sc resources: requests: storage: 1Gi dataSource: name: import-snap kind: VolumeSnapshot apiGroup: snapshot.storage.k8s.io
Stellen Sie Volumendaten mithilfe von Snapshots wieder her
Das Snapshot-Verzeichnis ist standardmäßig ausgeblendet, um maximale Kompatibilität von Volumes zu gewährleisten, die mit den ontap-nas und `ontap-nas-economy`Treibern bereitgestellt wurden. Aktivieren Sie das `.snapshot`Verzeichnis, um Daten direkt aus Snapshots wiederherzustellen.
Verwenden Sie die ONTAP CLI volume snapshot restore, um ein Volume auf einen Zustand wiederherzustellen, der in einem früheren Snapshot aufgezeichnet wurde.
cluster1::*> volume snapshot restore -vserver vs0 -volume vol3 -snapshot vol3_snap_archive
|
|
Beim Wiederherstellen einer Snapshot-Kopie wird die bestehende Volume-Konfiguration überschrieben. Änderungen an den Volume-Daten, die nach der Erstellung der Snapshot-Kopie vorgenommen wurden, gehen verloren. |
In-Place-Volume-Wiederherstellung aus einem Snapshot
Trident ermöglicht die schnelle, direkte Wiederherstellung von Volumes aus einem Snapshot mithilfe des TridentActionSnapshotRestore (TASR) CR. Dieser CR fungiert als imperative Kubernetes-Aktion und bleibt nach Abschluss des Vorgangs nicht erhalten.
Trident unterstützt die Snapshot-Wiederherstellung auf den ontap-san, ontap-san-economy, ontap-nas, ontap-nas-flexgroup, azure-netapp-files, google-cloud-netapp-volumes und solidfire-san-Treibern.
Sie müssen ein gebundenes PVC und einen verfügbaren Volume Snapshot haben.
-
Überprüfen Sie, ob der PVC-Status gebunden ist.
kubectl get pvc -
Prüfen Sie, ob der Volume-Snapshot einsatzbereit ist.
kubectl get vs
-
Erstellen Sie den TASR CR. Dieses Beispiel erstellt einen CR für PVC
pvc1und Volume Snapshotpvc1-snapshot.Der TASR CR muss sich in einem Namespace befinden, in dem der PVC und der VS existieren. cat tasr-pvc1-snapshot.yamlapiVersion: trident.netapp.io/v1 kind: TridentActionSnapshotRestore metadata: name: trident-snap namespace: trident spec: pvcName: pvc1 volumeSnapshotName: pvc1-snapshot -
Wenden Sie die CR an, um aus dem Snapshot wiederherzustellen. Dieses Beispiel stellt aus dem Snapshot
pvc1wieder her.kubectl create -f tasr-pvc1-snapshot.yamltridentactionsnapshotrestore.trident.netapp.io/trident-snap created
Trident stellt die Daten aus dem Snapshot wieder her. Sie können den Status der Snapshot-Wiederherstellung überprüfen:
kubectl get tasr -o yaml
apiVersion: trident.netapp.io/v1
items:
- apiVersion: trident.netapp.io/v1
kind: TridentActionSnapshotRestore
metadata:
creationTimestamp: "2023-04-14T00:20:33Z"
generation: 3
name: trident-snap
namespace: trident
resourceVersion: "3453847"
uid: <uid>
spec:
pvcName: pvc1
volumeSnapshotName: pvc1-snapshot
status:
startTime: "2023-04-14T00:20:34Z"
completionTime: "2023-04-14T00:20:37Z"
state: Succeeded
kind: List
metadata:
resourceVersion: ""
|
|
|
Löschen eines PV mit zugehörigen Snapshots
Beim Löschen eines Persistent Volume mit zugehörigen Snapshots wird das entsprechende Trident volume in den Status „Deleting state“ versetzt. Entfernen Sie die Volume-Snapshots, um das Trident volume zu löschen.
Einen Volume Snapshot Controller bereitstellen
Falls Ihre Kubernetes-Distribution den Snapshot-Controller und die CRDs nicht enthält, können Sie sie wie folgt bereitstellen.
-
Erstellen Sie Volume Snapshot-CRDs.
cat snapshot-setup.sh
#!/bin/bash # Create volume snapshot CRDs kubectl apply -f https://raw.githubusercontent.com/kubernetes-csi/external-snapshotter/release-6.1/client/config/crd/snapshot.storage.k8s.io_volumesnapshotclasses.yaml kubectl apply -f https://raw.githubusercontent.com/kubernetes-csi/external-snapshotter/release-6.1/client/config/crd/snapshot.storage.k8s.io_volumesnapshotcontents.yaml kubectl apply -f https://raw.githubusercontent.com/kubernetes-csi/external-snapshotter/release-6.1/client/config/crd/snapshot.storage.k8s.io_volumesnapshots.yaml -
Erstellen Sie den Snapshot Controller.
kubectl apply -f https://raw.githubusercontent.com/kubernetes-csi/external-snapshotter/release-6.1/deploy/kubernetes/snapshot-controller/rbac-snapshot-controller.yamlkubectl apply -f https://raw.githubusercontent.com/kubernetes-csi/external-snapshotter/release-6.1/deploy/kubernetes/snapshot-controller/setup-snapshot-controller.yamlÖffnen Sie bei Bedarf deploy/kubernetes/snapshot-controller/rbac-snapshot-controller.yamlund aktualisieren Sienamespaceauf Ihren Namespace.