Créer et démarrer une instance de VM préemptive

Cette page explique comment créer et utiliser une instance de machine virtuelle préemptive. Une instance préemptive est une instance que vous pouvez créer et exécuter à un prix bien inférieur à celui des instances normales. Cependant, Compute Engine peut interrompre (préempter) ces instances s'il a besoin d'accéder à ces ressources pour d'autres tâches. Les instances préemptives se terminent toujours au bout de 24 heures. Pour en savoir plus, consultez la documentation relative aux instances préemptives.

Les instances préemptives ne sont recommandées que pour les applications tolérantes aux pannes et capables de résister aux préemptions d'instance. Assurez-vous que votre application peut gérer les préemptions avant de décider de créer une instance préemptive. Pour comprendre les risques et les atouts des instances préemptives, lisez la documentation relative aux instances préemptives.

Avant de commencer

Créer une instance préemptive

Créez une instance préemptive à l'aide de la console Google Cloud Platform, de l'outil gcloud ou de l'API.

Console

Créer une instance préemptive revient à créer une instance normale, mais en activant la propriété preemptible.

  1. Dans la console GCP, accédez à la page "Instances de VM".

    Accéder à la page Instances de VM

  2. Cliquez sur Créer une instance.
  3. Sur la page Créer une instance, spécifiez les propriétés souhaitées pour votre instance.
  4. Cliquez sur Gestion, sécurité, disques, réseau et location unique.
  5. Sous Règles de disponibilité, définissez l'option Préemption sur Activé. Ce paramètre désactive le redémarrage automatique de l'instance et définit l'action de maintenance de l'hôte sur Arrêter.
  6. Cliquez sur Créer pour créer l'instance.

gcloud

Avec gcloud compute, utilisez la même commande instances create que pour créer une instance normale, mais ajoutez l'indicateur --preemptible.

gcloud compute instances create [INSTANCE_NAME] --preemptible

[INSTANCE_NAME] est le nom de l'instance.

API

Dans l'API, créez une requête normale de création d'instance, mais incluez la propriété preemptible sous scheduling et définissez-la sur true. Exemple :

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
  },
  ...
}

Quotas de processeurs préemptifs

Les instances préemptives nécessitent des quotas de processeurs disponibles, comme les instances standards. Pour éviter que les instances préemptives ne consomment les quotas de processeurs des instances standards, vous pouvez demander un quota spécial de "processeurs préemptifs". Lorsque Compute Engine vous accorde un quota de processeurs préemptifs dans la région, toutes les instances préemptives sont prises en compte dans ce quota. Toutes les instances standards continuent d'être comptabilisées dans le quota de processeurs normaux.

Dans les régions où vous ne disposez pas de quota de processeurs préemptifs, vous pouvez utiliser un quota de processeurs standards pour lancer les instances préemptives. Comme à l’accoutumée, vous avez également besoin d'un quota suffisant d'adresses IP et d'espace disque. Le quota de processeurs préemptifs n'est pas visible sur les pages de quota de l'outil gcloud ou de la console GCP, sauf s'il a été accordé par Compute Engine.

Pour plus d'informations sur les quotas, consultez la page Quotas de ressources.

Gestion de la préemption avec un script d'arrêt

Lorsque l'instance est préemptée, vous pouvez utiliser un script d'arrêt pour effectuer des actions de nettoyage avant son arrêt. Par exemple, vous pouvez terminer de manière optimale un processus en cours et copier un fichier de point de contrôle dans Google Cloud Storage.

Vous trouverez ci-après un script d'arrêt que vous pouvez ajouter à une instance préemptive en cours d'exécution ou que vous créez. Ce script s'exécute lorsque l'instance commence à s'arrêter, avant que la commande kill normale du système d'exploitation ne mette fin à tous les processus restants. Une fois qu'il a arrêté de manière optimale le programme souhaité, le script effectue un téléchargement parallèle d'un fichier de point de contrôle dans un bucket Google Cloud Storage.

#!/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."

