Führen Sie fehlertolerante Arbeitslasten zu geringeren Kosten in Spot-Pods aus


Auf dieser Seite erfahren Sie, wie Sie fehlertolerante Arbeitslasten zu geringeren Kosten ausführen können, indem Sie Spot Pods in Ihren Google Kubernetes Engine (GKE) Autopilot-Clustern verwenden.

Überblick

In GKE Autopilot-Clustern sind Spot-Pods Pods, die auf Knoten ausgeführt werden, die von Compute Engine Spot-VMs unterstützt werden. Spot-Pods sind preislich günstiger als Standard-Autopilot-Pods, können aber von GKE entfernt werden, wenn Rechenressourcen benötigt werden, um Standard-Pods auszuführen.

Spot-Pods sind ideal für die Ausführung zustandsloser, Batch- oder fehlertoleranter Arbeitslasten zu geringeren Kosten im Vergleich zu einer Ausführung dieser Arbeitslasten auf Standard-Pods. Wenn Sie Spot-Pods in Autopilot-Clustern verwenden möchten, ändern Sie das Manifest mit Ihrer Pod-Spezifikation, um Spot-Pods anzufordern.

Sie können Spot-Pods mit der Standard-Compute-Klasse für Autopilot sowie mit speziellen Compute-Klassen ausführen, die bestimmte Hardwareanforderungen erfüllen. Informationen zu diesen Compute-Klassen finden Sie unter Compute-Klassen in Autopilot.

Weitere Informationen zu den Preisen für Spot-Pods in Autopilot-Clustern finden Sie unter Preise für Google Kubernetes Engine.

Vorteile

Die Verwendung von Spot-Pods in Ihren Autopilot-Clustern bietet folgende Vorteile:

  • Niedrigere Preise als die Ausführung derselben Arbeitslasten auf standardmäßigen Autopilot-Pods.
  • GKE verwaltet automatisch Autoscaling und Planung.
  • GKE markiert Knoten automatisch, die Spot-Pods ausführen, damit Standard-Pods wie Ihre kritischen Arbeitslasten nicht auf diesen Knoten geplant werden. Ihre Bereitstellungen, die Spot-Pods verwenden, werden automatisch mit einer entsprechenden Toleranz aktualisiert.

Anforderungen und Einschränkungen

  • Erfordert GKE-Version 1.21.4 oder höher.
  • Spot-Pods sind vom Autopilot-Service Level Agreement ausgeschlossen.
  • GKE kann Spot-Pods nicht auf Clustern planen, auf denen GKE-Versionen vor 1.21.4 ausgeführt werden.
  • Autopilot-Cluster unterstützen Anfragen für Pods auf Abruf in Clustern, auf denen die GKE-Version 1.21.4 oder höher ausgeführt wird. Dazu wird die Auswahl cloud.google.com/gke-preemptible verwendet. Pods, die diesen Selektor verwenden, werden automatisch zu Spot-Pods migriert und der Selektor wird in cloud.google.com/gke-spot geändert.

Hinweis

Führen Sie die folgenden Aufgaben aus, 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.

Spot-Pods in Ihren Autopilot-Arbeitslasten anfordern

Wenn Sie anfordern möchten, dass Ihre Pods als Spot-Pods ausgeführt werden, verwenden Sie das Label cloud.google.com/gke-spot=true in einem nodeSelector oder Knotenaffinität in der Pod-Spezifikation. GKE stellt automatisch Knoten bereit, die Spot-Pods ausführen können.

Spot-Pods können jederzeit entfernt und beendet werden, z. B. wenn die Rechenressourcen an anderer Stelle in Google Cloud erforderlich sind. Wenn eine Beendigung auftritt, können Spot-Pods auf dem beendenden Knoten einen Kulanzzeitraums von bis zu 25 Sekunden vor der Beendigung anfordern. Dies wird auf Best-Effort-Basis durch Festlegen des Feldes terminationGracePeriodSeconds gewährt.

Der maximale Kulanzzeitraum für Spot-Pods während des vorzeitigen Beendens beträgt 25 Sekunden. Wenn Sie mehr als 25 s in terminationGracePeriodSeconds anfordern, werden während des vorzeitigen Beendens nicht mehr als 25 s gewährt. Bei der Bereinigung wird Ihrem Pod das SIGTERM-Signal gesendet, was die Schritte zum Herunterfahren während des Kulanzzeitraums einleitet.

