Auf dieser Seite werden Spot-VMs und ihre Funktionsweise in Google Kubernetes Engine (GKE) erläutert. Weitere Informationen zur Verwendung von Spot-VMs finden Sie unter Spot-VMs verwenden.
Spot-VMs in GKE
Spot-VMs sind Compute Engine-VM-Instanzen, die günstiger als Standard-VMs von Compute Engine sind und keine Verfügbarkeit garantieren. Spot-VMs bieten die gleichen Maschinentypen und Optionen wie Standard-VMs.
Sie können Spot-VMs in Ihren Clustern und Knotenpools verwenden, um zustandslose, Batch- oder fehlertolerante Arbeitslasten auszuführen, die Unterbrechungen tolerieren können, die durch den flüchtigen Charakter von Spot-VMs verursacht werden.
Spot-VMs bleiben verfügbar, bis Compute Engine die Ressourcen für Standard-VMs benötigt. Kombinieren Sie Spot-VMs mit Best Practices zum Ausführen kostenoptimierter Kubernetes-Anwendungen in GKE, um Ihre Kosteneffizienz zu maximieren.
Weitere Informationen zu Spot-VMs finden Sie in der Compute Engine-Dokumentation unter Spot-VMs.
Vorteile von Spot-VMs
Spot-VMs und VMs auf Abruf haben viele Vorteile, darunter:
- Niedrigere Preise als standardmäßige Compute Engine-VMs.
- Nützlich für zustandslose, fehlertolerante Arbeitslasten, die gegen den flüchtigen Charakter dieser VMs resistent sind.
- Funktioniert mit Cluster Autoscaler und automatischer Knotenbereitstellung.
Im Gegensatz zu VMs auf Abruf, die nach 24 Stunden ablaufen, haben Spot-VMs keine Ablaufzeit. Spot-VMs werden nur beendet, wenn Compute Engine die Ressourcen an einem anderen Ort benötigt.
Funktionsweise von Spot-VMs in GKE
Wenn Sie einen Cluster oder Knotenpool mit Spot-VMs erstellen, erstellt GKE zugrunde liegende Compute Engine-Spot-VMs, die sich wie eine verwaltete Instanzgruppe (Managed Instance Group, MIG) verhalten. Knoten, die Spot-VMs verwenden, verhalten sich wie Standard-GKE-Knoten, allerdings ohne Garantie für die Verfügbarkeit. Wenn die von Spot-VMs verwendeten Ressourcen zum Ausführen von Standard-VMs erforderlich sind, beendet Compute Engine diese Spot-VMs, um die Ressourcen an anderer Stelle zu verwenden.
Beendigung und ordnungsgemäßes Herunterfahren von Spot-VMs
Wenn Compute Engine die von Spot-VMs verwendeten Ressourcen zurückerhalten muss, wird ein Beendigungshinweis an GKE gesendet. Spot-VMs enden 30 Sekunden nach Erhalt eines Beendigungshinweises.
Auf Clustern, auf denen GKE Version 1.20 und höher ausgeführt wird, ist das Feature zum ordnungsgemäßen Herunterfahren des Knotens von Kubelet standardmäßig aktiviert. Das Kubelet erkennt den Beendigungshinweis und beendet alle Pods, die auf dem Knoten ausgeführt werden, ordnungsgemäß. Wenn die Pods Teil eines Deployments sind, erstellt und plant der Controller neue Pods, um die beendeten Pods zu ersetzen.
Gemäß dem Best-Effort-Prinzip gewährt Kubelet den folgenden Zeitraum für die ordnungsgemäße Beendigung, basierend auf der GKE-Version des Knotenpools:
- Höher als 1.22.8-gke.200: 15 Sekunden für Nicht-System-Pods. Danach haben System-Pods (mit der Prioritätsklasse
system-cluster-critical
odersystem-node-critical
) 15 Sekunden Zeit, ordnungsgemäß beendet zu werden. - 1.22.8-gke.200 und frühere Versionen: 25 Sekunden für Nicht-System-Pods. Danach haben System-Pods (mit der Prioritätsklasse
system-cluster-critical
odersystem-node-critical
) 5 Sekunden Zeit, ordnungsgemäß beendet zu werden.
Während der ordnungsgemäßen Knotenbeendigung aktualisiert das Kubelet den Status der Pods und weist den beendeten Pods eine Failed
-Phase und einen Terminated
-Grund zu.
Wenn die Anzahl der beendeten Pods einen Schwellenwert von 1.000 für Cluster mit weniger als 100 Knoten oder 5.000 für Cluster mit 100 Knoten oder mehr erreicht, bereinigt die automatische Speicherbereinigung die Pods.
Mit den folgenden Befehlen können Sie beendete Pods auch manuell löschen:
kubectl get pods --all-namespaces | grep -i NodeShutdown | awk '{print $1, $2}' | xargs -n2 kubectl delete pod -n
kubectl get pods --all-namespaces | grep -i Terminated | awk '{print $1, $2}' | xargs -n2 kubectl delete pod -n
Arbeitslasten auf Spot-VMs planen
GKE fügt Knoten automatisch die Labels cloud.google.com/gke-spot=true
und cloud.google.com/gke-provisioning=spot
(für Knoten mit GKE-Version 1.25.5-gke.2500 oder höher) hinzu, die Spot-VMs verwenden. Sie können bestimmte Pods auf Knoten planen, die Spot-VMs verwenden, indem Sie in der Pod-Spezifikation das Feld nodeSelector verwenden. In den folgenden Beispielen wird das Label cloud.google.com/gke-spot
verwendet:
apiVersion: v1
kind: Pod
spec:
nodeSelector:
cloud.google.com/gke-spot: "true"
Alternativ können Sie die Knotenaffinität verwenden, um GKE anzuweisen, Pods auf Spot-VMs zu planen, ähnlich dem folgenden Beispiel:
apiVersion: v1
kind: Pod
spec:
...
affinity:
nodeAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
nodeSelectorTerms:
- matchExpressions:
- key: cloud.google.com/gke-spot
operator: In
values:
- "true"
...
Sie können auch nodeAffinity.preferredDuringSchedulingIgnoredDuringExecution
verwenden, damit GKE Pods vorzugsweise auf Knoten platziert, die Spot-VMs verwenden.
Das Vorziehen von Spot-VMs wird nicht empfohlen, da GKE die Pods möglicherweise auf vorhandenen funktionsfähigen Knoten planen kann, die stattdessen Standard-VMs verwenden.
Markierungen und Toleranzen für die Planung verwenden
Verwenden Sie eine Knotenmarkierung, damit GKE keine kritischen Arbeitslasten auf Spot-VMs plant, um Systemunterbrechungen zu vermeiden. Wenn Sie Knoten mit Spot-VMs markieren, plant GKE nur Pods mit der entsprechenden Toleranz für diese Knoten ein.
Wenn Sie Knotenmarkierungen verwenden, achten Sie darauf, dass Ihr Cluster auch mindestens einen Knotenpool mit Standard-Compute Engine-VMs hat. Knotenpools, die Standard-VMs verwenden, bieten GKE einen zuverlässigen Ort für die Planung wichtiger Systemkomponenten wie DNS.
Informationen zur Verwendung einer Knotenmarkierung für Spot-VMs finden Sie unter Markierungen und Toleranzen für Spot-VMs verwenden.
Spot-VMs mit GPU-Knotenpools verwenden
Spot-VMs leisten mithilfe von GPUs Unterstützung.
Wenn Sie einen neuen GPU-Knotenpool erstellen, fügt GKE den neuen Knoten automatisch die Markierung nvidia.com/gpu=present:NoSchedule
hinzu. Auf diesen Knoten können nur Pods mit der entsprechenden Toleranz ausgeführt werden. GKE fügt diese Toleranz automatisch zu Pods hinzu, die GPUs anfordern.
Ihr Cluster muss mindestens einen Nicht-GPU-Knotenpool haben, der Standard-VMs verwendet, bevor Sie einen GPU-Knotenpool erstellen, der Spot-VMs verwendet. Wenn Ihr Cluster nur einen GPU-Knotenpool mit Spot-VMs hat, fügt GKE diesen Knoten nicht die Markierung nvidia.com/gpu=present:NoSchedule
hinzu. Infolgedessen plant GKE möglicherweise Systemarbeitslasten auf den GPU-Knotenpools mit Spot-VMs, was zu Störungen aufgrund der Spot-VMs führen und Ihren Ressourcenverbrauch erhöhen kann, da GPU-Knoten teurer sind als Nicht-GPU-Knoten.
Cluster-Autoscaler und automatische Bereitstellung von Knoten
Mit dem Cluster Autoscaler und der automatischen Knotenbereitstellung können Sie Ihre Cluster und Knotenpools automatisch an die Anforderungen Ihrer Arbeitslasten anpassen. Sowohl das Cluster-Autoscaling als auch die automatische Knotenbereitstellung verwenden Spot-VMs.
Spot-VMs und automatische Bereitstellung von Knoten
Durch die automatische Knotenbereitstellung werden Knotenpools in Ihrem Cluster automatisch erstellt und gelöscht, um die Anforderungen Ihrer Arbeitslasten zu erfüllen. Wenn Sie Arbeitslasten, die Spot-VMs erfordern, mithilfe einer nodeSelector
- oder Knotenaffinität planen, werden durch die automatische Knotenbereitstellung neue Knotenpools für die Pods der Arbeitslasten erstellt. GKE fügt Knoten in den neuen Knotenpools automatisch die Markierung cloud.google.com/gke-spot=true:NoSchedule
hinzu. Nur Pods mit der entsprechenden Toleranz können auf Knoten in diesen Knotenpools ausgeführt werden. Sie müssen Ihren Deployments die entsprechende Toleranz hinzufügen, damit GKE die Pods auf Spot-VMs platzieren kann.
tolerations:
- key: cloud.google.com/gke-spot
operator: Equal
value: "true"
effect: NoSchedule
Damit GKE nur Ihre Pods auf Spot-VMs plant, können Sie eine Toleranz und entweder eine nodeSelector
- oder eine Knotenaffinitätsregel zum Filtern nach den Spot-VMs verwenden.
Wenn Sie eine Arbeitslast nur mit einer Toleranz planen, kann GKE die Pods entweder auf Spot-VMs oder auf vorhandenen Standard-VMs mit Kapazität planen. Wenn eine Arbeitslast auf Spot-VMs geplant werden soll, verwenden Sie zusätzlich zu einer Toleranz eine nodeSelector
- oder Knotenaffinität. Weitere Informationen finden Sie unter Arbeitslasten auf Spot-VMs planen.
Spot-VMs und Cluster-Autoscaler
Der Cluster-Autoscaler fügt Ihren Knotenpools nach Bedarf automatisch Knoten hinzu und entfernt diese. Wenn Ihr Cluster Pods enthält, die nicht auf vorhandenen Spot-VMs platziert werden können, fügt der Cluster-Autoscaler neue Knoten hinzu, die Spot-VMs verwenden.
Standardrichtlinie
Ab der GKE-Version 1.24.1-gke.800 können Sie die Richtlinie für Autoscaling-Standorte definieren. Cluster Autoscaler versucht, Spot-VM-Knotenpools bereitzustellen, wenn Ressourcen verfügbar sind und die Standardrichtlinie für den Standort auf ANY
gesetzt ist. Mit dieser Richtlinie haben Spot-VMs das geringere Risiko, vorzeitig beendet zu werden. Bei anderen VM-Typen ist die Standardrichtlinie für die Cluster-Autoscaling BALANCED
.
Upgrade von Standard-Knotenpools mit Spot-VMs ausführen
Wenn Ihre Standard-Cluster-Knotenpools mit Spot-VMs für die Verwendung von Surge-Upgrades konfiguriert sind, erstellt GKE Surge-Knoten mit Spot-VMs. GKE wartet jedoch nicht darauf, dass die Spot-VMs bereit sind, bevor die vorhandenen Knoten gesperrt und per Drain beendet werden, da Spot-VMs keine Verfügbarkeit garantieren. Weitere Informationen finden Sie unter Surge-Upgrades.
Änderungen am Kubernetes-Verhalten
Die Verwendung von Spot-VMs in GKE ändert einige Garantien und Einschränkungen, die Kubernetes bietet, z. B.:
- Die Rückforderung von Spot-VMs ist nicht freiwillig und unterliegt nicht den Garantien von
PodDisruptionBudgets
. Möglicherweise ist die Verfügbarkeit nicht höher als Ihr konfiguriertesPodDisruptionBudget
.
Best Practices für Spot-VMs
Beim Entwerfen eines Systems, das Spot-VMs verwendet, können Sie mithilfe der folgenden Richtlinien größere Störungen vermeiden:
- Spot-VMs haben keine Verfügbarkeitsgarantien. Entwerfen Sie Ihre Systeme unter der Annahme, dass GKE jederzeit Ihre gesamten Spot-VMs zurückfordern kann, ohne dass eine Garantie besteht, wann neue Instanzen verfügbar werden.
- Damit Ihre Arbeitslasten und Jobs auch dann verarbeitet werden, wenn keine Spot-VMs verfügbar sind, sollten Ihre Cluster eine Mischung aus Knotenpools enthalten, die Spot-VMs und Knotenpools verwenden, die Standard-Compute Engine-VMs verwenden.
- Prüfen Sie, ob Ihr Cluster mindestens einen Nicht-GPU-Knotenpool hat, der Standard-VMs verwendet, bevor Sie einen GPU-Knotenpool hinzufügen, der Spot-VMs verwendet.
- Während sich die Knotennamen bei der Neuerstellung von Knoten in der Regel nicht ändern, können sich die von Spot-VMs verwendeten internen und externen IP-Adressen nach der Neuerstellung ändern.
- Verwenden Sie Knotenmarkierungen und -toleranzen, damit keine wichtigen Pods in Knotenpools geplant werden, die Spot-VMs verwenden.
- Testen Sie zum Ausführen zustandsorientierter Arbeitslasten auf Spot-VMs, ob Ihre Arbeitslasten innerhalb von 25 Sekunden nach dem Herunterfahren ordnungsgemäß beendet werden können, um das Risiko einer Beschädigung der Daten im nichtflüchtigen Volume zu minimieren.
- Beachten Sie die Best Practices für das Beenden von Kubernetes-Pods.
Nächste Schritte
- Spot-VMs in Ihren Knotenpools verwenden
- Automatische Skalierung Ihrer Cluster.
- Bereitgestellte Anwendungen skalieren
- Weitere Informationen zu Spot-VMs in der Compute Engine-Dokumentation
- Anleitung zum Bereitstellen einer Batch-Arbeitslast mit Spot-VMs in GKE