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

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:

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

    Accéder à Google Kubernetes Engine

  2. Cliquez sur Créer.

  3. Dans la boîte de dialogue Créer un cluster, en regard de GKE Standard, cliquez sur Configurer.

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

  5. Cochez la case Activer les Spot VM.

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

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

    Accéder à Google Kubernetes Engine

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

  3. Cliquez sur Ajouter un pool de nœuds.

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

  5. Cochez la case Activer les Spot VM.

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

  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 \
        --num-nodes=1 \
        --spot
    

    Remplacez POOL_NAME par le nom de votre nouveau pool de nœuds.

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

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

  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 \
        --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 programme les pods avec cette tolérance que sur les VM Spot avec le rejet de nœud ajouté.

Étapes suivantes