Pour ajouter ce script à une instance, configurez-le pour qu'il fonctionne avec une application dans l'instance et ajoutez-le aux métadonnées de l'instance.

  1. Copiez ou téléchargez le script d'arrêt sur votre poste de travail local.
  2. Ouvrez le fichier pour le modifier et changez les variables suivantes :
    • [PROGRAM_NAME] est le nom du processus ou du programme que vous souhaitez arrêter. Par exemple, apache2 ou nginx.
    • [LOCAL_USER] est le nom d'utilisateur sous lequel vous êtes connecté à la machine virtuelle.
    • [BUCKET_NAME] est le nom du bucket Google Cloud Storage dans lequel vous souhaitez enregistrer le fichier de point de contrôle du programme. Notez que dans ce cas, le nom du bucket ne commence pas par gs://.
  3. Enregistrez les modifications.
  4. Ajoutez le script d'arrêt à une nouvelle instance ou à une instance existante.

Ce script suppose que les conditions suivantes sont remplies :

  • L'instance a été créée avec au minimum un accès en lecture-écriture à Google Cloud Storage. Consultez la documentation sur l'authentification pour savoir comment créer une instance avec les champs d'application appropriés.

  • Vous disposez d'un bucket Google Cloud Storage existant et êtes autorisé à y écrire des données.

Vérifier si une instance est préemptive

Pour vérifier si une instance est configurée comme instance préemptive, utilisez la console GCP, l'outil gcloud ou l'API.

Console


Pour vérifier si une instance est préemptive, affichez ses propriétés.

  1. Accédez à la page "Instances de VM".

    Accéder à la page "Instances de VM"

  2. Sélectionnez votre projet et cliquez sur Continuer.
  3. Cliquez sur le nom de l'instance à vérifier. La page "Détails de l'instance" s'ouvre.
  4. Le statut de préemption est spécifié dans la section Règles de disponibilité des détails de l'instance.

gcloud


Dans gcloud compute, utilisez instances describe pour obtenir des informations sur une instance, en particulier pour savoir si elle est préemptive.

gcloud compute instances describe [INSTANCE_NAME]

[INSTANCE_NAME] est le nom de l'instance.

Le statut de préemption est inclus dans les informations de réponse, dans la section scheduling.

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

API


Pour vérifier si une instance est préemptive, utilisez l'API pour envoyer une requête GET à l'URI de l'instance.

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

L'état de préemption est inclus dans les informations de réponse, sous 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
    },
    ...
 }

Vous pouvez également déterminer si une instance est préemptive depuis l’instance elle-même. Il vous suffit de consulter, sur le serveur de métadonnées, la valeur de scheduling/preemptible dans les métadonnées d'instance par défaut associées à l'instance.

Par exemple, utilisez la commande curl depuis l'instance pour obtenir la valeur de scheduling/preemptible :

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

Si cette valeur est TRUE, l'instance est préemptive.

Détecter si une instance a été préemptée

Pour déterminer si une instance a été préemptée, utilisez la console Google Cloud Platform, l'outil gcloud ou l'API.

Console


Pour vérifier si une instance a été préemptée, consultez les journaux d'activité du système.

  1. Accédez à la page "Journaux".

    Accéder à la page Journaux

  2. Sélectionnez le projet et cliquez sur Continuer.
  3. Ajoutez compute.instances.preempted au champ Filtrer par libellé ou texte recherché.
  4. Vous pouvez également saisir un nom d'instance pour consulter les opérations de préemption d'une instance spécifique.
  5. Appuyez sur "Entrée" pour appliquer les filtres spécifiés. La console GCP met à jour la liste des journaux pour n'afficher que les opérations ayant permis de préempter une instance.
  6. Sélectionnez une opération dans la liste pour voir les détails de l'instance préemptée.

gcloud


Exécutez la commande gcloud compute operations list avec un paramètre de filtre pour obtenir la liste des événements de préemption de votre projet.

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

Vous pouvez spécifier le paramètre de filtre pour affiner davantage les résultats. Par exemple, pour n'afficher que les événements de préemption associés aux instances appartenant à un groupe d'instances géré, exécutez la commande suivante :

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

gcloud renvoie une réponse semblable à la suivante :

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

Le type d'opération compute.instances.preempted indique que l'instance a été préemptée. Vous pouvez utiliser la commande operations describe pour obtenir plus d'informations sur une opération de préemption spécifique.

gcloud compute operations describe \
    systemevent-xxxxxxxx

