Spot-VMs erstellen und verwenden

Auf dieser Seite wird erläutert, wie Sie Spot-VMs erstellen und verwalten. Dazu gehört Folgendes:

  • Spot-VMs erstellen, starten und ermitteln
  • Vorzeitiges Beenden von Spot-VMs erkennen, verwalten und testen
  • Best Practices für Spot-VMs

Spot-VMs sind VM-Instanzen, die das Spot-Bereitstellungsmodell verwenden. Spot-VMs sind mit einem Rabatt von bis zu 60% auf den On-Demand-Preis von Standard-VMs verfügbar. Weitere Informationen finden Sie auf der Preisseite. Compute Engine kann die Ressourcen jedoch jederzeit zurückfordern, indem sie Spot-VMs vorzeitig beendet. Spot-VMs werden nur für fehlertolerante Arbeitslasten empfohlen, die einem vorzeitigen Beenden von VMs standhalten.

Hinweis

  • Lesen Sie mehr über Spot-VMs, insbesondere über die Einschränkungen.
  • Prüfen Sie, ob Sie ein ausreichendes Kontingent für die Ressourcen haben, die Sie anfordern möchten. Weitere Informationen finden Sie unter Zuweisungskontingente.
  • Richten Sie die Authentifizierung ein, falls Sie dies noch nicht getan haben. Bei der Authentifizierung wird Ihre Identität für den Zugriff auf Google Cloud Dienste und APIs überprüft. Zur Ausführung von Code oder Beispielen aus einer lokalen Entwicklungsumgebung können Sie sich so bei Compute Engine authentifizieren:

    Wählen Sie den Tab für die geplante Verwendung der Beispiele auf dieser Seite aus:

    Console

    Wenn Sie über die Google Cloud Console auf Google Cloud -Dienste und -APIs zugreifen, müssen Sie die Authentifizierung nicht einrichten.

    gcloud

    1. Installieren Sie die Google Cloud CLI. Initialisieren Sie die Google Cloud CLI nach der Installation mit dem folgenden Befehl:

      gcloud init

      Wenn Sie einen externen Identitätsanbieter (IdP) verwenden, müssen Sie sich zuerst mit Ihrer föderierten Identität in der gcloud CLI anmelden.

  • Legen Sie eine Standardregion und -zone fest.
  • Terraform

    Wenn Sie die Terraform-Beispiele auf dieser Seite in einer lokalen Entwicklungsumgebung verwenden möchten, installieren und initialisieren Sie die gcloud CLI und richten Sie dann die Standardanmeldedaten für Anwendungen mit Ihren Nutzeranmeldedaten ein.

    1. Installieren Sie die Google Cloud CLI.

    2. Wenn Sie einen externen Identitätsanbieter (IdP) verwenden, müssen Sie sich zuerst mit Ihrer föderierten Identität in der gcloud CLI anmelden.

    3. Wenn Sie eine lokale Shell verwenden, erstellen Sie lokale Anmeldedaten zur Authentifizierung für Ihr Nutzerkonto:

      gcloud auth application-default login

      Wenn Sie Cloud Shell verwenden, müssen Sie das nicht tun.

      Wenn ein Authentifizierungsfehler zurückgegeben wird und Sie einen externen Identitätsanbieter (IdP) verwenden, prüfen Sie, ob Sie sich mit Ihrer föderierten Identität in der gcloud CLI angemeldet haben.

    Weitere Informationen finden Sie unter Authentifizierung für eine lokale Entwicklungsumgebung einrichten.

    REST

    Wenn Sie die REST API-Beispiele auf dieser Seite in einer lokalen Entwicklungsumgebung verwenden möchten, verwenden Sie die Anmeldedaten, die Sie der gcloud CLI bereitstellen.

      Installieren Sie die Google Cloud CLI.

      Wenn Sie einen externen Identitätsanbieter (IdP) verwenden, müssen Sie sich zuerst mit Ihrer föderierten Identität in der gcloud CLI anmelden.

    Weitere Informationen finden Sie in der Dokumentation zur Google Cloud -Authentifizierung unter Für die Verwendung von REST authentifizieren.

Erforderliche Rollen

Um die Berechtigungen zu erhalten, die Sie zum Erstellen einer Spot-VM benötigen, bitten Sie Ihren Administrator, Ihnen die IAM-Rolle Compute Instance Admin (v1) (roles/compute.instanceAdmin.v1) für das Projekt zuzuweisen. Weitere Informationen zum Zuweisen von Rollen finden Sie unter Zugriff auf Projekte, Ordner und Organisationen verwalten.

Diese vordefinierte Rolle enthält die Berechtigungen, die zum Erstellen einer Spot-VM erforderlich sind. Maximieren Sie den Abschnitt Erforderliche Berechtigungen, um die notwendigen Berechtigungen anzuzeigen:

Erforderliche Berechtigungen

Die folgenden Berechtigungen sind zum Erstellen einer Spot-VM erforderlich:

  • compute.instances.create für das Projekt
  • Zum Erstellen der VM mit einem benutzerdefinierten Image: compute.images.useReadOnly für das Image
  • Zum Erstellen der VM mit einem Snapshot: compute.snapshots.useReadOnly für den Snapshot
  • Zum Erstellen der VM mit einer Instanzvorlage: compute.instanceTemplates.useReadOnly für die Instanzvorlage
  • Zum Angeben eines Subnetzes für Ihre VM: compute.subnetworks.use für das Projekt oder für das ausgewählte Subnetz
  • Zum Festlegen einer statischen IP-Adresse für die VM: compute.addresses.use für das Projekt
  • Zum Zuweisen einer externen IP-Adresse zur VM, wenn Sie ein VPC-Netzwerk verwenden: compute.subnetworks.useExternalIp für das Projekt oder für das ausgewählte Subnetz
  • Zum Zuweisen eines Legacy-Netzwerks zur VM: compute.networks.use für das Projekt
  • Zum Zuweisen einer externen IP-Adresse zur VM, wenn Sie ein Legacy-Netzwerk verwenden: compute.networks.useExternalIp für das Projekt
  • Zum Festlegen von Metadaten der VM-Instanz für die VM: compute.instances.setMetadata für das Projekt
  • Zum Festlegen von Tags für die VM: compute.instances.setTags für die VM
  • Zum Festlegen von Labels für die VM: compute.instances.setLabels für die VM
  • Zum Festlegen eines Dienstkontos für die VM: compute.instances.setServiceAccount für die VM
  • Zum Erstellen eines neuen Laufwerks für die VM: compute.disks.create für das Projekt
  • Zum Anhängen eines vorhandenen Laufwerks im Lese- oder Lese-/Schreibmodus: compute.disks.use für das Laufwerk
  • Zum Anhängen eines vorhandenen Laufwerks im Lesemodus: compute.disks.useReadOnly für das Laufwerk

