Cette page explique comment créer et utiliser une instance de machine virtuelle préemptive. Les VM préemptives sont proposées avec une remise de 60 à 91 % par rapport au prix des VM standards. Cependant, Compute Engine peut arrêter (préempter) ces VM s'il a besoin de récupérer ces ressources pour d'autres tâches. Les VM préemptives s'arrêtent toujours au bout de 24 heures. Les VM préemptives ne sont recommandées que pour les applications tolérantes aux pannes et capables de résister à la préemption de VM. Assurez-vous que votre application peut gérer les préemptions avant de décider de créer une VM préemptive. Pour comprendre les risques et les atouts des VM préemptives, consultez la documentation sur les instances de VM préemptives.
Avant de commencer
- Consultez la documentation sur les instances de VM préemptives.
-
Si ce n'est pas déjà fait, configurez l'authentification.
L'authentification est le processus permettant de valider votre identité pour accéder aux services et aux API Google Cloud.
Pour exécuter du code ou des exemples depuis un environnement de développement local, vous pouvez vous authentifier auprès de Compute Engine comme suit :
Sélectionnez l'onglet correspondant à la façon dont vous prévoyez d'utiliser les exemples de cette page :
Console
Lorsque vous utilisez la console Google Cloud pour accéder aux services et aux API Google Cloud, vous n'avez pas besoin de configurer l'authentification.
gcloud
-
Install the Google Cloud CLI, then initialize it by running the following command:
gcloud init
- Définissez une région et une zone par défaut.
Go
Pour utiliser les exemples Go de cette page dans un environnement de développement local, installez et initialisez gcloud CLI, puis configurez le service Identifiants par défaut de l'application à l'aide de vos identifiants utilisateur.
- Install the Google Cloud CLI.
-
To initialize the gcloud CLI, run the following command:
gcloud init
-
Create local authentication credentials for your user account:
gcloud auth application-default login
Pour en savoir plus, consultez les sections sur Configurer l'authentification pour un environnement de développement local.
Java
Pour utiliser les exemples Java de cette page dans un environnement de développement local, installez et initialisez gcloud CLI, puis configurez le service Identifiants par défaut de l'application à l'aide de vos identifiants utilisateur.
- Install the Google Cloud CLI.
-
To initialize the gcloud CLI, run the following command:
gcloud init
-
Create local authentication credentials for your user account:
gcloud auth application-default login
Pour en savoir plus, consultez les sections sur Configurer l'authentification pour un environnement de développement local.
Node.js
Pour utiliser les exemples Node.js de cette page dans un environnement de développement local, installez et initialisez gcloud CLI, puis configurez le service Identifiants par défaut de l'application à l'aide de vos identifiants utilisateur.
- Install the Google Cloud CLI.
-
To initialize the gcloud CLI, run the following command:
gcloud init
-
Create local authentication credentials for your user account:
gcloud auth application-default login
Pour en savoir plus, consultez les sections sur Configurer l'authentification pour un environnement de développement local.
Python
Pour utiliser les exemples Python de cette page dans un environnement de développement local, installez et initialisez gcloud CLI, puis configurez le service Identifiants par défaut de l'application à l'aide de vos identifiants utilisateur.
- Install the Google Cloud CLI.
-
To initialize the gcloud CLI, run the following command:
gcloud init
-
Create local authentication credentials for your user account:
gcloud auth application-default login
Pour en savoir plus, consultez les sections sur Configurer l'authentification pour un environnement de développement local.
REST
Pour utiliser les exemples d'API REST de cette page dans un environnement de développement local, vous devez utiliser les identifiants que vous fournissez à gcloud CLI.
Install the Google Cloud CLI, then initialize it by running the following command:
gcloud init
-
Créer une VM préemptive
Créez une VM préemptive à l'aide de gcloud CLI ou de l'API Compute Engine. Pour utiliser la console Google Cloud, créez plutôt une VM Spot.
gcloud
Avec gcloud compute
, exécutez la commande instances create
que vous utiliseriez pour créer une instance normale et ajoutez l'option --preemptible
.
gcloud compute instances create [VM_NAME] --preemptible
où [VM_NAME]
est le nom de la VM.
Go
Java
Node.js
Python
REST
Dans l'API, créez une requête normale de création de VM et incluez la propriété preemptible
sous scheduling
et définissez-la sur true
. Exemple :
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
},
...
}
Quotas de processeurs préemptifs
Les VM préemptives nécessitent des quotas de processeurs disponibles, comme les VM standards. Pour éviter que les VM préemptives ne consomment les quotas de processeurs des VM 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 VM préemptives sont prises en compte dans ce quota. Toutes les VM standards continuent d'être comptabilisées dans le quota de processeurs standards.
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 gcloud CLI ou de la console Google Cloud, sauf s'il a été accordé par Compute Engine.
Pour plus d'informations sur les quotas, consultez la page Quotas de ressources.
Démarrer une VM préemptée
Comme pour toute autre VM, si une VM préemptive est arrêtée ou préemptée, vous pouvez redémarrer la VM et la faire revenir à l'état RUNNING
. Le démarrage d'une VM préemptive réinitialise le délai de 24 heures, mais comme il s'agit d'une VM préemptive, Compute Engine peut la préempter avant 24 heures. Il n'est pas possible de convertir une VM préemptive en VM standard pendant son exécution.
Si Compute Engine arrête une VM préemptive dans un groupe d'instances géré soumis à l'autoscaling ou dans un cluster Google Kubernetes Engine (GKE), le groupe redémarre la VM lorsque les ressources sont à nouveau disponibles.
Gérer la préemption avec un script d'arrêt
Lorsque la VM 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 arrêter normalement un processus en cours et copier un fichier de point de contrôle dans Cloud Storage.
Vous trouverez ci-après un script d'arrêt que vous pouvez ajouter à une VM préemptive en cours d'exécution ou que vous créez. Ce script s'exécute lorsque la VM 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 VM, configurez-le pour qu'il fonctionne avec une application dans la VM et ajoutez-le aux métadonnées de la VM.
- Copiez ou téléchargez le script d'arrêt sur votre poste de travail local.
- 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
ounginx
.[LOCAL_USER]
est le nom d'utilisateur sous lequel vous êtes connecté à la machine virtuelle.[BUCKET_NAME]
correspond au nom du bucket 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 pargs://
.
- Enregistrez les modifications.
- Ajoutez le script d'arrêt à une nouvelle VM ou à une VM existante.
Ce script suppose que les conditions suivantes sont remplies :
La VM a été créée avec au moins un accès en lecture/écriture à Cloud Storage. Consultez la documentation sur l'authentification pour savoir comment créer une VM avec les champs d'application appropriés.
Vous disposez d'un bucket Cloud Storage et de l'autorisation d'y écrire.
Identifier les VM préemptives
Pour vérifier si une VM est une VM préemptive, suivez les étapes pour identifier le modèle de provisionnement et l'action d'arrêt d'une VM.
Déterminer si une VM a été préemptée
Déterminez si une VM a été préemptée à l'aide de la console Google Cloud, de gcloud CLI ou de l'API.
Console
Pour vérifier si une VM a été préemptée, consultez les journaux d'activité du système.
Dans Google Cloud Console, accédez à la page Journaux.
Sélectionnez le projet et cliquez sur Continuer.
Ajoutez
compute.instances.preempted
au champ filtre par libellé ou recherche textuelle.Vous pouvez également saisir un nom de VM pour consulter les opérations de préemption d'une VM spécifique.
Appuyez sur Entrée pour appliquer les filtres spécifiés. La console Google Cloud met à jour la liste des journaux pour n'afficher que les opérations au cours desquelles une VM a été préemptée.
Sélectionnez une opération dans la liste pour voir les détails de la VM qui a été préemptée.
gcloud
Utilisez la commande gcloud compute operations list
avec le paramètre filtre pour obtenir la liste des événements de préemption dans 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 VM 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_VM_NAME]"
gcloud
renvoie une réponse semblable à ce qui suit :
NAME TYPE TARGET HTTP_STATUS STATUS TIMESTAMP systemevent-xxxxxxxx compute.instances.preempted us-central1-f/instances/example-vm-xxx 200 DONE 2015-04-02T12:12:10.881-07:00
Un type d'opération compute.instances.preempted
indique que la VM 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 à ce qui suit :
... 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. ...
REST
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://compute.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-vm", "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 API : operationType="compute.instances.preempted"
. Pour consulter les opérations de préemption pour une VM 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/[VM_NAME]"
.
Vous pouvez également déterminer si une VM a été préemptée depuis la VM 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 de votre VM.
Par exemple, utilisez curl
depuis votre VM 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
, la VM 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 opération génère une requête HTTP GET suspendue qui ne renvoie les résultats que si les métadonnées ont été modifiées et que la VM a été préemptée.
curl "http://metadata.google.internal/computeMetadata/v1/instance/preempted?wait_for_change=true" -H "Metadata-Flavor: Google"
TRUE
Tester les paramètres de préemption
Vous pouvez simuler des événements de maintenance sur vos VM pour forcer la préemption. Utilisez cette fonctionnalité pour tester la manière dont vos applications gèrent les VM préemptives. Consultez la section Tester vos règles de disponibilité pour savoir comment tester les événements de maintenance sur vos VM.
Vous pouvez également simuler la préemption d'une VM en arrêtant la VM plutôt qu'en simulant un événement de maintenance. Cela évite d'atteindre les limites du quota.
Bonnes pratiques
Voici quelques bonnes pratiques pour vous aider à tirer le meilleur parti des instances de machine virtuelle préemptives.
Utiliser l'API d'instances groupées
Plutôt que de créer des VM uniques, vous pouvez utiliser l'API d'instances groupées.
Choisir des configurations de machine plus petites
Les ressources des VM préemptives proviennent de la capacité excédentaire et de sauvegarde de Google Cloud. La capacité est souvent plus facile à obtenir pour des types de machines plus petits, c'est-à-dire qui disposent de moins de ressources, comme les vCPU et la mémoire. Vous pouvez augmenter la capacité des VM préemptives en sélectionnant un type de machine personnalisé plus petit, mais la probabilité d'obtention de capacité est encore plus élevée en optant pour des types de machines prédéfinis plus petits. Par exemple, par rapport à la capacité du type de machine prédéfini n2-standard-32
, la capacité du type de machine personnalisé n2-custom-24-96
présente certes une bonne probabilité, mais celle associée à la capacité du type de machine prédéfini n2-standard-16
est encore plus élevée.
Exécuter des clusters de machines virtuelles préemptives pendant les heures creuses
La charge sur les centres de données Google Cloud 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 produisent dans les schémas de préemption à différents moments. Par exemple, en cas de panne partielle d'une zone, un grand nombre de VM préemptives peuvent être préemptées pour libérer de l'espace pour les VM 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 VM préemptées
Si votre instance de VM a été préemptée, essayez de créer une ou deux fois les VM préemptives avant de revenir aux VM standards. Selon vos besoins, il peut être judicieux de combiner des VM 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
- Consultez la documentation sur les instances de VM préemptives.
- Consultez la page relative aux scripts d'arrêt.
- Connectez-vous à votre VM.