Cette page explique comment exécuter des charges de travail tolérantes aux pannes, sans état ou par lot à moindre coût en utilisant des Spot VM sur vos clusters et vos pools de nœuds Google Kubernetes Engine (GKE).
Présentation
Les VM spot sont des machines virtuelles (VM) Compute Engine dont le prix est inférieur à celui des VM standards par défaut et qui n'offrent aucune garantie de disponibilité. Les VM spot offrent les mêmes types de machines et les mêmes options que les VM Compute Engine standards. Compute Engine peut récupérer des Spot VM à tout moment en raison d'événements système, tels que la nécessité de disposer de ressources pour les VM standards.
Pour en savoir plus sur les Spot VM dans GKE, consultez la page Spot VM.
Les Spot VM remplacent les VM préemptives pour exécuter des charges de travail sans état, par lots ou tolérantes aux pannes. Contrairement aux VM préemptives qui expirent au bout de 24 heures, les Spot VM n'ont pas de délai d'expiration. Les Spot VM sont arrêtées lorsque Compute Engine a besoin des ressources pour exécuter des VM standards.
Les VM Spot sont également compatibles avec les clusters GKE Autopilot via les pods spot. Avec les pods Spot, Autopilot planifie et gère automatiquement les charges de travail sur les Spot VM.
Limites
- La fonctionnalité d'arrêt des nœuds kubelet n'est activée que sur les clusters exécutant GKE version 1.20 et ultérieure. Pour les versions de GKE antérieures à 1.20, vous pouvez utiliser le gestionnaire d'événements d'arrêt de nœuds Kubernetes sur GCP pour arrêter vos pods de manière optimale lorsque les VM Spot sont préemptées.
- Les Spot VM ne sont pas compatibles avec les pools de nœuds Windows Server.
Avant de commencer
Avant de commencer, effectuez les tâches suivantes :
- Activez l'API Google Kubernetes Engine. Activer l'API Google Kubernetes Engine
- Si vous souhaitez utiliser Google Cloud CLI pour cette tâche, installez puis initialisez gcloud CLI. Si vous avez déjà installé gcloud CLI, assurez-vous de disposer de la dernière version en exécutant la commande
gcloud components update
.
Créer un cluster avec des VM Spot
Vous pouvez créer un cluster à l'aide de VM Spot avec Google Cloud CLI ou la console Google Cloud.
gcloud
Créez un cluster qui utilise des VM Spot dans le pool de nœuds par défaut au lieu de VM standards:
gcloud container clusters create CLUSTER_NAME \
--spot
Remplacez CLUSTER_NAME
par le nom de votre nouveau cluster.
Console
Pour créer un cluster avec un pool de nœuds à l'aide de VM Spot, procédez comme suit:
Accédez à la page Google Kubernetes Engine dans Google Cloud Console.
Cliquez sur add_box Créer.
Dans la boîte de dialogue Créer un cluster, en regard de GKE Standard, cliquez sur Configurer.
Dans le menu de navigation, dans la section Pools de nœuds, cliquez sur le nom du pool de nœuds que vous souhaitez configurer, puis sur Nœuds.
Cochez la case Activer les Spot VM.
Configurez le cluster selon vos besoins, puis cliquez sur Créer.
Créer un pool de nœuds avec des VM Spot
Vous pouvez créer des pools de nœuds à l'aide de VM Spot avec gcloud CLI ou la console Google Cloud. Vous ne pouvez activer des VM Spot que sur les nouveaux pools de nœuds. Vous ne pouvez pas activer ni désactiver des VM Spot sur des pools de nœuds existants.
gcloud
Créez un pool de nœuds à l'aide de VM Spot :
gcloud container node-pools create POOL_NAME \
--cluster=CLUSTER_NAME \
--spot
Remplacez POOL_NAME
par le nom de votre nouveau pool de nœuds.
Console
Pour créer un pool de nœuds à l'aide de VM Spot, procédez comme suit:
Accédez à la page Google Kubernetes Engine dans Google Cloud Console.
Dans la liste des clusters, cliquez sur le nom du cluster que vous souhaitez modifier.
Cliquez sur
Ajouter un pool de nœuds.Dans le menu de navigation, cliquez sur Nœuds.
Cochez la case Activer les Spot VM.
Configurez le pool de nœuds selon vos besoins, puis cliquez sur Créer.
Planifier des charges de travail sur des Spot VM
GKE ajoute les libellés cloud.google.com/gke-spot=true
et cloud.google.com/gke-provisioning=spot
(pour les nœuds exécutant la version 1.25.5-gke.2500 de GKE ou une version ultérieure) aux nœuds qui utilisent des VM Spot. Vous pouvez filtrer ce libellé dans la spécification de pod à l'aide du champ nodeSelector
de la spécification de pod ou de l'affinité de nœud.
Dans l'exemple suivant, vous créez un cluster avec deux pools de nœuds, dont l'un utilise des Spot VM. Vous déployez ensuite une application nginx
sans état sur les Spot VM, en utilisant un nodeSelector
pour contrôler l'emplacement des pods par GKE.
Créez un cluster avec le pool de nœuds par défaut à l'aide de VM standards :
gcloud container clusters create CLUSTER_NAME
Remplacez
CLUSTER_NAME
par le nom de votre nouveau cluster.Obtenez les identifiants du cluster :
gcloud container clusters get-credentials CLUSTER_NAME
Créez un pool de nœuds à l'aide de VM Spot :
gcloud container node-pools create POOL_NAME \ --num-nodes=1 \ --spot
Remplacez
POOL_NAME
par le nom de votre nouveau pool de nœuds.Enregistrez le fichier de manifeste suivant dans un fichier nommé
pi-app.yaml
:apiVersion: batch/v1 kind: Job metadata: name: pi spec: template: metadata: labels: app: pi spec: nodeSelector: cloud.google.com/gke-spot: "true" terminationGracePeriodSeconds: 25 containers: - name: pi image: perl:5.34.0 command: ["perl", "-Mbignum=bpi", "-wle", "print bpi(2000)"] restartPolicy: Never backoffLimit: 4
Dans ce fichier manifeste, le champ
nodeSelector
indique à GKE de ne planifier des pods que sur les nœuds qui utilisent des Spot VM.Appliquez le fichier manifeste à votre cluster :
kubectl apply -f pi-app.yaml
Décrivez le pod :
kubectl describe pod pi
Le résultat ressemble à ce qui suit :
Name: pi-kjbr9 Namespace: default Priority: 0 Node: gke-cluster-2-spot-pool-fb434072-44ct ... Labels: app=pi job-name=pi Status: Succeeded ... Controlled By: Job/pi Containers: ... Conditions: Type Status Initialized True Ready False ContainersReady False PodScheduled True Volumes: ... Node-Selectors: cloud.google.com/gke-spot=true Tolerations: node.kubernetes.io/not-ready:NoExecute op=Exists for 300s node.kubernetes.io/unreachable:NoExecute op=Exists for 300s Events: Type Reason Age From Message ---- ------ ---- ---- ------- Normal Scheduled 4m3s default-scheduler Successfully assigned default/pi-kjbr9 to gke-cluster-2-spot-pool-fb434072-44ct Normal Pulling 4m2s kubelet Pulling image "perl:5.34.0" Normal Pulled 3m43s kubelet Successfully pulled image "perl:5.34.0" in 18.481761978s Normal Created 3m43s kubelet Created container pi Normal Started 3m43s kubelet Started container pi
Le champ
Node
indique que GKE ne programme vos pods que sur les nœuds qui utilisent des VM Spot.
Utiliser des rejets et des tolérances pour les Spot VM
Il est recommandé de créer des clusters avec au moins un pool de nœuds sans VM Spot, sur lequel vous pouvez placer des charges de travail système telles que DNS. Vous pouvez utiliser des rejets de nœuds et les tolérances correspondantes pour indiquer à GKE d'éviter de placer certaines charges de travail sur des VM Spot.
Pour créer un pool de nœuds avec des nœuds qui utilisent des VM Spot et qui ont des rejets de nœuds, utilisez l'option
--node-taints
lors de la création du pool de nœuds:gcloud container node-pools create POOL_NAME \ --node-taints=cloud.google.com/gke-spot="true":NoSchedule --spot
Pour ajouter la tolérance correspondante aux pods que vous souhaitez planifier sur des VM Spot, modifiez vos déploiements et ajoutez les éléments suivants à votre spécification de pod:
tolerations: - key: cloud.google.com/gke-spot operator: Equal value: "true" effect: NoSchedule
GKE ne programme que les pods avec cette tolérance sur les VM Spot avec le rejet de nœud ajouté.
Étapes suivantes
- Découvrez comment exécuter une application GKE sur des VM Spot avec des nœuds à la demande en tant que remplacement.
- Apprenez-en plus sur les Spot VM dans GKE.
- Suivez un tutoriel sur le déploiement d'une charge de travail par lot à l'aide de Spot VM dans GKE.