Sie können diese Berechtigungen auch mit benutzerdefinierten Rollen oder anderen vordefinierten Rollen erhalten.

Vorbereiten des Erstellens von Spot-VMs

Bevor Sie Spot-VMs für eine Arbeitslast erstellen, führen Sie die folgenden Schritte aus:

  1. Arbeitslast so konfigurieren, dass sie mit dem Präemptieren umgehen kann Wir empfehlen, entweder ein Script vorzubereiten, das die Unterbrechung verarbeitet und als Teil Ihrer Arbeitslast ausgeführt wird, oder eine Datei, die Sie in den VM-Metadaten hinzufügen können, damit sie beim Herunterfahren ausgeführt wird. Eine Anleitung dazu finden Sie unter Vorzeitiges Beenden von Spot-VMs verwalten.

  2. Wir empfehlen dringend, sich die Daten für Spot-VMs anzusehen, um einen Maschinentyp und einen Standort auszuwählen. Wenn Sie einen Maschinentyp und einen Standort mit einer höheren Ressourcenverfügbarkeit auswählen, können Sie die Wahrscheinlichkeit von Fehlern bei der Ressourcenverfügbarkeit und einer längeren Betriebszeit vor der Unterbrechung erhöhen.

  3. Methode zum Erstellen von Spot-VMs auswählen Wir empfehlen, eine Methode wie folgt auszuwählen:

    Weitere Informationen zu Empfehlungen zum Erstellen von Spot-VMs finden Sie unter Best Practices.

Spot-VM erstellen

Nachdem Sie die Erstellung von Spot-VMs vorbereitet haben, können Sie eine Spot-VM mit einer der folgenden Methoden erstellen.

Console

  1. Rufen Sie in der Google Cloud Console die Seite Instanz erstellen auf.

    Zur Seite „Instanz erstellen“

  2. Führen Sie im Bereich Maschinenkonfiguration, der standardmäßig geöffnet ist, die folgenden Schritte aus:

    1. Wählen Sie im Abschnitt Bereitstellungsmodell aus der Liste VM-Bereitstellungsmodell die Option Spot aus. Der Abschnitt Erweiterte Einstellungen für das VM-Bereitstellungsmodell wird maximiert.
    2. Wählen Sie in der Liste Benachrichtigungsdauer bei Preemption eine Option aus, die dem Umgang mit Preemption entspricht.

      • Wenn Sie 120 Sekunden auswählen, müssen Sie dafür sorgen, dass das vorzeitige Beenden in Ihrer Arbeitslast berücksichtigt wird, bevor Sie eine Spot-VM erstellen. Prüfen Sie beispielsweise, ob Ihre Arbeitslast ein Skript zum Speichern Ihres Fortschritts enthält, das erst ausgeführt wird, wenn eine Unterbrechung erkannt wird.

      • Wenn Sie 0 Sekunden (Standard) auswählen, müssen Sie das vorzeitige Beenden mit einem Shutdown-Skript verwalten. Bevor Sie eine Spot-VM erstellen, erstellen Sie eine Datei mit einem Shutdown-Script, das Ihren Fortschritt speichert, wenn das Herunterfahren durch Preemption verursacht wird. Hängen Sie dieses Herunterfahr-Script an, wie in einem späteren Schritt beschrieben.

    3. Optional: Wenn Sie die Beendigungsaktion auswählen möchten, die ausgeführt wird, wenn Compute Engine die VM vorzeitig beendet, wählen Sie in der Liste Bei VM-Beendigung eine der folgenden Optionen aus:

      • Wählen Sie Beenden (Standardeinstellung) aus, um die VM während des vorzeitigen Beendens zu beenden.
      • Wählen Sie Löschen aus, um die VM während des vorzeitigen Beendens zu löschen.
  3. So fügen Sie ein Herunterfahrskript hinzu: Wenn Sie für die Dauer der Benachrichtigung über die Unterbrechung 0 Sekunden (Standard) ausgewählt haben, ist dieser Schritt erforderlich, um die Unterbrechung zu verarbeiten. Wenn Sie 120 Sekunden ausgewählt haben, ist dieser Schritt optional.

    1. Klicken Sie im Navigationsmenü auf Erweitert.
    2. Klicken Sie im Abschnitt Metadaten auf  Element hinzufügen.
    3. Geben Sie im Feld Schlüssel shutdown-script für den Metadatenschlüssel ein.
    4. Fügen Sie im Feld Wert den Inhalt eines Herunterfahrskripts hinzu, das die Preemption verarbeitet. Ein Beispiel für ein Shutdown-Skript finden Sie in diesem Dokument unter Beispiel für die Verarbeitung von vorzeitigen Beendigungen.
  4. Optional: Geben Sie weitere Konfigurationsoptionen an. Weitere Informationen finden Sie unter Konfigurationsoptionen beim Erstellen von Instanzen.

  5. Klicken Sie zum Erstellen und Starten der VM auf Erstellen.

gcloud

Verwenden Sie zum Erstellen einer VM mit der gcloud CLI den Befehl gcloud compute instances create: Wenn Sie eine VM erstellen, sollten Sie immer einen Maschinentyp, einen Standort und ein Betriebssystem-Image angeben.

Wenn Sie eine Spot-VM erstellen möchten, müssen Sie das Flag --provisioning-model=SPOT angeben. Wenn Sie die Dauer der Benachrichtigung über die Preemption angeben möchten, fügen Sie das Flag --preemption-notice-duration und bei Bedarf ein Shutdown-Script ein. Optional können Sie mit dem Flag --instance-termination-action auch eine Beendigungsaktion für Spot-VMs festlegen.

gcloud compute instances create VM_NAME \
    --machine-type=MACHINE_TYPE \
    --zone=ZONE \
    --image-family=IMAGE_FAMILY \
    --image-project=IMAGE_PROJECT \
    --provisioning-model=SPOT \
    --instance-termination-action=TERMINATION_ACTION \
    --preemption-notice-duration=PREEMPTION_NOTICE_DURATION \
    --metadata shutdown-script=SHUTDOWN_SCRIPT