gcloud renvoie une réponse semblable à la suivante :

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


Pour obtenir la liste des opérations système récentes, envoyez une requête GET à l'URI des opérations de la zone.

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

La réponse contient la liste des opérations récentes.

{
  "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.",
  ...
}

Pour n'afficher que les opérations de préemption, vous pouvez ajouter un filtre à votre requête d'API : operationType="compute.instances.preempted". Pour consulter les opérations de préemption d'une instance spécifique, ajoutez un paramètre targetLink au filtre : operationType="compute.instances.preempted" AND targetLink="https://www.googleapis.com/compute/v1/projects/[PROJECT_ID]/zones/[ZONE]/instances/[INSTANCE_NAME]".

Vous pouvez également déterminer si une instance a été préemptée depuis l’instance elle-même. Cette fonction est utile si vous souhaitez gérer un arrêt dû à une préemption Compute Engine différemment d'un arrêt normal, dans un script d'arrêt. Pour ce faire, il vous suffit de consulter, sur le serveur de métadonnées, la valeur de preempted dans les métadonnées d'instance par défaut associées à l'instance.

Par exemple, utilisez la commande curl depuis l'instance pour obtenir la valeur de preempted :

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

Si cette valeur est TRUE, l'instance a été préemptée par Compute Engine. Sinon elle est FALSE.

Pour utiliser cette fonctionnalité en dehors d'un script d'arrêt, vous pouvez ajouter ?wait_for_change = true à l'URL. Cette action exécute une requête HTTP GET suspendue qui ne renvoie les résultats que si les métadonnées ont été modifiées et l'instance préemptée.

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

Bonnes pratiques

Voici quelques bonnes pratiques pour vous aider à tirer le meilleur parti des instances de machine virtuelle préemptives.

Choisir des configurations de machine plus petites

Les ressources des instances de machine virtuelle préemptives proviennent de la capacité excédentaire et de sauvegarde de Google Cloud Platform. Il est souvent plus facile d'obtenir une forte capacité préemptive avec des types de machines plus petits. Les taux de préemption des petits types de machines de moins de 32 noyaux sont également historiquement inférieurs à ceux des grands types de machines.

Vous pouvez également obtenir plus de capacité de secours avec un type de machine personnalisé compris entre les types prédéfinis. Par exemple, la capacité d'un type de machine personnalisé avec 48 processeurs virtuels est probablement supérieure à celle du type de machine n1-standard-64.

Exécuter des clusters de machines virtuelles préemptives pendant les heures creuses

La charge sur les centres de données Google Cloud Platform varie en fonction de l’emplacement et de l’heure de la journée, mais est généralement plus faible la nuit et le week-end. Par conséquent, la nuit et le week-end sont les meilleurs moments pour exécuter de grands clusters de machines virtuelles préemptives.

Concevoir des applications tolérantes aux erreurs et à la préemption

Il est important de prévoir que des changements se produiront dans les schémas de préemption à différents moments. Par exemple, en cas de panne partielle d'une zone, un grand nombre d’instances préemptives peuvent être préemptées pour libérer de l'espace pour les instances standards à déplacer dans le cadre de la reprise. Dans ce petit intervalle de temps, le taux de préemption sera très différent de celui d'un autre jour. Si votre application suppose que les préemptions sont toujours effectuées par petits groupes, vous ne serez peut-être pas préparé à un tel événement. Vous pouvez tester le comportement de votre application face à un événement de préemption en arrêtant l'instance de machine virtuelle.

Réessayer de créer des instances préemptées

En cas de préemption, il est conseillé de réessayer une ou deux fois les instances préemptives avant de revenir aux instances standards. Selon vos besoins, il peut être judicieux de combiner des instances standards et préemptives dans les clusters pour vous assurer que le travail se déroule à la cadence appropriée.

Utiliser des scripts d'arrêt

Gérez les notifications d'arrêt et de préemption à l'aide d'un script d'arrêt qui peut enregistrer la progression d'une tâche et permettre de la reprendre là où elle s'était arrêtée, plutôt que de tout recommencer à zéro.

Étapes suivantes

Cette page vous a-t-elle été utile ? Évaluez-la :

Envoyer des commentaires concernant…

Documentation Compute Engine