VM-Instanzen auf Abruf erstellen und starten

Auf dieser Seite wird beschrieben, wie eine präemptive VM-Instanz erstellt und verwendet wird. Eine präemptive Instanz kann zu einem wesentlich günstigeren Preis als normale Instanzen erstellt und ausgeführt werden. Compute Engine kann diese Instanzen jedoch präemptiv beenden, wenn für andere Aufgaben Zugriff auf diese Ressourcen benötigt wird. Präemptive Instanzen werden immer nach 24 Stunden beendet. Weitere Informationen zu präemptiven Instanzen finden Sie in der Dokumentation zu präemptiven Instanzen.

Präemptive Instanzen werden nur für fehlertolerante Anwendungen empfohlen, die Instanzpräemptionen standhalten können. Stellen Sie sicher, dass Ihre Anwendung Präemptionen standhalten kann, bevor Sie eine präemptive Instanz erstellen. In der Dokumentation zu Instanzen auf Abruf werden die Risiken und Vorteile von Instanzen auf Abruf beschrieben.

Vorbereitung

Instanz auf Abruf erstellen

Sie können mit der Google Cloud Platform Console, dem gcloud-Tool oder der API eine Instanz auf Abruf erstellen.

Console

Eine präemptive Instanz wird genau wie eine normale Instanz erstellt, allerdings aktivieren Sie das Attribut preemptible.

  1. Rufen Sie in der GCP Console die Seite "VM-Instanzen" auf.

    Die Seite VM-Instanzen aufrufen

  2. Klicken Sie auf Instanz erstellen.
  3. Tragen Sie auf der Seite Eine neue Instanz erstellen die gewünschten Eigenschaften für Ihre Instanz ein.
  4. Klicken Sie auf Verwaltung, Sicherheit, Laufwerke, Netzwerke, einzelne Mandanten.
  5. Legen Sie unter Verfügbarkeitsrichtlinie für Präemptivität die Option Ein fest. Durch diese Einstellung wird der automatische Neustart für die Instanz deaktiviert und die Hostwartungsaktion auf Beenden gesetzt.
  6. Klicken Sie auf Erstellen, um die Instanz zu erstellen.

gcloud

Verwenden Sie bei gcloud compute denselben Befehl instances create, mit dem Sie eine normale Instanz erstellen würden, aber fügen Sie das Flag --preemptible hinzu.

gcloud compute instances create [INSTANCE_NAME] --preemptible

Dabei ist [INSTANCE_NAME] der Name der Instanz.

API

In der API erstellen Sie eine normale Anfrage zum Erstellen einer Instanz, aber fügen das Attribut preemptible unter scheduling hinzu und setzen es auf true. Beispiel:

POST https://www.googleapis.com/compute/v1/projects/[PROJECT_ID]/zones/[ZONE]/instances

{
  'machineType': 'zones/[ZONE]/machineTypes/[MACHINE_TYPE]',
  'name': '[INSTANCE_NAME]',
  'scheduling':
  {
    'preemptible': true
  },
  ...
}

Präemptive CPU-Kontingente

Präemptive Instanzen erfordern verfügbare CPU-Kontingente wie reguläre Instanzen. Um zu vermeiden, dass präemptive Instanzen die CPU-Kontingente für die regulären Instanzen belegen, können Sie ein besonderes Kontingent "Präemptive CPU" anfordern. Nachdem Compute Engine ein präemptives CPU-Kontingent in dieser Region zugeteilt hat, werden alle präemptiven Instanzen auf dieses Kontingent angerechnet. Alle regulären Instanzen werden weiter auf das reguläre CPU-Kontingent angerechnet.

In Regionen, in denen kein präemptives CPU-Kontingent vorhanden ist, können Sie das reguläre CPU-Kontingent verwenden, um präemptive Instanzen zu starten. Außerdem benötigen Sie wie üblich ein ausreichendes IP-Adressen- und Laufwerkskontingent. Das präemptive CPU-Kontingent ist nicht auf den Kontingentseiten des gcloud-Tools oder der GCP Console sichtbar, es sei denn, Compute Engine hat das Kontingent zugeteilt.

Weitere Informationen zu Kontingenten finden Sie auf der Seite "Ressourcenkontingente".

