Mit VMs auf Abruf fehlertolerante Arbeitslasten ausführen


Auf dieser Seite wird beschrieben, wie Sie VMs auf Abruf in Google Kubernetes Engine (GKE) verwenden.

Überblick

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.

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 oder system-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 oder system-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

Ä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 konfiguriertes PodDisruptionBudget.

Beschränkungen

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 mithilfe des Labels 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