Mit Spot-VMs fehlertolerante Arbeitslasten zu geringeren Kosten ausführen


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

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.

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:

  1. Rufen Sie in der Google Cloud Console die Seite Google Kubernetes Engine auf.

    Zur Seite „Google Kubernetes Engine“

  2. Klicken Sie auf Erstellen.

  3. Klicken Sie im Dialogfeld Cluster erstellen neben GKE-Standard auf Konfigurieren.

  4. Klicken Sie im Navigationsmenü im Abschnitt Knotenpools auf den Namen des zu konfigurierenden Knotenpools und dann auf Knoten.

  5. Markieren Sie das Kästchen Spot-VMs aktivieren.

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

  1. Rufen Sie in der Google Cloud Console die Seite Google Kubernetes Engine auf.

    Zur Seite "Google Kubernetes Engine"

  2. Klicken Sie in der Clusterliste auf den Namen des Clusters, den Sie ändern möchten.

  3. Klicken Sie auf Knotenpool hinzufügen .

  4. Klicken Sie im Navigationsmenü auf Knoten.

  5. Markieren Sie das Kästchen Spot-VMs aktivieren.

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

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

  2. Rufen Sie Anmeldedaten für den Cluster ab:

    gcloud container clusters get-credentials CLUSTER_NAME
    
  3. 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.

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

  5. Wenden Sie das Manifest auf Ihren Cluster an:

    kubectl apply -f pi-app.yaml
    
  6. 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.

  1. 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
    
  2. Ä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