Präemption mit einem Shutdown-Skript verwalten

Wenn eine Instanz präemptiv beendet wird, können Sie ein Shutdown-Skript zur Bereinigung vor dem Beenden der Instanz verwenden. Sie können z. B. einen gerade ausgeführten Prozess ordnungsgemäß beenden und eine Checkpoint-Datei in Google Cloud Storage kopieren.

Im Folgenden wird ein Shutdown-Skript dargestellt, das Sie einer gerade ausgeführten präemptiven Instanz oder einer neuen präemptiven Instanz bei ihrer Erstellung hinzufügen können. Dieses Skript wird ausgeführt, wenn die Instanz mit dem Herunterfahren beginnt, bevor mit dem normalen kill-Befehl des Betriebssystems alle restlichen Prozesse beendet werden. Nachdem das gewünschte Programm ordnungsgemäß beendet wurde, lädt das Skript parallel eine Checkpoint-Datei in ein Google Cloud Storage-Bucket hoch.

#!/bin/bash

MY_PROGRAM="[PROGRAM_NAME]" # For example, "apache2" or "nginx"
MY_USER="[LOCAL_USERNAME]"
CHECKPOINT="/home/$MY_USER/checkpoint.out"
GSUTIL_OPTS="-m -o GSUtil:parallel_composite_upload_threshold=32M"
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 "gsutil $GSUTIL_OPTS cp $CHECKPOINT gs://${BUCKET_NAME}/"

echo "Done uploading, shutting down."

Wenn Sie dieses Skript einer Instanz hinzufügen möchten, konfigurieren Sie es so, dass es mit einer Anwendung in der Instanz funktioniert, und fügen es den Instanzmetadaten hinzu.

  1. Kopieren oder laden Sie das Shutdown-Skript auf die lokale Workstation herunter.
  2. Öffnen Sie die Datei zur Bearbeitung und ändern Sie die folgenden Variablen:
    • [PROGRAM_NAME] ist der Name des Prozesses oder Programms, das Sie herunterfahren möchten. Beispiel: apache2 oder nginx.
    • [LOCAL_USER] ist der Nutzername, mit dem Sie in der virtuellen Maschine angemeldet sind.
    • [BUCKET_NAME] ist der Name des Google Cloud Storage-Buckets, in dem Sie die Checkpoint-Datei des Programms speichern möchten. Der Bucket-Name beginnt in diesem Fall nicht mit gs://.
  3. Speichern Sie die Änderungen.
  4. Fügen Sie das Shutdown-Skript einer neuen Instanz oder einer vorhandenen Instanz hinzu.

Das Skript geht von folgenden Voraussetzungen aus:

  • Die Instanz wurde mindestens mit Lese-/Schreibzugriff auf Google Cloud Storage erstellt. In der Authentifizierungsdokumentation wird im Einzelnen beschrieben, wie eine Instanz mit den geeigneten Bereichen erstellt wird.

  • Es ist ein Google Cloud Storage-Bucket vorhanden, für den Sie über eine Schreibberechtigung verfügen.

Prüfen, ob eine Instanz auf Abruf verfügbar ist

Sie können mit der GCP Console, dem gcloud-Tool oder der API prüfen, ob eine Instanz so konfiguriert wurde, dass sie auf Abruf verfügbar ist.

Console


Anhand der Instanzeigenschaften können Sie prüfen, ob eine Instanz präemptiv ist.

  1. Gehen Sie zur Seite "VM-Instanzen".

    Zur Seite "VM-Instanzen"

  2. Wählen Sie das Projekt aus und klicken Sie auf Weiter.
  3. Klicken Sie auf den Namen der zu prüfenden Instanz. Dadurch wird die Seite mit den Instanzdetails geöffnet.
  4. Der Abrufstatus wird im Abschnitt Verfügbarkeitsrichtlinien der Instanzdetails angegeben.

gcloud


In gcloud compute können Sie mit instances describe Informationen zu einer Instanz abrufen, einschließlich der Angabe, ob die Instanz präemptiv ist.

gcloud compute instances describe [INSTANCE_NAME]

Dabei ist [INSTANCE_NAME] der Name der Instanz.