Ersetzen Sie Folgendes:

  • VM_NAME ist der Name der neuen VM.

  • MACHINE_TYPE: der vordefinierte oder benutzerdefinierte Maschinentyp für die neue VM.

  • ZONE ist die Zone, in der die VM erstellt werden soll. Diese Zone muss auch den Maschinentyp unterstützen, der für die neue VM verwendet werden soll.

  • IMAGE_FAMILY ist eine Image-Familie. Dieser Wert gibt das neueste nicht verworfene Betriebssystem-Image an. Wenn Sie beispielsweise debian-13 angeben, wird die aktuelle Version in der Debian 13-Image-Familie verwendet. Weitere Informationen zur Verwendung von Image-Familien finden Sie unter Best Practices für Image-Familien.

  • IMAGE_PROJECT ist das Projekt, das das Image enthält. Wenn Sie beispielsweise debian-13 als Image-Familie festlegen, geben Sie debian-cloud als Image-Projekt an.

  • TERMINATION_ACTION: Optional: Geben Sie an, welche Beendigungsaktion ausgeführt werden soll, wenn Compute Engine die VM vorzeitig beendet, entweder STOP (Standardverhalten) oder DELETE.

  • PREEMPTION_NOTICE_DURATION: Gibt an, ob eine Benachrichtigungsdauer für die Unterbrechung aktiviert werden soll. Für die gcloud CLI muss der Wert entweder 120s oder 0s sein.

    • Wenn Sie 120s angeben, müssen Sie das Vorhaben in Ihrer Arbeitslast berücksichtigen. Optional können Sie auch ein Herunterfahrskript angeben.

    • Wenn Sie 0s (Standard) angeben, müssen Sie das vorzeitige Beenden in einem Shutdown-Skript verarbeiten.

  • SHUTDOWN_SCRIPT: ein Shutdown-Skript.

    • Wenn Sie PREEMPTION_NOTICE_DURATION auf 0s (Standard) festlegen, müssen Sie ein Shutdown-Script angeben, um die Unterbrechung zu verarbeiten. Weitere Informationen zum Formatieren und Angeben eines Shutdown-Skripts finden Sie unter Shutdown-Skripts ausführen.

    • Wenn Sie kein Shutdown-Script angeben möchten, können Sie das Flag --metadata shutdown-script entfernen.

Terraform

Mit einer Terraform-Ressource können Sie eine Spot-VM mit dem Block scheduling erstellen, wie im folgenden Beispiel gezeigt.

Wenn Sie ein Shutdown-Skript zum Verarbeiten von vorzeitigen Beendigungen hinzufügen möchten, fügen Sie auch einen metadata-Block hinzu, wie unter Shutdown-Skripts ausführen beschrieben. Ein Beispiel für ein Shutdown-Skript finden Sie in diesem Dokument unter Vorzeitiges Beenden verarbeiten.


resource "google_compute_instance" "spot_vm_instance" {
  name         = "spot-instance-name"
  machine_type = "f1-micro"
  zone         = "us-central1-c"

  boot_disk {
    initialize_params {
      image = "debian-cloud/debian-13"
    }
  }

  scheduling {
    preemptible                 = true
    automatic_restart           = false
    provisioning_model          = "SPOT"
    instance_termination_action = "STOP"
  }

  network_interface {
    # A default network is created for all GCP projects
    network = "default"
    access_config {
    }
  }
}

Informationen zum Anwenden oder Entfernen einer Terraform-Konfiguration finden Sie unter Grundlegende Terraform-Befehle.

REST

Wenn Sie eine VM mit der Compute Engine API erstellen möchten, verwenden Sie die Methode instances.insert. Wenn Sie eine VM erstellen, sollten Sie immer einen Maschinentyp, einen Standort und ein Betriebssystem-Image angeben.

Zum Erstellen einer Spot-VM müssen Sie das Feld "provisioningModel": "SPOT" angeben. Fügen Sie das Feld preemptionNoticeDuration ein, um die Dauer der Benachrichtigung über die Unterbrechung anzugeben. Optional können Sie mit dem Feld instanceTerminationAction auch eine Beendigungsaktion für Spot-VMs festlegen.

POST https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/zones/ZONE/instances
{
 "machineType": "zones/ZONE/machineTypes/MACHINE_TYPE",
 "name": "VM_NAME",
 "disks": [
   {
     "initializeParams": {
       "sourceImage": "projects/IMAGE_PROJECT/global/images/IMAGE"
     },
     "boot": true
   }
 ],
 "scheduling":
 {
     "provisioningModel": "SPOT",
     "instanceTerminationAction": "TERMINATION_ACTION",
     "preemptionNoticeDuration": { "seconds": PREEMPTION_NOTICE_DURATION }
 },
"metadata": {
    "items": [
      {
        "key": "shutdown-script",
        "value": "SHUTDOWN_SCRIPT"
      }
    ]
  }
}

