Exécutez des charges de travail tolérantes aux pannes à moindre coût avec des VM Spot

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 VM Spot 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 VM Spot dans GKE, consultez VM Spot.

Les VM Spot 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 VM Spot.

Limites

  • Les VM Spot 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
  • Pour utiliser Google Cloud CLI pour cette tâche, installez puis initialisez la gcloud CLI. Si vous avez déjà installé la gcloud CLI, obtenez la dernière version en exécutant la commande gcloud components update. Il est possible que les versions antérieures de la gcloud CLI ne permettent pas d'exécuter les commandes de ce document.

Provisionner des VM Spot dans GKE

Vous pouvez provisionner des VM Spot en créant un cluster qui utilise des VM Spot pour le pool de nœuds par défaut. Vous pouvez également créer un pool de nœuds qui utilise des VM Spot.

Utilisez la console Google Cloud ou Google Cloud CLI pour définir les paramètres de l'arrêt progressif des VM Spot. Pour en savoir plus sur la possibilité de définir les paramètres d'arrêt progressif, consultez Arrêt et arrêt progressif des VM Spot.

Créer un cluster avec des VM Spot

Vous pouvez créer un cluster à l'aide de VM Spot avec la Google Cloud CLI ou la console Google Cloud .

Console

Pour créer un cluster avec un pool de nœuds à l'aide de VM Spot, procédez comme suit:

  1. Dans la console Google Cloud , accédez à la page Créer un cluster Kubernetes.

    Accéder à la page "Créer un cluster Kubernetes"

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

  3. Pour Modèle de provisionnement, sélectionnez VM Spot.

  4. Facultatif : pour configurer le délai de grâce avant l'arrêt des pods exécutés sur les nœuds de ce pool de nœuds, sélectionnez une valeur dans le menu déroulant Délai de grâce avant l'arrêt et, le cas échéant, saisissez une valeur dans le champ Délai de grâce avant l'arrêt des pods critiques (secondes). Si elles sont configurées, les valeurs sont stockées dans la configuration du système de nœuds, où vous pourrez les modifier ultérieurement, si nécessaire. Pour en savoir plus, consultez Arrêt et arrêt progressif des VM Spot.

  5. Configurez le cluster selon vos besoins, puis cliquez sur Créer.

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
    [--system-config-from-file=SYSTEM_CONFIG_PATH]

Remplacez CLUSTER_NAME par le nom de votre nouveau cluster.

Si vous souhaitez définir les paramètres d'arrêt progressif pour le pool de nœuds par défaut, remplacez SYSTEM_CONFIG_PATH par le chemin d'accès au fichier contenant votre configuration kubelet. Pour en savoir plus, consultez Arrêt progressif des VM Spot dans GKE. Vous pouvez également mettre à jour ces paramètres après la création du pool de nœuds. Toutefois, GKE doit recréer les nœuds pour appliquer les modifications.

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.

Console

Pour créer un pool de nœuds à l'aide de VM Spot, procédez comme suit:

  1. Accédez à la page Google Kubernetes Engine dans la console Google Cloud .

    Accéder à Google Kubernetes Engine

  2. Dans la liste des clusters, cliquez sur le nom du cluster que vous souhaitez modifier.

  3. Cliquez sur l'onglet Nœuds.

  4. Cliquez sur Créer un pool de nœuds géré par l'utilisateur.

  5. Dans le menu de navigation, cliquez sur Nœuds.

  6. Pour Modèle de provisionnement, sélectionnez VM Spot.

  7. Facultatif : Pour configurer la période d'arrêt progressif des pods s'exécutant sur les nœuds de ce pool de nœuds, sélectionnez une valeur dans le menu déroulant Période d'arrêt progressif et, le cas échéant, saisissez une valeur dans le champ Période d'arrêt progressif des pods critiques (en secondes). Si elles sont configurées, les valeurs sont stockées dans la configuration du système de nœuds, où vous pourrez les modifier ultérieurement, si nécessaire. Pour en savoir plus, consultez Arrêt et arrêt progressif des VM Spot.

  8. Configurez le pool de nœuds selon vos besoins, puis cliquez sur Créer un pool de nœuds.

gcloud

Créez un pool de nœuds à l'aide de VM Spot :

gcloud container node-pools create POOL_NAME \
    --cluster=CLUSTER_NAME \
    --spot
    [--system-config-from-file=SYSTEM_CONFIG_PATH]

Remplacez les éléments suivants :

  • POOL_NAME : nom du nouveau pool de nœuds.
  • CLUSTER_NAME : nom du cluster

Si vous souhaitez définir les paramètres d'arrêt progressif, remplacez SYSTEM_CONFIG_PATH par le chemin d'accès au fichier contenant votre configuration kubelet. Pour en savoir plus, consultez Arrêt progressif des VM Spot dans GKE. Vous pouvez également mettre à jour ces paramètres après la création du pool de nœuds. Toutefois, GKE doit recréer les nœuds pour appliquer les modifications.

Planifier des charges de travail sur des VM Spot

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 VM Spot. Vous déployez ensuite une application nginx sans état sur les VM Spot, en utilisant un nodeSelector pour contrôler l'emplacement des pods par GKE.

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

  2. Obtenez les identifiants du cluster :

    gcloud container clusters get-credentials CLUSTER_NAME
    
  3. Créez un pool de nœuds à l'aide de VM Spot :

    gcloud container node-pools create POOL_NAME \
       --cluster=CLUSTER_NAME \
        --num-nodes=1 \
        --spot
    

    Remplacez les éléments suivants :

    • POOL_NAME : nom du nouveau pool de nœuds.
    • CLUSTER_NAME : nom du cluster
  4. 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 VM Spot.

  5. Appliquez le fichier manifeste à votre cluster :

    kubectl apply -f pi-app.yaml
    
  6. 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 VM Spot

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.

  1. 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 \
        --cluster=CLUSTER_NAME \
        --node-taints=cloud.google.com/gke-spot="true":NoSchedule \
        --spot
    
  2. 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 planifie que les pods avec cette tolérance sur les VM Spot avec le rejet de nœud ajouté.

Étapes suivantes