Auf dieser Seite wird beschrieben, wie Sie VMs auf Abruf in Google Kubernetes Engine (GKE) verwenden.
Übersicht
VMs auf Abruf sind Compute Engine-VM-Instanzen, die günstiger als Standard-VMs sind und keine Verfügbarkeit garantieren. VMs auf Abruf bieten ähnliche Funktionen wie Spot-VMs, sind jedoch maximal 24 Stunden nach der Erstellung gültig.
In einigen Fällen kann eine VM auf Abruf länger als 24 Stunden dauern. Dies kann auftreten, wenn die neue Compute Engine-Instanz zu schnell bereitgestellt wird und Kubernetes nicht erkennt, dass eine andere Compute Engine-VM erstellt wurde. Die zugrunde liegende Compute Engine-Instanz hat eine maximale Dauer von 24 Stunden und folgt dem erwarteten Verhalten von VMs auf Abruf.
Vergleich mit Spot-VMs
VMs auf Abruf haben viele Gemeinsamkeiten mit Spot-VMs, darunter:
- Wird beendet, wenn Compute Engine die Ressourcen zum Ausführen von Standard-VMs benötigt.
- Sind nützlich für das Ausführen zustandsloser, Batch- oder fehlertoleranter Arbeitslasten.
- Niedrigere Preise als bei Standard-VMs.
- Auf Clustern mit der GKE-Version 1.20 und höher ist das Herunterfahren von Knoten standardmäßig aktiviert.
- Funktioniert mit Cluster Autoscaler und automatischer Knotenbereitstellung.
Im Gegensatz zu Spot-VMs, die keine maximale Ablaufzeit haben, sind VMs auf Abruf nur bis zu 24 Stunden nach der Erstellung gültig.
Sie können VMs auf Abruf für neue Cluster und Knotenpools aktivieren, nodeSelector
oder Knotenaffinität zum Steuern der Planung verwenden sowie Markierungen und Toleranzen verwenden, um Probleme mit Systemarbeitslasten zu vermeiden, wenn Knoten vorzeitig beendet werden.
Beendigung und ordnungsgemäßes Herunterfahren von VMs auf Abruf
Wenn Compute Engine die von VMs auf Abruf verwendeten Ressourcen zurückfordern muss, wird ein Hinweis auf vorzeitiges Beenden an GKE gesendet. VMs auf Abruf enden 30 Sekunden nach Erhalt eines Beendigungshinweises.
Standardmäßig wird in Clustern das ordnungsgemäße Herunterfahren von Knoten verwendet. 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 systemexternen Pods 15 Sekunden Zeit für eine ordnungsgemäße Beendigung. Anschließend haben die System-Pods mit den Prioritätsklassen system-cluster-critical
oder system-node-critical
15 Sekunden Zeit für eine ordnungsgemäße Beendigung.
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
Änderungen am Kubernetes-Verhalten
Die Verwendung von VMs auf Abruf in GKE geht mit einigen Änderungen der Garantien und Einschränkungen einher, die Kubernetes bietet, z. B.:
GKE fährt VMs auf Abruf ohne Kulanzzeitraum für Pods 30 Sekunden nach Erhalt eines Hinweises auf vorzeitiges Beenden von Compute Engine herunter.
Die Rückforderung von VMs auf Abruf ist nicht freiwillig und unterliegt nicht den Garantien von
PodDisruptionBudgets
. Möglicherweise ist die Verfügbarkeit nicht höher als Ihr konfiguriertesPodDisruptionBudget
.
Beschränkungen
- Das Kubelet-Feature zum ordnungsgemäßen Herunterfahren von Knoten ist nur auf Clustern mit GKE-Versionen ab 1.20 aktiviert. Bei GKE-Versionen vor 1.20 können Sie den Event-Handler zum Herunterfahren von GCP-Knoten verwenden, um Ihre Pods ordnungsgemäß zu beenden, wenn VMs auf Abruf beendet werden.
- VMs auf Abruf unterstützen keine Windows Server-Knotenpools.
Cluster oder Knotenpool mit VMs auf Abruf erstellen
Mit der Google Cloud CLI können Sie einen Cluster oder Knotenpool mit VMs auf Abruf erstellen.
Führen Sie den folgenden Befehl aus, um einen Cluster mit VMs auf Abruf zu erstellen:
gcloud container clusters create CLUSTER_NAME \
--preemptible
Ersetzen Sie dabei CLUSTER_NAME
durch den Namen des neuen Clusters.
Führen Sie den folgenden Befehl aus, um einen Knotenpool mit VMs auf Abruf zu erstellen:
gcloud container node-pools create POOL_NAME \
--cluster=CLUSTER_NAME \
--preemptible
Ersetzen Sie POOL_NAME
durch den Namen des neuen Knotenpools.
Mit nodeSelector Pods auf VMs auf Abruf planen
GKE fügt Knoten, die VMs auf Abruf verwenden, die Labels cloud.google.com/gke-preemptible=true
und cloud.google.com/gke-provisioning=preemptible
(für Knoten mit GKE-Version 1.25.5-gke.2500 oder höher) hinzu. Sie können einen nodeSelector
in Ihren Bereitstellungen verwenden, um GKE anzuweisen, Pods auf VMs auf Abruf zu planen.
Die folgende Bereitstellung filtert beispielsweise nach VMs auf Abruf mit dem Label cloud.google.com/gke-preemptible
:
apiVersion: apps/v1
kind: Deployment
metadata:
name: hello-app
spec:
replicas: 3
selector:
matchLabels:
app: hello-app
template:
metadata:
labels:
app: hello-app
spec:
containers:
- name: hello-app
image: us-docker.pkg.dev/google-samples/containers/gke/hello-app:1.0
resources:
requests:
cpu: 200m
nodeSelector:
cloud.google.com/gke-preemptible: "true"
Knotenmarkierungen für VMs auf Abruf verwenden
Sie können Knoten markieren, die VMs auf Abruf verwenden, damit GKE nur Pods mit der entsprechenden Toleranz auf diesen Knoten platzieren kann.
Verwenden Sie beim Erstellen eines Knotenpools, der VMs auf Abruf verwendet, das Flag --node-taints
, um dem Knotenpool eine Knotenmarkierung hinzuzufügen, ähnlich dem folgenden Befehl:
gcloud container node-pools create POOL2_NAME \
--cluster=CLUSTER_NAME \
--node-taints=cloud.google.com/gke-preemptible="true":NoSchedule
Jetzt werden für den Knoten nur Pods geplant, die die Knotenmarkierung tolerieren.
Ändern Sie die Bereitstellungen und fügen Sie der Pod-Spezifikation Folgendes hinzu, um den Pods die relevante Toleranz hinzuzufügen:
tolerations:
- key: cloud.google.com/gke-preemptible
operator: Equal
value: "true"
effect: NoSchedule
Knotenmarkierungen für GPU-VMs auf Abruf
VMs auf Abruf unterstützen die Verwendung von GPUs. Sie sollten in Ihrem Cluster mindestens einen weiteren Knotenpool erstellen, der keine VMs auf Abruf verwendet, bevor Sie einen GPU-Knotenpool hinzufügen, der VMs auf Abruf verwendet. Ein Standardknotenpool sorgt dafür, dass GKE Systemkomponenten wie DNS sicher platzieren kann.
Wenn Sie einen neuen Cluster mit GPU-Knotenpools erstellen, die unterbrechbare VMs verwenden, oder wenn Sie einen neuen GPU-Knotenpool, der unterbrechbare VMs verwendet, zu einem Cluster hinzufügen, der noch nicht über einen Standard-Knotenpool verfügt, fügt GKE die Markierung nvidia.com/gpu=present:NoSchedule
nicht automatisch zu den Knoten hinzu. GKE kann System-Pods auf den VMs auf Abruf planen, was zu Unterbrechungen führen kann. Dieses Verhalten erhöht auch den Ressourcenverbrauch, da GPU-Knoten teurer sind als Nicht-GPU-Knoten.
Nächste Schritte
- GKE-Anwendung auf Spot-VMs mit On-Demand-Knoten als Fallback ausführen
- Spot-VMs in GKE
- Markierungen und Toleranzen