Ersetzen Sie Folgendes:

  • PROJECT_ID: die Projekt-ID des Projekts, in dem die VM erstellt werden soll.
  • ZONE ist die Zone, in der die VM erstellt werden soll. Diese Zone muss auch den Maschinentyp unterstützen, der für die neue VM verwendet werden soll.
  • MACHINE_TYPE: der vordefinierte oder benutzerdefinierte Maschinentyp für die neue VM.
  • VM_NAME ist der Name der neuen VM.
  • IMAGE_PROJECT: Das Projekt, das das Image enthält. Wenn Sie beispielsweise family/debian-13 als Image-Familie festlegen, geben Sie debian-cloud als Image-Projekt an.
  • IMAGE: Geben Sie eine der folgenden Optionen an:

    • Eine bestimmte Version eines öffentlichen Images. Ein bestimmtes Image ist beispielsweise "sourceImage": "projects/debian-cloud/global/images/debian-13-trixie-v20260908", wobei debian-cloud das IMAGE_PROJECT ist.
    • Eine Image-Familie. Dadurch wird die VM aus dem neuesten nicht verworfenen Betriebssystem-Image erstellt. Wenn Sie beispielsweise "sourceImage": "projects/debian-cloud/global/images/family/debian-13" angeben, wobei debian-cloud der IMAGE_PROJECT ist, erstellt Compute Engine eine VM aus der neuesten Version des Betriebssystem-Images in der Debian 13-Image-Familie.
  • TERMINATION_ACTION: Optional: Geben Sie an, welche Beendigungsaktion ausgeführt werden soll, wenn Compute Engine die VM vorzeitig beendet, entweder STOP (Standardverhalten) oder DELETE.

  • PREEMPTION_NOTICE_DURATION: Gibt an, ob eine Benachrichtigungsdauer für die Unterbrechung aktiviert werden soll. Für REST muss der Wert entweder 120 oder 0 sein.

    • Wenn Sie 120 angeben, müssen Sie das Vorhaben in Ihrer Arbeitslast berücksichtigen. Optional können Sie auch ein Herunterfahrskript angeben.

    • Wenn Sie 0 (Standard) angeben, müssen Sie das vorzeitige Beenden in einem Shutdown-Skript verarbeiten.

  • SHUTDOWN_SCRIPT: ein Shutdown-Skript.

    • Wenn Sie PREEMPTION_NOTICE_DURATION auf 0 (Standard) festlegen, müssen Sie ein Shutdown-Script angeben, um die Unterbrechung zu verarbeiten. Weitere Informationen zum Formatieren und Angeben eines Shutdown-Skripts finden Sie unter Shutdown-Skripts ausführen. Ein Beispiel für ein Shutdown-Skript finden Sie in diesem Dokument unter Beispiel für die Verarbeitung von vorzeitigen Beendigungen.

    • Wenn Sie kein Shutdown-Script angeben möchten, können Sie das Feld metadata und die Unterfelder entfernen.

Weitere Informationen zu den Optionen, die Sie beim Erstellen einer VM angeben können, finden Sie unter Konfigurationsoptionen beim Erstellen von Instanzen.

Spot-VMs starten

Wie andere VMs starten Spot-VMs bei der Erstellung. Ebenso können Sie, wenn Spot-VMs beendet werden, die VMs neu starten und zum Status RUNNING zurückkehren. Sie können vorzeitig beendete Spot-VMs beliebig oft stoppen und neu starten, solange Kapazität vorhanden ist. Weitere Informationen finden Sie unter Lebenszyklus von VM-Instanzen.

Wenn Compute Engine eine oder mehrere Spot-VMs in einer verwalteten Instanzgruppe (Managed Instance Group, MIG) oder einem Google Kubernetes Engine-Cluster (GKE) beendet, startet die Gruppe die VMs neu, sobald die Ressourcen wieder verfügbar sind.

Bereitstellungsmodell und Beendigungsaktion einer VM identifizieren

Ermitteln Sie anhand des Bereitstellungsmodells einer VM, ob es sich um eine Standard-VM, Spot-VM oder präemptive VM handelt. Für eine Spot-VM können Sie auch die Beendigungsaktion identifizieren. Sie können das Bereitstellungsmodell und die Beendigungsaktion einer VM über dieGoogle Cloud Console, die gcloud CLI oder die Compute Engine API identifizieren.

Console

  1. Rufen Sie die Seite VM-Instanzen auf.

    Zur Seite "VM-Instanzen"

  2. Klicken Sie auf den Namen der VM, die Sie ändern möchten. Die Seite VM-Instanzdetails wird geöffnet.

  3. Wechseln Sie unten auf der Seite zum Abschnitt Verwaltung. Aktivieren Sie im Unterbereich Verfügbarkeitsrichtlinien die folgenden Optionen:

    • Wenn das VM-Bereitstellungsmodell auf Spot gesetzt ist, ist die VM eine Spot-VM.
      • Bei VM gibt Beendigung an, welche Aktion ausgeführt werden soll, wenn Compute Engine die VM vorzeitig beendet: entweder beenden oder löschen.
    • Wenn das VM-Bereitstellungsmodell auf Standard oder – gesetzt ist, gilt Folgendes:
      • Wenn die Option Abrufbarkeit auf Ein festgelegt ist, ist die VM eine VM auf Abruf.
      • Andernfalls ist die VM eine Standard-VM.

gcloud

Verwenden Sie zum Beschreiben einer VM mit der gcloud CLI den Befehl gcloud compute instances describe:

gcloud compute instances describe VM_NAME

Dabei ist VM_NAME der Name der VM, die Sie prüfen möchten.

Prüfen Sie in der Ausgabe das Feld scheduling, um die VM zu identifizieren:

  • Wenn die Ausgabe das Feld provisioningModel enthält, das auf SPOT festgelegt ist, ist die VM eine Spot-VM, ähnlich wie im Folgenden.

    ...
    scheduling:
    ...
    provisioningModel: SPOT
    instanceTerminationAction: TERMINATION_ACTION
    ...
    

    Dabei gibt TERMINATION_ACTION an, welche Aktion ausgeführt werden soll, wenn Compute Engine die VM vorzeitig beendet – entweder Stoppen (STOP) oder Löschen (DELETE). Wenn das Feld instanceTerminationAction fehlt, ist der Standardwert STOP.

  • Wenn dagegen die Ausgabe das Feld provisioningModel enthält, das auf standard gesetzt ist, oder wenn das Feld provisioningModel nicht in der Ausgabe angegeben ist:

    • Wenn die Ausgabe das Feld preemptible enthält, das auf true gesetzt ist, ist die VM eine VM auf Abruf.
    • Andernfalls ist die VM eine Standard-VM.

REST

Zum Beschreiben einer VM aus der Compute Engine API verwenden Sie die Methode instances.get:

GET https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/zones/ZONE/instances/VM_NAME

Ersetzen Sie Folgendes:

  • PROJECT_ID: die Projekt-ID des Projekts, in dem sich die VM befindet.
  • ZONE ist die Zone, in der sich die VM befindet.
  • VM_NAME ist der Name der VM, die Sie prüfen möchten.

