Mit VMs auf Abruf fehlertolerante Arbeitslasten ausführen

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

Best Practice:

Spot-VMs sind die neueste Version von VMs auf Abruf. Anstelle von VMs auf Abruf empfehlen wir, entweder Spot-Pods in Autopilot-Clustern oder Spot-VMs in Standard-Clustern zu verwenden. GKE unterstützt weiterhin VMs auf Abruf, die dasselbe Preismodell wie Spot-VMs 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:

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 in neuen Clustern und Knotenpools aktivieren, nodeSelector oder Knotenaffinität verwenden, um die Planung zu steuern, und 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 einer verwalteten Arbeitslast wie einem Deployment sind, erstellt und plant der Controller neue Pods, um die beendeten Pods zu ersetzen.

Gemäß dem Best-Effort-Prinzip gewährt kubelet einen Zeitraum von 15 Sekunden für die ordnungsgemäße Beendigung von Nicht-System-Pods. Anschließend haben System-Pods (mit den Prioritätsklassen system-cluster-critical oder system-node-critical) 15 Sekunden Zeit für die 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.

Der Zeitraum für die ordnungsgemäße Beendigung von Nicht-System-Pods beträgt maximal 15 Sekunden. Die Angabe eines Werts von mehr als 15 Sekunden im Feld terminationGracePeriodSeconds Ihres Pod-Manifests hat keine Auswirkungen. Die gesamte VM wird 30 Sekunden nach dem Hinweis auf vorzeitiges Beenden heruntergefahren.

Änderungen am Kubernetes-Verhalten

Die Verwendung von VMs auf Abruf in GKE ändert die Schutzmaßnahmen, die von Kubernetes PodDisruptionBudgets bereitgestellt werden. 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

  • VMs auf Abruf unterstützen keine Windows Server-Knotenpools.
  • Bei VMs auf Abruf können Sie die 15-sekündige Kulanzzeit für Nicht-System-Pods und die anschließende 15-sekündige Kulanzzeit für System-Pods nicht ändern. Die zugrunde liegenden Konfigurationsfelder shutdownGracePeriod und shutdownGracePeriodCriticalPods kubelet sind unveränderlich. Bei Spot-VMs können diese Einstellungen jedoch geändert werden. Weitere Informationen finden Sie unter Beenden und ordnungsgemäßes Herunterfahren von Spot-VMs.

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 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.

Wenn Sie einem Knotenpool, der VMs auf Abruf verwendet, eine Knotenmarkierung hinzufügen möchten, verwenden Sie beim Erstellen des Knotenpools das Flag --node-taints, wie im folgenden Befehl:

gcloud container node-pools create POOL2_NAME \
    --cluster=CLUSTER_NAME \
    --node-taints=cloud.google.com/gke-preemptible="true":NoSchedule

Jetzt werden nur noch Pods, die die Knotenmarkierung tolerieren, auf dem Knoten geplant.

Ä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