Die Antwort umfasst den Präemptivitätsstatus im Abschnitt "scheduling".

...
scheduling:
  automaticRestart: false
  onHostMaintenance: TERMINATE
  preemptible: true
...

API


Senden Sie über die API eine GET-Anfrage an den URI der Instanz, um zu prüfen, ob eine Instanz auf Abruf verfügbar ist.

GET https://www.googleapis.com/compute/v1/projects/[PROJECT_ID]/zones/[ZONE]/instances/[INSTANCE_NAME]

Die Antwort enthält den Abrufstatus unter scheduling.

{
    "kind": "compute#instance",
    "id": "4468501694759003918",
    "creationTimestamp": "2015-04-15T15:40:59.004-07:00",
    "zone": "https://www.googleapis.com/compute/v1/projects/[PROJECT_ID]/zones/us-central1-f",
    "status": "RUNNING",
    "name": "example-instance",
    "scheduling":
    {
       "preemptible": true
    },
    ...
 }

Sie können auch innerhalb der Instanz selbst bestimmen, ob eine Instanz präemptiv ist. Dazu prüfen Sie einfach den Metadatenserver auf den Wert scheduling/preemptible in den Standardmetadaten der Instanz.

Verwenden Sie in der Instanz z. B. curl, um den Wert für scheduling/preemptible abzurufen:

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

Wenn dieser Wert TRUE lautet, ist die Instanz präemptiv.

Erkennen, ob eine Instanz vorzeitig beendet wurde

Mit der Google Cloud Platform Console, dem gcloud-Tool oder der API können Sie ermitteln, ob eine Instanz vorzeitig beendet wurde.

Console


In den Systemaktivitätslogs können Sie prüfen, ob eine Instanz vorzeitig beendet wurde.

  1. Gehen Sie zur Seite "Logs".

    Zur Seite "Logs"

  2. Wählen Sie Ihr Projekt aus und klicken Sie auf Weiter.
  3. Fügen Sie compute.instances.preempted dem Feld Nach Label oder Textsuche filtern hinzu.
  4. Sie können auch einen Instanznamen eingeben, wenn Sie Vorgänge zur vorzeitigen Beendigung für eine bestimmte Instanz sehen möchten.
  5. Drücken Sie die Eingabetaste, um die angegebenen Filter anzuwenden. Die GCP Console aktualisiert die Liste der Logs und zeigt nur die Vorgänge an, bei denen eine Instanz vorzeitig beendet wurde.
  6. Wählen Sie einen Vorgang aus der Liste aus, um Details zu der Instanz zu sehen, die vorzeitig beendet wurde.

gcloud


Mit dem Befehl gcloud compute operations list mit einem Filterparameter erhalten Sie eine Liste vorzeitiger Beendigungen in Ihrem Projekt.

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

Mit dem Filterparameter können Sie die Ergebnisse weiter eingrenzen. So können Sie beispielsweise Präemptionsereignisse nur für Instanzen innerhalb einer verwalteten Instanzgruppe anzeigen lassen:

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

gcloud gibt eine Antwort wie die Folgende zurück:

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

Der Vorgangstyp compute.instances.preempted gibt an, dass die Instanz präemptiv beendet wurde. Mit dem Befehl operations describe können Sie weitere Informationen zu einem bestimmten Präemptionsvorgang abrufen.

gcloud compute operations describe \
    systemevent-xxxxxxxx

gcloud gibt eine Antwort wie die Folgende zurück:

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

API


Senden Sie eine GET-Anfrage an den URI der Zonenvorgänge, um eine Liste der letzten Systemvorgänge abzurufen.

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

Die Antwort enthält eine Liste der letzten Vorgänge.

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

Wenn Sie die Antworten so eingrenzen möchten, dass nur Präemptionsvorgänge angezeigt werden, können Sie Ihrer API-Anfrage einen Filter hinzufügen: operationType="compute.instances.preempted". Zum Anzeigen von Präemptionsvorgängen für eine bestimmte Instanz fügen Sie dem Filter einen targetLink-Parameter hinzu: operationType="compute.instances.preempted" AND targetLink="https://www.googleapis.com/compute/v1/projects/[PROJECT_ID]/zones/[ZONE]/instances/[INSTANCE_NAME]".