Prüfen Sie in der Ausgabe das Feld scheduling, um die VM zu identifizieren:

  • Wenn die Ausgabe das Feld provisioningModel enthält, das auf SPOT festgelegt ist, ist die VM eine Spot-VM, ähnlich wie im Folgenden.

    {
      ...
      "scheduling":
      {
         ...
         "provisioningModel": "SPOT",
         "instanceTerminationAction": "TERMINATION_ACTION"
         ...
      },
      ...
    }
    

    Dabei gibt TERMINATION_ACTION an, welche Aktion ausgeführt werden soll, wenn Compute Engine die VM vorzeitig beendet – entweder Stoppen (STOP) oder Löschen (DELETE). Wenn das Feld instanceTerminationAction fehlt, ist der Standardwert STOP.

  • Wenn dagegen die Ausgabe das Feld provisioningModel enthält, das auf standard gesetzt ist, oder wenn das Feld provisioningModel nicht in der Ausgabe angegeben ist:

    • Wenn die Ausgabe das Feld preemptible enthält, das auf true gesetzt ist, ist die VM eine VM auf Abruf.
    • Andernfalls ist die VM eine Standard-VM.

Go


import (
	"context"
	"fmt"
	"io"

	compute "cloud.google.com/go/compute/apiv1"
	"cloud.google.com/go/compute/apiv1/computepb"
)

// isSpotVM checks if a given instance is a Spot VM or not.
func isSpotVM(w io.Writer, projectID, zone, instanceName string) (bool, error) {
	// projectID := "your_project_id"
	// zone := "europe-central2-b"
	// instanceName := "your_instance_name"
	ctx := context.Background()
	client, err := compute.NewInstancesRESTClient(ctx)
	if err != nil {
		return false, fmt.Errorf("NewInstancesRESTClient: %w", err)
	}
	defer client.Close()

	req := &computepb.GetInstanceRequest{
		Project:  projectID,
		Zone:     zone,
		Instance: instanceName,
	}

	instance, err := client.Get(ctx, req)
	if err != nil {
		return false, fmt.Errorf("GetInstance: %w", err)
	}

	isSpot := instance.GetScheduling().GetProvisioningModel() == computepb.Scheduling_SPOT.String()

	var isSpotMessage string
	if !isSpot {
		isSpotMessage = " not"
	}
	fmt.Fprintf(w, "Instance %s is%s spot\n", instanceName, isSpotMessage)

	return instance.GetScheduling().GetProvisioningModel() == computepb.Scheduling_SPOT.String(), nil
}

Java


import com.google.cloud.compute.v1.Instance;
import com.google.cloud.compute.v1.InstancesClient;
import com.google.cloud.compute.v1.Scheduling;
import java.io.IOException;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.TimeoutException;

public class CheckIsSpotVm {
  public static void main(String[] args)
          throws IOException, ExecutionException, InterruptedException, TimeoutException {
    // TODO(developer): Replace these variables before running the sample.
    // Project ID or project number of the Google Cloud project you want to use.
    String projectId = "your-project-id";
    // Name of the virtual machine to check.
    String instanceName = "your-route-name";
    // Name of the zone you want to use. For example: "us-west3-b"
    String zone = "your-zone";

    boolean isSpotVm = isSpotVm(projectId, instanceName, zone);
    System.out.printf("Is %s spot VM instance - %s", instanceName, isSpotVm);
  }

  // Check if a given instance is Spot VM or not.
  public static boolean isSpotVm(String projectId, String instanceName, String zone)
          throws IOException {
    // Initialize client that will be used to send requests. This client only needs to be created
    // once, and can be reused for multiple requests.
    try (InstancesClient client = InstancesClient.create()) {
      Instance instance = client.get(projectId, zone, instanceName);

      return instance.getScheduling().getProvisioningModel()
              .equals(Scheduling.ProvisioningModel.SPOT.name());
    }
  }
}

Python

from google.cloud import compute_v1


def is_spot_vm(project_id: str, zone: str, instance_name: str) -> bool:
    """
    Check if a given instance is Spot VM or not.
    Args:
        project_id: project ID or project number of the Cloud project you want to use.
        zone: name of the zone you want to use. For example: "us-west3-b"
        instance_name: name of the virtual machine to check.
    Returns:
        The Spot VM status of the instance.
    """
    instance_client = compute_v1.InstancesClient()
    instance = instance_client.get(
        project=project_id, zone=zone, instance=instance_name
    )
    return (
        instance.scheduling.provisioning_model
        == compute_v1.Scheduling.ProvisioningModel.SPOT.name
    )

Vorzeitiges Beenden von Spot-VMs verwalten

In den folgenden Abschnitten erfahren Sie, wie Sie das vorzeitige Beenden von Spot-VMs verwalten:

Umgang mit vorzeitigem Beenden

Wenn Compute Engine mit dem vorzeitigen Beenden einer Spot-VM beginnt, können Sie versuchen, Bereinigungsaktionen auszuführen, bevor die VM heruntergefahren wird. Der Umgang mit der Unterbrechung kann das ordnungsgemäße Beenden eines laufenden Prozesses und die Übertragung des Status Ihrer Arbeitslast umfassen.

Sie haben folgende Möglichkeiten, um auf das Vorbelegungssignal einer Spot-VM zu reagieren. Weitere Informationen dazu, wo Sie das vorzeitige Beenden für Ihre Arbeitslast verarbeiten, finden Sie in der Definition der Dauer der Benachrichtigung über das vorzeitige Beenden.

  • Unterbrechungen in Ihrer Arbeitslast verarbeiten Wir empfehlen diese Methode für Spot-VMs mit einer Vorwarnungsdauer von 120 Sekunden. Konfigurieren Sie in Ihrer Arbeitslast Code für die Verarbeitung von Preemption, der erst ausgeführt wird, wenn die Preemption beginnt, wie unter Preemption in einer VM erkennen beschrieben. Ihr Code für die Verarbeitung des vorzeitigen Beendens wird dann während der Dauer der Benachrichtigung über das vorzeitige Beenden ausgeführt. Optional kann für diese VMs auch ein Herunterfahrskript angegeben werden, das während des Herunterfahrens ausgeführt wird.
  • Vorzeitiges Beenden mit einem Shutdown-Skript verwalten Wir empfehlen diese Methode für Spot-VMs ohne Dauer des Hinweises auf vorzeitiges Beenden, was die Standardkonfiguration ist. Konfigurieren Sie Ihren Code speziell für die Verarbeitung von Preemption in einem Shutdown-Script, wie im folgenden Beispiel gezeigt. Das Shutdown-Script wird während der Zeitspanne für das Herunterfahren (Best-Effort) bei jeder Art von Herunterfahren automatisch bis zu 30 Sekunden lang ausgeführt. Daher sollten Sie den Code für die Verarbeitung der vorzeitigen Beendigung so konfigurieren, dass er nur ausgeführt wird, wenn die VM vorzeitig beendet wird, wie unter Vorzeitige Beendigung in einer VM erkennen beschrieben.

