Auf dieser Seite wird gezeigt, wie Sie mit Spot-VMs in GKE-Clustern (Google Kubernetes Engine) und Knotenpools fehlertolerante, zustandslose oder Batcharbeitslasten zu geringeren Kosten ausführen.
Übersicht
Spot-VMs sind Compute Engine-VMs, die günstiger als Standard-VMs sind und keine Verfügbarkeit garantieren. Spot-VMs bieten die gleichen Maschinentypen und Optionen wie Standard-Compute Engine-VMs. Compute Engine kann Spot-VMs jederzeit aufgrund von Systemereignissen zurücknehmen, z. B. wenn die Ressourcen für Standard-VMs benötigt werden.
Weitere Informationen zu Spot-VMs in GKE finden Sie unter Spot-VMs.
Dank Spot-VMs müssen Sie nicht mehr VMs auf Abruf verwenden, um zustandslose, Batch- oder fehlertolerante Arbeitslasten auszuführen. Im Gegensatz zu VMs auf Abruf, die nach 24 Stunden ablaufen, haben Spot-VMs keine Ablaufzeit. Spot-VMs werden beendet, wenn Compute Engine die Ressourcen zum Ausführen von Standard-VMs benötigt.
Spot-VMs werden auch in GKE Autopilot-Clustern über Spot-Pods unterstützt. Mit Spot-Pods plant und verwaltet Autopilot die Arbeitslasten automatisch auf Spot-VMs.
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 Handler für Ereignisse zum Herunterfahren von GCP-Knoten verwenden, um Ihre Pods ordnungsgemäß zu beenden, wenn Spot-VMs vorzeitig beendet werden.
- Spot-VMs unterstützen keine Windows Server-Knotenpools.
Hinweis
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.
Cluster mit Spot-VMs erstellen
Sie können einen neuen Cluster über Spot-VMs, die Google Cloud CLI oder die Google Cloud Console erstellen.
gcloud
Erstellen Sie einen neuen Cluster, der im Standardknotenpool anstelle von Standard-VMs Spot-VMs verwendet:
gcloud container clusters create CLUSTER_NAME \
--spot
Ersetzen Sie dabei CLUSTER_NAME
durch den Namen des neuen Clusters.
Console
Führen Sie folgende Schritte aus, um einen neuen Cluster mit einem Knotenpool über Spot-VMs zu erstellen:
Rufen Sie in der Google Cloud Console die Seite Google Kubernetes Engine auf.
Klicken Sie auf add_box Erstellen.
Klicken Sie im Dialogfeld Cluster erstellen neben GKE-Standard auf Konfigurieren.
Klicken Sie im Navigationsmenü im Abschnitt Knotenpools auf den Namen des zu konfigurierenden Knotenpools und dann auf Knoten.
Markieren Sie das Kästchen Spot-VMs aktivieren.
Konfigurieren Sie den Cluster nach Bedarf und klicken Sie dann auf Erstellen.
Knotenpools mit Spot-VMs erstellen
Sie können neue Knotenpools mit Spot-VMs und der gcloud CLI oder der Google Cloud Console erstellen. Sie können Spot-VMs nur in neuen Knotenpools aktivieren. Sie können Spot-VMs in vorhandenen Knotenpools nicht aktivieren oder deaktivieren.
gcloud
Erstellen Sie einen neuen Knotenpool über Spot-VMs:
gcloud container node-pools create POOL_NAME \
--cluster=CLUSTER_NAME \
--spot
Ersetzen Sie POOL_NAME
durch den Namen des neuen Knotenpools.
Console
Führen Sie folgenden Schritte aus, um einen neuen Knotenpool über Spot-VMs zu erstellen:
Rufen Sie in der Google Cloud Console die Seite Google Kubernetes Engine auf.
Klicken Sie in der Clusterliste auf den Namen des Clusters, den Sie ändern möchten.
Klicken Sie auf Knotenpool hinzufügen
.Klicken Sie im Navigationsmenü auf Knoten.
Markieren Sie das Kästchen Spot-VMs aktivieren.
Konfigurieren Sie den Knotenpool nach Bedarf und klicken Sie dann auf Erstellen.
Arbeitslasten auf Spot-VMs planen
GKE fügt Knoten 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 nach diesem Label in Ihrer Pod-Spezifikation filtern. Verwenden Sie dazu das Feld nodeSelector
in Ihrer Pod-Spezifikation oder die Knotenaffinität.
Im folgenden Beispiel erstellen Sie einen Cluster mit zwei Knotenpools, von denen einer Spot-VMs verwendet. Anschließend stellen Sie eine zustandslose nginx
-Anwendung auf den Spot-VMs bereit. Verwenden Sie dazu einen nodeSelector
, um zu steuern, wo GKE die Pods platziert.
Erstellen Sie mit Standard-VMs einen neuen Cluster mit dem Standardknotenpool:
gcloud container clusters create CLUSTER_NAME
Ersetzen Sie dabei
CLUSTER_NAME
durch den Namen des neuen Clusters.Rufen Sie Anmeldedaten für den Cluster ab:
gcloud container clusters get-credentials CLUSTER_NAME
So erstellen Sie einen Knotenpool mit Spot-VMs:
gcloud container node-pools create POOL_NAME \ --num-nodes=1 \ --spot
Ersetzen Sie
POOL_NAME
durch den Namen des neuen Knotenpools.Speichern Sie dieses YAML-Manifest als Datei mit dem Namen
pi-app.yaml
:apiVersion: batch/v1 kind: Job metadata: name: pi spec: template: metadata: labels: app: pi spec: nodeSelector: cloud.google.com/gke-spot: "true" terminationGracePeriodSeconds: 25 containers: - name: pi image: perl:5.34.0 command: ["perl", "-Mbignum=bpi", "-wle", "print bpi(2000)"] restartPolicy: Never backoffLimit: 4
In diesem Manifest wird GKE vom Feld
nodeSelector
angewiesen, Pods nur auf Knoten zu planen, die Spot-VMs verwenden.Wenden Sie das Manifest auf Ihren Cluster an:
kubectl apply -f pi-app.yaml
Beschreiben Sie den Pod:
kubectl describe pod pi
Die Ausgabe sieht etwa so aus:
Name: pi-kjbr9 Namespace: default Priority: 0 Node: gke-cluster-2-spot-pool-fb434072-44ct ... Labels: app=pi job-name=pi Status: Succeeded ... Controlled By: Job/pi Containers: ... Conditions: Type Status Initialized True Ready False ContainersReady False PodScheduled True Volumes: ... Node-Selectors: cloud.google.com/gke-spot=true Tolerations: node.kubernetes.io/not-ready:NoExecute op=Exists for 300s node.kubernetes.io/unreachable:NoExecute op=Exists for 300s Events: Type Reason Age From Message ---- ------ ---- ---- ------- Normal Scheduled 4m3s default-scheduler Successfully assigned default/pi-kjbr9 to gke-cluster-2-spot-pool-fb434072-44ct Normal Pulling 4m2s kubelet Pulling image "perl:5.34.0" Normal Pulled 3m43s kubelet Successfully pulled image "perl:5.34.0" in 18.481761978s Normal Created 3m43s kubelet Created container pi Normal Started 3m43s kubelet Started container pi
Das Feld
Node
gibt an, dass GKE Ihre Pods nur auf Knoten plant, die Spot-VMs verwenden.
Markierungen und Toleranzen für Spot-VMs verwenden
Erstellen Sie als Best Practice Cluster mit mindestens einem Knotenpool ohne Spot-VMs, an einem Speicherort, an denen Sie Systemarbeitslasten wie DNS platzieren können. Sie können Knotenmarkierungen und die entsprechenden Toleranzen verwenden, um GKE anzuweisen, bestimmte Arbeitslasten nicht auf Spot-VMs zu platzieren.
Verwenden Sie zum Erstellen eines Knotenpools mit Knoten, die Spot-VMs verwenden und Knotenmarkierungen haben, beim Erstellen des Knotenpools das
--node-taints
-Flag:gcloud container node-pools create POOL_NAME \ --node-taints=cloud.google.com/gke-spot="true":NoSchedule --spot
Ändern Sie die Bereitstellungen und fügen Sie der Pod-Spezifikation Folgendes hinzu, um den Pods, die Sie für Spot-VMs vorsehen möchten, die entsprechende Toleranz hinzuzufügen:
tolerations: - key: cloud.google.com/gke-spot operator: Equal value: "true" effect: NoSchedule
GKE plant nur Pods mit dieser Toleranz auf den Spot-VMs mit der hinzugefügten Knotenbeschädigung.
Nächste Schritte
- GKE-Anwendung auf Spot-VMs mit On-Demand-Knoten als Fallback ausführen
- Spot-VMs in GKE
- Anleitung zum Bereitstellen einer Batch-Arbeitslast mit Spot-VMs in GKE