VM-Instanzen auf Abruf erstellen und starten

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

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

Vorbereitung

Instanz auf Abruf erstellen

Erstellen Sie über die Google Cloud Console, das gcloud-Tool oder die API eine Instanz auf Abruf.

Console

Eine Instanz auf Abruf wird genau wie eine normale Instanz erstellt, allerdings aktivieren Sie das Attribut preemptible.

  1. Wechseln Sie in der GCP Console zur Seite VM-Instanzen.

    Die Seite VM-Instanzen aufrufen

  2. Klicken Sie auf Instanz erstellen.
  3. Erstellen klicken, um die Instanz zu erstellen.

gcloud

Verwenden Sie bei gcloud compute denselben instances create-Befehl, 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

Richten Sie in der API eine Standardanfrage ein, um eine Instanz zu erstellen. Geben Sie dabei jedoch das Attribut preemptible unter scheduling an und setzen Sie es auf true. Beispiel:

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

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

CPU-Kontingente auf Abruf

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

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

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

Vorzeitiges Beenden mit einem Shutdown-Skript verwalten

Wenn eine Instanz vorzeitig beendet wird, können Sie ein Shutdown-Skript zur Bereinigung vor dem Beenden der Instanz verwenden. Sie können beispielsweise einen laufenden Prozess ordnungsgemäß beenden und eine Prüfpunktdatei in Cloud Storage kopieren.

Im Folgenden wird ein Shutdown-Skript dargestellt, das Sie einer gerade ausgeführten Instanz auf Abruf oder einer neuen Instanz auf Abruf 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."

Um dieses Skript einer Instanz hinzuzufügen, 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:  apache2oder nginx.
    • [LOCAL_USER] ist der Nutzername, mit dem Sie in der virtuellen Maschine angemeldet sind.
    • [BUCKET_NAME] ist der Name des Cloud Storage-Buckets, in dem die Prüfpunktdatei des Programms gespeichert werden soll. 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 Cloud Storage erstellt. Anleitungen zum Erstellen einer Instanz mit den entsprechenden Bereichen finden Sie unter Authentifizierungsdokumentation.

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

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

Mit der Cloud Console, dem gcloud-Tool oder der API können Sie prüfen, ob eine Instanz auf Abruf verfügbar ist.

Console


Anhand der Instanzattribute können Sie prüfen, ob eine Instanz auf Abruf verfügbar ist.

  1. Öffnen Sie die Seite der VM-Instanzen.

    Zur Seite "VM-Instanzen"

  2. Wählen Sie Ihr 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 verwenden Sie instances describe, um Informationen über eine Instanz abzurufen, einschließlich der Frage, ob die Instanz auf Abruf verfügbar ist.

gcloud compute instances describe [INSTANCE_NAME]

Dabei ist [INSTANCE_NAME] der Name der Instanz.

Die Antwort umfasst den Abrufstatus 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://compute.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://compute.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 auf Abruf verfügbar ist. Dazu prüfen Sie einfach den Metadatenserver auf den Wert scheduling/preemptible in den Standardmetadaten der Instanz.

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

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

Die Instanz ist auf Abruf verfügbar, wenn dieser Wert TRUE ist.

Erkennen, ob eine Instanz vorzeitig beendet wurde

Bestimmen Sie mit der Google Cloud Console, dem gcloud-Tool oder der API, 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 zum 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 Cloud Console aktualisiert die Liste der Logs so, dass nur die Vorgänge angezeigt werden, 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


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"

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 in etwa folgende Antwort 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 vorzeitig beendet wurde. Mit dem Befehl operations describe erhalten Sie weitere Informationen zu einem bestimmten Vorgang zur vorzeitigen Beendigung.

gcloud compute operations describe \
    systemevent-xxxxxxxx

gcloud gibt in etwa folgende Antwort zurück:

...
operationType: compute.instances.preempted
progress: 100
selfLink: https://compute.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://compute.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://compute.googleapis.com/compute/v1/projects/[PROJECT_ID]/zones/us-central1-f",
  "operationType": "compute.instances.preempted",
  "targetLink": "https://compute.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 Vorgänge zur vorzeitigen Beendigung angezeigt werden, können Sie Ihrer API-Anfrage einen Filter hinzufügen: operationType="compute.instances.preempted". Zum Anzeigen von Vorgängen zur vorzeitigen Beendigung für eine bestimmte Instanz fügen Sie dem Filter einen targetLink-Parameter hinzu: operationType="compute.instances.preempted" AND targetLink="https://compute.googleapis.com/compute/v1/projects/[PROJECT_ID]/zones/[ZONE]/instances/[INSTANCE_NAME]".

Sie können auch innerhalb der Instanz selbst bestimmen, ob sie vorzeitig beendet wurde. Dies ist nützlich, wenn Sie eine Beendigung aufgrund einer vorzeitigen Compute Engine-Beendigung 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 beispielsweise curl in Ihrer Instanz, 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 vorzeitig 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 VM-Instanzen auf Abruf optimal nutzen können.

Kleinere Maschinenformen wählen

Ressourcen für VM-Instanzen auf Abruf stammen aus überschüssiger Kapazität und Sicherungskapazität von Google Cloud. Es ist oft einfacher, eine größere Menge von Kapazität auf Abruf mit kleineren Maschinentypen als mit größeren zu erhalten. Die vorzeitige Beendigungsrate 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 VM-Cluster auf Abruf außerhalb der Spitzenzeiten ausführen

Die Auslastung der Google Cloud-Rechenzentren variiert je nach Standort und Tageszeit, ist aber im Allgemeinen nachts und am Wochenende am niedrigsten. Somit eignen sich Nächte und Wochenenden am besten zur Ausführung großer Cluster auf Abruf.

Anwendungen tolerant gegenüber Fehlern und vorzeitigem Beenden gestalten

Man sollte immer darauf vorbereitet sein, dass Änderungen bei den vorzeitigen Beendigungsmustern zu unterschiedlichen Zeiten auftreten. Wenn es bei einer Zone z. B. zu einem Teilausfall kommt, muss unter Umständen eine große Anzahl von Instanzen vorzeitig 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 vorzeitige Beendigungsrate ganz anders als an jedem anderen Tag aussehen. Wenn die Anwendung davon ausgeht, dass vorzeitige Beendigungen immer in kleinen Gruppen erfolgen, sind Sie möglicherweise nicht auf einen derartigen Fall vorbereitet. Sie können das Verhalten der Anwendung bei einem vorzeitige Beendigungsereignis testen, indem Sie die VM-Instanz beenden.

Erstellen von Instanzen wiederholen, die vorzeitig beendet wurden

Wenn eine VM-Instanz vorzeitig beendet wurde, versuchen Sie ein oder zweimal, neue Instanzen auf Abruf zu erstellen, bevor Sie auf reguläre Instanzen zurückgreifen. Je nach Anforderungen könnten reguläre und Instanzen auf Abruf auch in Clustern kombiniert werden, um eine Fortsetzung der Arbeit mit einer angemessenen Geschwindigkeit sicherzustellen.

Shutdown-Skripts verwenden

Verwalten Sie Hinweise zu Shutdown und vorzeitiger Beendigung 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