Für Autopilot markiert GKE auch automatisch die Knoten, die zum Ausführen von Spot-Pods erstellt wurden, und ändert diese Arbeitslasten mit der entsprechenden Toleranz. Die Markierung verhindert, dass Standard-Pods auf Knoten geplant werden, die Spot-Pods ausführen.

Mit nodeSelector die Spot-Pods erforderlich machen

Sie können einen nodeSelector verwenden, um Spot-Pods in einem Deployment erforderlich zu machen. Fügen Sie dem Deployment das Label cloud.google.com/gke-spot=true hinzu, wie im folgenden Beispiel gezeigt:

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

Mit Knotenaffinität die Spot-Pods anfordern

Alternativ können Sie Spot-Pods mit Knotenaffinität anfordern. Die Knotenaffinität bietet Ihnen eine umfangreichere Möglichkeit, Knoten zum Ausführen Ihrer Arbeitslasten auszuwählen. Sie können beispielsweise mehrere Auswahlkriterien kombinieren, um eine genauere Kontrolle darüber zu erhalten, wo Ihre Pods ausgeführt werden. Wenn Sie Spot-Pods zur Knotenaffinität verwenden, können Sie die Art der zu verwendenden Knotenaffinität so angeben:

  • requiredDuringSchedulingIgnoredDuringExecution: Spot-Pods müssen verwendet werden.
  • preferredDuringSchedulingIgnoredDuringExecution: Spot-Pods auf Best-Effort-Basis verwenden.

Wenn Sie Spot-Pods in einem Deployment anfordern möchten, fügen Sie Ihrem Deployment-Manifest die folgende nodeAffinity-Regel hinzu:

apiVersion: batch/v1
kind: Job
metadata:
  name: pi
spec:
  template:
    metadata:
      labels:
        app: pi
    spec:
      terminationGracePeriodSeconds: 25
      affinity:
        nodeAffinity:
          requiredDuringSchedulingIgnoredDuringExecution:
            nodeSelectorTerms:
            - matchExpressions:
              - key: cloud.google.com/gke-spot
                operator: In
                values:
                - "true"
      containers:
      - name: pi
        image: perl:5.34.0
        command: ["perl",  "-Mbignum=bpi", "-wle", "print bpi(2000)"]
      restartPolicy: Never
  backoffLimit: 4

Spot-Pods auf Best-Effort-Basis anfordern

Verwenden Sie preferredDuringSchedulingIgnoredDuringExecution, um Spot-Pods auf Best-Effort-Basis anzufordern. Wenn Sie Spot-Pods auf bevorzugte Weise anfordern, plant GKE Ihre Pods in folgender Reihenfolge:

  1. Vorhandene Knoten, die Spot-Pods ausführen können, die eine zuweisbare Kapazität haben.
  2. Vorhandene Standardknoten mit verfügbaren zuweisbaren Kapazitäten.
  3. Neue Knoten, die Spot-Pods ausführen können, sofern die Rechenressourcen verfügbar sind.
  4. Neue Standardknoten.

Da GKE vorhandene Standardknoten mit zuweisbarer Kapazität gegenüber der Erstellung neuer Knoten für Spot-Pods bevorzugt, werden möglicherweise mehr Pods als Standard-Pods ausgeführt als als Spot-Pods. Dadurch können Sie die Vorteile der niedrigeren Preise für Spot-Pods eventuell nicht voll ausschöpfen.

Beendete Pods suchen und löschen

Während der ordnungsgemäßen Pod-Beendigung weist das Kubelet den beendeten Pods den Status Failed und den Grund Shutdown zu. Wenn die Anzahl der beendeten Pods einen Schwellenwert von 1.000 erreicht, bereinigt die automatische Speicherbereinigung die Pods. Sie können Shutdown-Pods mit dem folgenden Befehl auch manuell löschen:

kubectl get pods --all-namespaces | grep -i shutdown | awk '{print $1, $2}' | xargs -n2 kubectl delete pod -n

Nächste Schritte