Hier erfahren Sie, wie Sie Snapshot-Richtlinien erstellen und einen Pod-Snapshot Ihrer ausgeführten Arbeitslasten in Google Kubernetes Engine (GKE) auslösen.
Hinweis
Führen Sie die folgenden Aufgaben aus, 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,
installieren und dann
initialisieren Sie die
gcloud CLI. Wenn Sie die gcloud CLI bereits installiert haben, rufen Sie die neueste
Version mit dem
gcloud components updateBefehl ab. Ältere Versionen der gcloud CLI unterstützen möglicherweise nicht die Ausführung der Befehle in diesem Dokument.
- Prüfen Sie, ob Sie die Voraussetzungen erfüllt und Pod-Snapshots in Ihrem Cluster aktiviert haben. Weitere Informationen finden Sie unter Pod-Snapshots vorbereiten.
Snapshot-Richtlinie erstellen
Wenn Sie Snapshots für einen Pod aktivieren möchten, erstellen Sie eine PodSnapshotPolicy-Ressource mit einem Selektor, der mit den Labels des Pods übereinstimmt.
Im folgenden Beispiel wird eine Richtlinie erstellt, die auf Pods mit dem Label
app: my-appangewendet wird und die Speicherkonfigurationexample-pod-snapshot-storage-configverwendet. Speichern Sie das folgende Manifest alsexample-pod-snapshot-policy.yaml:apiVersion: podsnapshot.gke.io/v1 kind: PodSnapshotPolicy metadata: name: example-pod-snapshot-policy namespace: NAMESPACE spec: storageConfigName: example-pod-snapshot-storage-config selector: matchLabels: app: my-app triggerConfig: type: TRIGGER_TYPE postCheckpoint: resumeErsetzen Sie Folgendes:
TRIGGER_TYPE: der Typ des Triggers. Unterstützte Werte sindworkloadfür arbeitslastbasierte Trigger odermanualfür On-Demand-Snapshots.NAMESPACE: der Namespace für Ihre Pods.
Eine vollständige Liste aller konfigurierbaren Felder finden Sie in der Dokumentation zur PodSnapshotPolicy-CustomResourceDefinition (CRD).
Wenden Sie das Manifest an:
kubectl apply -f example-pod-snapshot-policy.yaml
Zusätzliche Pod-Snapshot-Richtlinien konfigurieren
Sie können in Ihrer PodSnapshotPolicy zusätzliche Richtlinien konfigurieren, z. B.:
Snapshot-Bereich: Wenn Sie angeben möchten, welche Teile des Pod-Status in dem Snapshot erfasst werden sollen, konfigurieren Sie das
spec.snapshotScopeFeld. Unterstützte Werte sindwhole-pod(Standard), um den gesamten Pod einschließlich Anwendungsstatus, Arbeitsspeicher und Dateisystemen zu speichern, oderrootfs-only, um nur das Root-Dateisystem des Containers zu speichern. Für den Bereichrootfs-onlyist GKE-Version 1.35.3-gke.1031000 oder höher erforderlich.Automatische Bereinigung: Wenn Sie alte Pod-Snapshot Ressourcen automatisch bereinigen möchten, konfigurieren Sie eine Aufbewahrungsrichtlinie mit dem
spec.retentionConfigFeld. Sie können mit dem FeldlastAccessTimeouteine Dauer angeben (z. B.7d), nach der der Snapshot gelöscht wird.Snapshots organisieren: Sie können Snapshots logisch gruppieren, um zwischen Snapshots zu unterscheiden, die in ähnlichen Umgebungen, aber in unterschiedlichen Kontexten erstellt wurden. In einem Multi-Tenant-Szenario, in dem der Basis-Pod für alle Nutzer gleich ist, können Sie die Snapshots beispielsweise nach Nutzer oder Gruppe isolieren. Wenn Sie Snapshots isolieren möchten, geben Sie mit dem Feld
snapshotGroupingRulesGruppierungs-Labels in der Richtlinie an. Wenn ein Pod wiederhergestellt wird, wird er nur mit Snapshots in derselben Labelgruppe verglichen. Weitere Informationen dazu, wie sich diese Gruppierung auf den Kompatibilitätsabgleich bei der Wiederherstellung auswirkt, finden Sie unter Gruppierungsregeln abgleichen.
Im folgenden Beispiel wird gezeigt, wie Sie sowohl die Aufbewahrungs- als auch die Gruppierungseinstellungen in Ihrer PodSnapshotPolicy konfigurieren. Diese Einstellungen können unabhängig voneinander festgelegt werden:
# ... other fields omitted
spec:
snapshotScope: rootfs-only
retentionConfig:
lastAccessTimeout: 7d
snapshotGroupingRules:
groupByLabelValue:
labels: ["tenant", "environment"]
groupRetentionPolicy:
maxSnapshotCountPerGroup: 5
Eine vollständige Liste aller konfigurierbaren Felder finden Sie in der Referenzdokumentation zu PodSnapshotPolicy.
Snapshot-Größe optimieren
Wenn ein Pod-Snapshot ausgelöst wird, erfasst gVisor den gesamten Status aller Container, einschließlich:
- Anwendungsstatus wie Arbeitsspeicher und Register
- Änderungen am Root-Dateisystem und an
tmpfs(einschließlichemptyDir-Volumes) - Kernel-Status wie offene Dateideskriptoren, Threads und Sockets
Die Größe des Snapshots wird durch diese Faktoren bestimmt. Das Speichern und Wiederherstellen größerer Snapshots dauert länger. Um die Leistung zu optimieren, sollten Sie vor dem Auslösen eines Snapshots alle Anwendungsstatus oder Dateien bereinigen, die nach der Wiederherstellung des Pods aus dem Snapshot nicht mehr benötigt werden.
Die Optimierung der Snapshot-Größe ist besonders wichtig für Arbeitslasten wie große Sprachmodelle (Large Language Models, LLMs). LLM-Server laden Modellgewichtungen oft in den lokalen Speicher (rootfs oder tmpfs) herunter, bevor sie in die GPU geladen werden. Wenn ein Snapshot erstellt wird, werden sowohl der GPU-Status als auch die Dateien mit den Modellgewichtungen gespeichert. Wenn das Modell in diesem Szenario 100 GB groß ist, ist der resultierende Snapshot etwa 200 GB groß (100 GB Modelldateien plus 100 GB für den GPU-Status). Nachdem die Modellgewichtungen in die GPU geladen wurden, sind die Dateien im Dateisystem oft nicht mehr erforderlich, damit die Anwendung ausgeführt werden kann. Wenn Sie diese Modelldateien löschen, bevor Sie den Snapshot auslösen, können Sie die Snapshot-Größe um die Hälfte reduzieren und die Anwendung mit einer deutlich geringeren Latenz wiederherstellen.
Snapshot auslösen
Sie können einen Snapshot aus einer Arbeitslast heraus auslösen, wenn die Anwendung bereit ist, oder Sie können manuell einen On-Demand-Snapshot für einen bestimmten Pod auslösen.
Snapshot aus einer Arbeitslast auslösen
Wenn Sie einen Snapshot aus Ihrem Anwendungscode heraus auslösen möchten, konfigurieren Sie Ihre Anwendung so, dass sie ein Signal sendet, wenn sie für einen Snapshot bereit ist. Um die Bereitschaft zu signalisieren, schreiben Sie 1 in die Datei /proc/gvisor/checkpoint, z. B. echo 1 > /proc/gvisor/checkpoint. Der Schreibvorgang startet den Snapshot-Prozess asynchron und wird sofort zurückgegeben. Wenn Sie aus demselben Dateideskriptor lesen, wird der Lesevorgang blockiert, bis sowohl der Snapshot als auch die Wiederherstellung abgeschlossen sind und die Arbeitslast bereit ist, fortgesetzt zu werden.
Die genaue Verwendung variiert je nach Anwendung. Das folgende Beispiel zeigt jedoch einen Snapshot-Trigger für eine Python-Anwendung. Führen Sie die folgenden Schritte aus, um einen Snapshot aus dieser Beispielarbeitslast auszulösen:
Speichern Sie das folgende Manifest als
my-app.yaml:apiVersion: v1 kind: Pod metadata: name: my-app namespace: NAMESPACE labels: app: my-app spec: serviceAccountName: KSA_NAME runtimeClassName: gvisor containers: - name: my-container image: python:3.10-slim command: ["python3", "-c"] args: - | import time def trigger_snapshot(): try: with open("/proc/gvisor/checkpoint", "r+") as f: f.write("1") res = f.read().rstrip() print(f"GKE Pod Snapshot: {res}") except FileNotFoundError: print("GKE Pod Snapshot file does not exist -- Pod Snapshots is disabled") return i = 0 while True: print(f"Count: {i}", flush=True) if (i == 20): #simulate the application being ready to snapshot at 20th count trigger_snapshot() i += 1 time.sleep(1) resources: limits: cpu: "500m" memory: "512Mi" requests: cpu: "250m" memory: "256Mi"Ersetzen Sie Folgendes:
NAMESPACE: der Namespace für Ihre Pods.KSA_NAME: der Name Ihres KSA.
Stellen Sie die Anwendung bereit:
kubectl apply -f my-app.yaml
Snapshot manuell auslösen
Wenn Sie manuell einen On-Demand-Snapshot für einen bestimmten Pod auslösen möchten, erstellen Sie eine PodSnapshotManualTrigger-Ressource.
Im folgenden Beispiel wird ein Snapshot für einen Pod mit dem Namen
my-podausgelöst. Speichern Sie das folgende Manifest alsexample-manual-trigger.yaml:apiVersion: podsnapshot.gke.io/v1 kind: PodSnapshotManualTrigger metadata: name: example-manual-trigger namespace: NAMESPACE spec: targetPod: my-podErsetzen Sie
NAMESPACEdurch den Namespace Ihres Pods.Wenden Sie das Manifest an:
kubectl apply -f example-manual-trigger.yaml
Prüfen Sie das Feld status der PodSnapshotManualTrigger-Ressource, um zu bestätigen, ob der Snapshot erfolgreich ausgelöst wurde:
kubectl get podsnapshotmanualtriggers.podsnapshot.gke.io example-manual-trigger -n NAMESPACE -o yaml
Das Feld status gibt an, ob das Auslösen des Snapshots erfolgreich war oder fehlgeschlagen ist.
Snapshots prüfen
Sie können prüfen, ob ein Snapshot erstellt wurde, indem Sie den Ereignisverlauf nach GKEPodSnapshotting-Ereignissen durchsuchen:
kubectl get events -o \
custom-columns=NAME:involvedObject.name,CREATIONTIME:.metadata.creationTimestamp,REASON:.reason,MESSAGE:.message \
--namespace NAMESPACE \
--field-selector involvedObject.name=POD_NAME,reason=GKEPodSnapshotting
Ersetzen Sie Folgendes:
POD_NAME: der Name Ihres Pods, z. B.my-appodermy-pod.NAMESPACE: der Namespace für Ihre Pods.
Die Ausgabe sollte so aussehen:
NAME CREATIONTIME REASON MESSAGE
default/5b449f9c7c-bd7pc 2025-11-05T16:25:11Z GKEPodSnapshotting Successfully checkpointed the pod to PodSnapshot
Nächste Schritte
Informationen zum Wiederherstellen einer Arbeitslast aus einem Pod-Snapshot.