Beispiel für den Umgang mit vorzeitigem Beenden

Im folgenden Beispielskript wird gezeigt, wie Sie die Unterbrechung durch Hochladen einer Checkpoint-Datei in einen Cloud Storage-Bucket behandeln. Sie können dieses Skript entweder in Ihrer Arbeitslast ausführen oder als Shutdown-Skript konfigurieren. Nachdem ein angegebenes Programm ordnungsgemäß beendet wurde, lädt das Skript parallel eine Prüfpunktdatei in einen Cloud Storage-Bucket hoch. Nachdem das Script beendet wurde oder das Zeitlimit überschritten wurde, werden alle verbleibenden Prozesse mit dem normalen kill-Befehl des Betriebssystems beendet.

#!/bin/bash

MY_PROGRAM="PROGRAM_NAME" # For example, "apache2" or "nginx"
MY_USER="LOCAL_USER"
CHECKPOINT="/home/$MY_USER/checkpoint.out"
BUCKET_NAME="BUCKET_NAME" # For example, "my-checkpoint-files" (without gs://)

echo "Shutting down!  Seeing if ${MY_PROGRAM} is running."

# Find the newest copy of $MY_PROGRAM
PID="$(pgrep -n "$MY_PROGRAM")"

if [[ "$?" -ne 0 ]]; then
  echo "${MY_PROGRAM} not running, shutting down immediately."
  exit 0
fi

echo "Sending SIGINT to $PID"
kill -2 "$PID"

# Portable waitpid equivalent
while kill -0 "$PID"; do
   sleep 1
done

echo "$PID is done, copying ${CHECKPOINT} to gs://${BUCKET_NAME} as ${MY_USER}"

su "${MY_USER}" -c "gcloud storage cp $CHECKPOINT gs://${BUCKET_NAME}/"

echo "Done uploading, shutting down."

Das Skript setzt Folgendes aus:

  • Die VM wurde mindestens mit Lese- oder Schreibzugriff auf Cloud Storage erstellt. Eine Anleitung zum Erstellen einer VM mit den entsprechenden Bereichen finden Sie in der Dokumentation zur Authentifizierung.

  • Sie haben einen Cloud Storage-Bucket und die Berechtigung zum Schreiben in diesen Bucket.

Um dieses Skript einer VM hinzuzufügen, konfigurieren Sie es so, dass es mit der Arbeitslast auf der VM funktioniert, und fügen es dann der Arbeitslast oder den VM-Metadaten hinzu.

  1. Kopieren oder laden Sie das Beispielskript herunter:

    • Kopieren Sie das vorherige Script, nachdem Sie Folgendes ersetzt haben:

      • PROGRAM_NAME: der Name des Prozesses oder Programms, das Sie beenden möchten. Beispiel: apache2 oder nginx
      • LOCAL_USER: Der Nutzername, mit dem Sie auf der VM angemeldet sind.
      • BUCKET_NAME: der Name des Cloud Storage-Bucket, in dem Sie die Checkpoint-Datei des Programms speichern möchten. Der Bucket-Name beginnt in diesem Fall nicht mit gs://.
    • Laden Sie das Beispielskript auf Ihre lokale Workstation herunter. Ersetzen Sie dann die folgenden Variablen in der Datei:

      • PROGRAM_NAME: der Name des Prozesses oder Programms, das Sie beenden möchten. Beispiel: apache2 oder nginx
      • LOCAL_USER: Der Nutzername, mit dem Sie auf der VM angemeldet sind.
      • BUCKET_NAME: der Name des Cloud Storage-Bucket, in dem Sie die Checkpoint-Datei des Programms speichern möchten. Der Bucket-Name beginnt in diesem Fall nicht mit gs://.
  2. Konfigurieren Sie die Erkennung vorzeitiger Beendigungen und fügen Sie das Skript entsprechend dem Ort hinzu, an dem Sie die vorzeitige Beendigung verarbeiten möchten, entweder in Ihrer Arbeitslast oder in einem Shutdown-Skript. Weitere Informationen dazu, wo Sie das vorzeitige Beenden für Ihre Arbeitslast verarbeiten, finden Sie in der Definition der Dauer der Benachrichtigung über das vorzeitige Beenden.

    • Unterbrechungen in Ihrer Arbeitslast verarbeiten:Führen Sie die folgenden Schritte aus.

      1. Konfigurieren Sie das Script so, dass es wartet, bis das vorzeitige Beenden beginnt, wie unter Vorzeitiges Beenden in einer VM erkennen beschrieben.

      2. Fügen Sie das Skript Ihrer Arbeitslast hinzu.

    • Vorzeitiges Beenden mit einem Shutdown-Skript verarbeiten:Führen Sie die folgenden Schritte aus.

      1. Wir empfehlen, das Script so zu konfigurieren, dass es nur ausgeführt wird, wenn das Herunterfahren durch ein vorzeitiges Beenden verursacht wird, wie unter Vorzeitiges Beenden in einer VM erkennen beschrieben. Sie müssen beispielsweise keine Prüfpunktdatei hochladen, wenn Ihre VM heruntergefahren wird, weil Ihre Arbeitslast abgeschlossen ist.

      2. Fügen Sie das Shutdown-Skript einer neuen VM oder einer vorhandenen VM hinzu.

Vorzeitiges Beenden von Spot-VMs erkennen

In den folgenden Abschnitten werden die Methoden beschrieben, mit denen Sie das Präemptieren von Spot-VMs erkennen können.

Vorzeitiges Beenden in einer VM erkennen