Sie können auch innerhalb der Instanz selbst bestimmen, ob sie präemptiv beendet wurde. Dies ist nützlich, wenn Sie eine Beendigung aufgrund einer Compute Engine-Präemption anders als eine normale Beendigung in einem Shutdown-Skript behandeln möchten. Dazu prüfen Sie einfach den Metadatenserver auf den Wert preempted in den Standardmetadaten der Instanz.

Verwenden Sie in der Instanz z. B. curl, um den 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 Instanz von Compute Engine präemptiv beendet, ansonsten ist der Wert FALSE.

Wenn Sie dies außerhalb eines Shutdown-Skripts verwenden möchten, können Sie ?wait_for_change=true an die URL anhängen. Dadurch wird eine hängende HTTP-GET-Anfrage ausgeführt, die nur zurückgegeben wird, wenn sich die Metadaten geändert haben und die Instanz vorzeitig beendet wurde.

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

Best Practices

Hier sind einige Best Practices, mit denen Sie präemptive VM-Instanzen optimal nutzen können.

Kleinere Maschinenformen wählen

Ressourcen für präemptive VM-Instanzen stammen aus überschüssiger und Sicherungskapazität der Google Cloud Platform. Es ist oft einfacher, eine größere Menge präemptiver Kapazität mit kleineren Maschinentypen als mit größeren zu erhalten. Die Präemptionsrate kleinerer Maschinentypen mit weniger als 32 Kernen ist bisher auch niedriger als die größerer Maschinentypen.

Sie können auch mehr freie Kapazität erhalten, indem Sie einen benutzerdefinierten Maschinentyp verwenden, der zwischen den vordefinierten Typen liegt. Zum Beispiel gibt es wahrscheinlich mehr Kapazität für einen benutzerdefinierten Maschinentyp mit 48 vCPUs als für den n1-standard-64.

Große präemptive VM-Cluster außerhalb der Spitzenzeiten ausführen

Die Last der Google Cloud Platform-Rechenzentren variiert je nach Zone und Tageszeit, ist aber im Allgemeinen bei Nacht und an Wochenenden am niedrigsten. Somit eignen sich Nächte und Wochenenden am besten zur Ausführung großer präemptiver Cluster.

Anwendungen fehler- und präemptionstolerant gestalten

Man sollte immer darauf vorbereitet sein, dass Änderungen bei den Präemptionsmustern zu unterschiedlichen Zeiten auftreten. Wenn es bei einer Zone z. B. zu einem Teilausfall kommt, muss unter Umständen eine große Anzahl von präemptiven Instanzen beendet werden, um Platz für reguläre Instanzen zu schaffen, die im Rahmen der Wiederherstellung verschoben werden müssen. In diesem kleinen Zeitfenster würde die Präemptionsrate ganz anders als an jedem anderen Tag aussehen. Wenn die Anwendung davon ausgeht, dass Präemptionen immer in kleinen Gruppen erfolgen, sind Sie möglicherweise nicht auf einen derartigen Fall vorbereitet. Sie können das Verhalten der Anwendung bei einem Präemptionsereignis testen, indem Sie die VM-Instanz beenden.

Erstellen von Instanzen wiederholen, die präemptiv beendet wurden

Wenn präemptive Instanzen beendet wurden, werden ein oder zwei Wiederholungsversuche mit präemptiven Instanzen empfohlen, bevor auf reguläre Instanzen zurückgegriffen wird. Je nach Anforderungen könnten reguläre und präemptive Instanzen auch in Clustern kombiniert werden, um eine Fortsetzung der Arbeit mit einer angemessenen Geschwindigkeit sicherzustellen.

Shutdown-Skripts verwenden

Verwalten Sie Shutdown- und Präemptionshinweise mit einem Shutdown-Skript, das den Fortschritt eines Jobs speichern kann. Dann kann der Job nach einer Unterbrechung an jener Stelle wiederaufgenommen werden, an der er unterbrochen wurde, und muss nicht ganz neu erstellt werden.

Weitere Informationen

Hat Ihnen diese Seite weitergeholfen? Teilen Sie uns Ihr Feedback mit:

Feedback geben zu...

Compute Engine-Dokumentation