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:
Verwenden Sie einen CSI-Treiber, der Snapshots unterstützt. Der integrierte Treiber für nichtflüchtige Speicher unterstützt keine Snapshots. Zum Erstellen und Verwalten von Snapshots müssen Sie denselben CSI-Treiber wie den zugrunde liegenden
PersistentVolumeClaim
(PVC) verwenden.Verwenden Sie für Snapshots von nichtflüchtigen Speichern (Persistent Disk, PD) den CSI-Treiber für nichtflüchtigen Speicher der Compute Engine. Der CSI-Treiber für nichtflüchtigen Speicher der Compute Engine wird standardmäßig auf neuen Linux-Clustern installiert, auf denen GKE Version 1.18.10-gke.2100 oder höher oder Version 1.19.3-gke.2100 oder höher ausgeführt wird. Sie können auch den CSI-Treiber für nichtflüchtigen Speicher der Compute Engine auf einem vorhandenen Cluster aktivieren.
Eine Liste aller CSI-Treiber, die Snapshots unterstützen, finden Sie in der Kubernetes-Dokumentation in der Spalte Weitere Funktionen unter Treiber.
Verwenden Sie die Version 1.17 oder höher der Steuerungsebene. Zur Verwendung des CSI-Treibers für nichtflüchtigen Speicher der Compute Engine in einem
VolumeSnapshot
verwenden Sie die GKE-Versionen 1.17.6-gke.4 oder höher.
- Sie benötigen einen vorhandenen
PersistentVolumeClaim
, der für einen Snapshot verwendet werden kann. DerPersistentVolume
, 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 diePersistentVolume
-Spezifikation den Abschnittcsi
mitdriver: pd.csi.storage.gke.io
oderfilestore.csi.storage.gke.io
enthält. Wenn dasPersistentVolume
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:
- Eine
PersistentVolumeClaim
und einDeployment
erstellen. - Dem
PersistentVolume
eine Datei hinzufügen, die vomDeployment
verwendet wird. - Ein
VolumeSnapshotClass
erstellen, um den Snapshot zu konfigurieren - Einen Volume-Snapshot vom
PersistentVolume
erstellen - Die Testdatei löschen
- Stellen Sie
PersistentVolume
auf den von Ihnen erstellten Snapshot wieder her. - Prüfen, ob die Wiederherstellung funktioniert hat
So verwenden Sie einen Volume-Snapshot:
- Erstellen Sie ein
VolumeSnapshotClass
-Objekt, um die CSI-Treiber- und Löschrichtlinie für Ihren Snapshot anzugeben. - Erstellen Sie ein
VolumeSnapshot
-Objekt, um einen Snapshot eines vorhandenenPersistentVolumeClaim
anzufragen. - Verweisen Sie auf den
VolumeSnapshot
in einerPersistentVolumeClaim
, um ein Volume anhand dieses Snapshots wiederherzustellen, oder erstellen Sie ein neues Volume mithilfe dieses Snapshots.
PersistentVolumeClaim
und Deployment
erstellen
Speichern Sie zum Erstellen des
PersistentVolumeClaim
-Objekts das folgende Manifest alsmy-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.Wenden Sie das Manifest an:
kubectl apply -f my-pvc.yaml
Speichern Sie zum Erstellen eines
Deployment
das folgende Manifest alsmy-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
Wenden Sie das Manifest an:
kubectl apply -f my-deployment.yaml
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
Listen Sie die
Pods
imDeployment
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
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 desPod
.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.
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 verwendetpd.csi.storage.gke.io
den CSI-Treiber für nichtflüchtigen Speicher der Compute Engine.Das Feld
deletionPolicy
teilt GKE mit, was mit demVolumeSnapshotContent
-Objekt und dem zugrunde liegenden Snapshot geschieht, wenn das gebundeneVolumeSnapshot
-Objekt gelöscht wird. Geben SieDelete
an, um dasVolumeSnapshotContent
-Objekt und den zugrunde liegenden Snapshot zu löschen. Geben SieRetain
an, wenn SieVolumeSnapshotContent
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
.
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.
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
Wenden Sie das Manifest an:
kubectl apply -f volumesnapshot.yaml
Nachdem Sie einen
Volume
erstellt haben, erstellt GKE ein entsprechendesVolumeSnapshotContent
-Objekt im Cluster. Dieses Objekt speichert den Snapshot und die Bindungen vonVolumeSnapshot
-Objekten. Sie interagieren nicht direkt mitVolumeSnapshotContents
-Objekten.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
Löschen Sie die erstellte Testdatei:
kubectl exec POD_NAME \ -- sh -c 'rm /usr/share/hello/hello.txt'
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.
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
gibtsnapshots
oderimages
an. Wenn keine Angabe gemacht wird, lautet der Standardwertsnapshots
.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-Snapshotprojects/PROJECT_NAME/global/images/IMAGE_NAME
: Image-Snapshot
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
Wenden Sie das Manifest an:
kubectl apply -f pvc-restore.yaml
Aktualisieren Sie die Datei
my-deployment.yaml
, um die neuePersistentVolumeClaim
zu verwenden:... volumes: - name: my-volume persistentVolumeClaim: claimName: pvc-restore
Wenden Sie das aktualisierte Manifest an:
kubectl apply -f my-deployment.yaml
Auf erfolgreiche Wiederherstellung des Snapshots prüfen
Rufen Sie den Namen des neuen
Pod
ab, den GKE für das aktualisierteDeployment
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.
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
Speichern Sie das folgende
VolumeSnapshot
-Manifest alsrestored-snapshot.yaml
.apiVersion: snapshot.storage.k8s.io/v1 kind: VolumeSnapshot metadata: name: restored-snapshot spec: volumeSnapshotClassName: my-snapshotclass source: volumeSnapshotContentName: restored-snapshot-content
Wenden Sie das Manifest an:
kubectl apply -f restored-snapshot.yaml
Speichern Sie das folgende
VolumeSnapshotContent
-Manifest alsrestored-snapshot-content.yaml
. Ersetzen Sie das FeldsnapshotHandle
durch Ihre Projekt-ID und den Snapshot-Namen. SowohlvolumeSnapshotRef.name
als auchvolumeSnapshotRef.namespace
müssen auf den zuvor erstelltenVolumeSnapshot
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
Wenden Sie das Manifest an:
kubectl apply -f restored-snapshot-content.yaml
Speichern Sie das folgende
PersistentVolumeClaim
-Manifest alsrestored-pvc.yaml
. Der Kubernetes-Speichercontroller sucht nach einemVolumeSnapshot
mit dem Namenrestored-snapshot
und versucht dann, einPersistentVolume
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
Wenden Sie das Manifest an:
kubectl apply -f restored-pvc.yaml
Speichern Sie das folgende
Pod
-Manifest alsrestored-pod.yaml
und verweisen Sie dabei auf denPersistentVolumeClaim
. Der CSI-Treiber stellt einPersistentVolume
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
Wenden Sie das Manifest an:
kubectl apply -f restored-pod.yaml
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:
Löschen Sie das
VolumeSnapshot
:kubectl delete volumesnapshot my-snapshot
Löschen Sie das
VolumeSnapshotClass
:kubectl delete volumesnapshotclass my-snapshotclass
Löschen Sie das
Deployment
:kubectl delete deployments hello-app
PersistentVolumeClaim
-Objekte löschen:kubectl delete pvc my-pvc pvc-restore
Nächste Schritte
- Dokumentation zum Kubernetes-VolumeSnapshot lesen
- Weitere Informationen zur Volume-Erweiterung
- CSI-Treiber manuell installieren
- Blockspeicher (Persistent Disk) für GKE