Wenn Sie erkennen möchten, ob eine VM von der VM selbst aus präemptiv beendet wird, prüfen Sie den Metadatenserver auf den Wert preempted in den Standardmetadaten der VM. Verwenden Sie beispielsweise eine oder mehrere der folgenden Methoden, je nachdem, wo Sie die Unterbrechung behandeln möchten.

  • Wenn Sie das vorzeitige Beenden in einem Shutdown-Skript verarbeiten, prüfen Sie den aktuellen Wert von preempted. Sie können den folgenden curl-Befehl in der VM ausführen, um den aktuellen Wert für preempted abzurufen:

    curl "http://metadata.google.internal/computeMetadata/v1/instance/preempted" -H "Metadata-Flavor: Google"
    TRUE
    

    Wenn dieser Wert TRUE ist, wurde die VM von Compute Engine vorzeitig beendet, andernfalls lautet er FALSE. Verwenden Sie diesen Befehl beispielsweise in einem Shutdown-Script, um je nach Ursache des Herunterfahrens unterschiedliche Aktionen auszuführen.

  • Wenn Sie die Unterbrechung in Ihrer Arbeitslast verarbeiten, warten Sie, bis preempted TRUE ist. Wenn Sie warten möchten, bis preempted TRUE ist, können Sie den Abfrageparameter ?wait_for_change=true an die URL des vorherigen Befehls anhängen. Mit diesem Abfrageparameter führt der Befehl eine hängende HTTP-GET-Anfrage aus, die nur zurückgegeben wird, wenn sich die Metadaten geändert haben und die VM vorzeitig beendet wurde.

    curl "http://metadata.google.internal/computeMetadata/v1/instance/preempted?wait_for_change=true" -H "Metadata-Flavor: Google"
    TRUE
    

    Dieser Befehl ist nützlich, wenn Sie die Verarbeitung von Präemptionen außerhalb eines Shutdown-Skripts auslösen möchten. Mit dieser Methode können Sie beispielsweise die Verarbeitung vorzeitiger Beendigungen für Spot-VMs mit einer Benachrichtigungsdauer von 120 Sekunden auslösen.

Vorwegnahmevorgänge ansehen

Sie können Unterbrechungsvorgänge von Compute Engine über dieGoogle Cloud console, die gcloud CLI oder die Compute Engine API aufrufen.

Console

Im Systemaktivitätsprotokoll können Sie prüfen, ob eine VM vorzeitig beendet wurde.

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

    Zu den Logs

  2. Wählen Sie Ihr Projekt aus und klicken Sie auf Weiter.

  3. Fügen Sie compute.instances.preempted zum Feld Nach Label oder Textsuche filtern hinzu.

  4. Optional können Sie auch einen VM-Namen eingeben, wenn Sie Vorgänge der vorzeitigen Beendigung für eine bestimmte VM prüfen möchten.

  5. Drücken Sie die Eingabetaste, um die angegebenen Filter anzuwenden. Die Google Cloud Console aktualisiert die Liste der Logs so, dass nur die Vorgänge angezeigt werden, bei denen eine VM vorzeitig beendet wurde.

  6. Wählen Sie einen Vorgang aus der Liste aus, um Details zur VM zu sehen, die vorzeitig beendet wurde.

gcloud

Verwenden Sie den Befehl gcloud compute operations list mit einem Filterparameter, um eine Liste vorzeitig beendeter Ereignisse in Ihrem Projekt zu erhalten.

gcloud compute operations list \
    --filter="operationType=compute.instances.preempted"

Optional können Sie die Ergebnisse durch zusätzliche Filterparameter anpassen. Mit dem folgenden Befehl können Sie beispielsweise Ereignisse der vorzeitigen Beendigung nur für Instanzen innerhalb einer verwalteten Instanzgruppe aufrufen:

gcloud compute operations list \
    --filter="operationType=compute.instances.preempted AND targetLink:instances/BASE_INSTANCE_NAME"

Dabei ist BASE_INSTANCE_NAME der Basisname, der als Präfix für die Namen aller VMs in dieser verwalteten Instanzgruppe verwendet wird.

Die entsprechende Ausgabe sieht etwa so aus:

NAME                  TYPE                         TARGET                                        HTTP_STATUS STATUS TIMESTAMP
systemevent-yyyyyyyy  compute.instances.preempted  us-central1-f/instances/example-instance-yyy  200         DONE   2015-04-02T12:12:10.881-07:00

Der Vorgangstyp compute.instances.preempted zeigt an, dass die VM vorzeitig beendet wurde. Mit dem Befehl gcloud compute operations describe erhalten Sie weitere Informationen zu einem bestimmten Vorgang zur vorzeitigen Beendigung.

gcloud compute operations describe SYSTEM_EVENT \
    --zone=ZONE

Ersetzen Sie Folgendes:

  • SYSTEM_EVENT: Das Systemereignis aus der Ausgabe des Befehls gcloud compute operations list, z. B. systemevent-yyyyyyyy.
  • ZONE: Die Zone des Systemereignisses, z. B. us-central1-f.

Die Ausgabe sieht in etwa so aus:

...
operationType: compute.instances.preempted
progress: 100
selfLink: https://compute.googleapis.com/compute/v1/projects/my-project/zones/us-central1-f/operations/systemevent-yyyyyyyy
startTime: '2015-04-02T12:12:10.881-07:00'
status: DONE
statusMessage: Instance was preempted.
...

REST

Mit der Methode zoneOperations.get können Sie eine Liste der letzten Systemvorgänge für ein bestimmtes Projekt und eine bestimmte Zone abrufen.

GET https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/zones/ZONE/operations

Ersetzen Sie Folgendes:

Wenn Sie die Antworten optional so eingrenzen möchten, dass nur Vorgänge zur vorzeitigen Beendigung angezeigt werden, können Sie Ihrer API-Anfrage einen Filter hinzufügen:

operationType="compute.instances.preempted"

Alternativ können Sie zum Abrufen von Vorgängen zur vorzeitigen Beendigung für eine bestimmte VM den Parameter targetLink zum Filter hinzufügen:

operationType="compute.instances.preempted" AND
targetLink="https://www.googleapis.com/compute/v1/projects/PROJECT_ID/zones/ZONE/instances/VM_NAME

Ersetzen Sie Folgendes: + PROJECT_ID: die Projekt-ID. + ZONE: die Zone. + VM_NAME: der Name einer bestimmten VM in dieser Zone und in diesem Projekt.

Die Antwort enthält eine Liste der letzten Vorgänge. Vorzeitiges Beenden sieht beispielsweise so aus:

{
  "kind": "compute#operation",
  "id": "15041793718812375371",
  "name": "systemevent-yyyyyyyy",
  "zone": "https://www.googleapis.com/compute/v1/projects/my-project/zones/us-central1-f",
  "operationType": "compute.instances.preempted",
  "targetLink": "https://www.googleapis.com/compute/v1/projects/my-project/zones/us-central1-f/instances/example-instance",
  "targetId": "12820389800990687210",
  "status": "DONE",
  "statusMessage": "Instance was preempted.",
  ...
}

Einstellungen für vorzeitiges Beenden testen

Sie können simulierte Wartungsereignisse für Ihre Spot-VMs ausführen, um eine vorzeitige Beendigung zu erzwingen. Mit diesem Feature können Sie testen, wie Ihre Arbeitslasten das Vorrecht erkennen und darauf reagieren. Unter Hostwartungsereignis simulieren erfahren Sie, wie Sie Wartungsereignisse in Ihren Instanzen testen.

Best Practices

Im Folgenden finden Sie einige Best Practices, mit denen Sie Spot-VMs optimal nutzen können.

  • Ressourcenverfügbarkeit ansehen Bevor Sie Spot-VMs erstellen oder wenn Sie versuchen, Spot-VMs zu erstellen, aber immer wieder Fehler bei der Ressourcenverfügbarkeit auftreten, können Sie die Verfügbarkeit eines Maschinentyps in einer bestimmten Region oder Zone prüfen. Wenn Sie die Verfügbarkeit von Ressourcen prüfen, erhöhen Sie die Wahrscheinlichkeit, dass Sie Spot-VMs erfolgreich erstellen können. Eine Anleitung finden Sie unter Verfügbarkeit von Spot-VMs ansehen.

  • Verlaufsdaten ansehen Bevor Sie Spot-VMs erstellen, können Sie die bisherige Rate der vorzeitigen Beendigungen und die bisherigen Preise für die Maschinentypen ansehen, die Ihre Spot-VMs verwenden sollen. Anhand dieser Informationen können Sie den Maschinentyp vergleichen und auswählen, der am besten zu Ihrer Arbeitslast und Ihren Kostenanforderungen passt. Eine Anleitung finden Sie unter Abrufquote und Preise für Spot-VMs ansehen.

  • Instanzvorlagen verwenden. Anstatt Spot-VMs einzeln zu erstellen, können Sie mit Instanzvorlagen mehrere Spot-VMs mit denselben Attributen erstellen. Instanzvorlagen sind für die Verwendung von MIGs erforderlich. Alternativ können Sie mehrere Spot-VMs mit der Bulk-Instanz-API erstellen.

  • Mit MIGs die Ressourcenverfügbarkeit verbessern und Spot-VMs automatisch neu erstellen. Verwenden Sie MIGs, um Arbeitslasten auf Spot-VMs flexibler und stabiler zu gestalten. Um beispielsweise Fehler bei der Ressourcenverfügbarkeit zu vermeiden, können Sie die Flexibilität Ihrer Arbeitslast erhöhen, indem Sie Folgendes zulassen:

    Außerdem können MIGs vorzeitig beendete Spot-VMs reparieren, indem sie sie automatisch neu erstellen.

  • Kleinere Maschinentypen auswählen. Ressourcen für Spot-VMs stammen aus überschüssiger Kapazität und Sicherungskapazität von Google Cloud . Die Kapazität für Spot-VMs ist häufig für kleinere Maschinentypen leichter zu erhalten, also für Maschinentypen mit weniger Ressourcen wie vCPUs und Arbeitsspeicher. Wenn Sie einen kleineren benutzerdefinierten Maschinentyp auswählen, finden Sie möglicherweise mehr Kapazität für Spot-VMs. Für kleinere vordefinierte Maschinentypen ist die Kapazität jedoch wahrscheinlicher. Im Vergleich zu der Kapazität für den vordefinierten Maschinentyp n2-standard-32 ist die Kapazität für den benutzerdefinierten Maschinentyp n2-custom-24-96 wahrscheinlicher, aber die Kapazität für den vordefinierten Maschinentyp n2-standard-16 ist noch wahrscheinlicher.

  • Führen Sie große Cluster von Spot-VMs außerhalb der Spitzenzeiten aus. Die Belastung der Google Cloud Rechenzentren variiert je nach Standort und Tageszeit, ist aber in der Regel nachts und am Wochenende am geringsten. Somit eignen sich Nächte und Wochenenden am besten zur Ausführung großer Cluster von Spot-VMs.

  • Arbeitslasten so konzipieren, dass sie fehlertolerant sind und vorzeitig beendet werden können Man sollte immer darauf vorbereitet sein, dass Änderungen bei den vorzeitigen Beendigungsmustern zu unterschiedlichen Zeiten auftreten. Wenn beispielsweise eine Zone teilweise ausfällt, könnte eine große Anzahl von Spot-VMs vorzeitig beendet werden, um Platz für Standard-VMs zu schaffen, die im Rahmen der Wiederherstellung verschoben werden müssen. In diesem kleinen Zeitfenster würde die vorzeitige Beendigungsrate ganz anders als an jedem anderen Tag aussehen. Wenn Ihr Arbeitslast davon ausgeht, dass vorzeitige Beendigungen immer in kleinen Gruppen erfolgen, sind Sie möglicherweise nicht auf einen derartigen Fall vorbereitet.

  • Erstellen von Spot-VMs wiederholen, die vorzeitig beendet wurden. Wenn die Spot-VMs vorzeitig beendet wurden, versuchen Sie ein- oder zweimal, neue Spot-VMs zu erstellen, bevor Sie auf Standard-VMs zurückgreifen. Je nach Anforderungen können Sie Standard-VMs und Spot-VMs in Ihren Clustern kombinieren, um eine Fortsetzung der Arbeit mit einer angemessenen Geschwindigkeit sicherzustellen.

  • Fortschritt speichern, um Vorwegnahme zu vermeiden: Verwalten Sie Hinweise zu Shutdown und vorzeitiger Beendigung, indem Sie den Fortschritt Ihrer Arbeitslast speichern. Dann kann die Arbeitslast nach einer Unterbrechung an jener Stelle wiederaufgenommen werden, an der sie unterbrochen wurde, und muss nicht vollständig neu erstellt werden. Speichern Sie beispielsweise den Fortschritt, wenn ein vorzeitiges Beenden erkannt wird, wie unter Vorzeitiges Beenden von Spot-VMs verwalten beschrieben. Um die Robustheit weiter zu erhöhen, sollten Sie den Fortschritt auch in regelmäßigen Abständen speichern, nicht nur, wenn eine Unterbrechung erkannt wird.

Nächste Schritte