Ejecutar cargas de trabajo tolerantes a fallos a un coste inferior con máquinas virtuales de Spot

En esta página se explica cómo ejecutar cargas de trabajo tolerantes a fallos, sin estado o por lotes a un coste más bajo mediante el uso de Spot VMs en tus clústeres y grupos de nodos de Google Kubernetes Engine (GKE).

Información general

Las máquinas virtuales de acceso puntual son máquinas virtuales de Compute Engine que tienen un precio más bajo que las máquinas virtuales estándar predeterminadas y no ofrecen ninguna garantía de disponibilidad. Las VMs de acceso puntual ofrecen los mismos tipos de máquinas y opciones que las VMs estándar de Compute Engine. Compute Engine puede reclamar las máquinas virtuales de acceso puntual en cualquier momento debido a eventos del sistema, como cuando se necesitan los recursos para las máquinas virtuales estándar.

Para obtener más información sobre las VMs de acceso puntual en GKE, consulta VMs de acceso puntual.

Las máquinas virtuales de acceso puntual sustituyen la necesidad de usar máquinas virtuales interrumpibles para ejecutar cargas de trabajo sin estado, por lotes o tolerantes a fallos. A diferencia de las VMs interrumpibles, que caducan al cabo de 24 horas, las VMs de acceso puntual no tienen fecha de vencimiento. Las Spot VMs se cancelan cuando Compute Engine necesita los recursos para ejecutar VMs estándar.

Las VMs de Spot también se admiten en los clústeres de Autopilot de GKE a través de los pods de Spot. Con los pods de Spot, Autopilot programa y gestiona automáticamente las cargas de trabajo en las VMs de Spot.

Limitaciones

Antes de empezar

Antes de empezar, asegúrate de que has realizado las siguientes tareas:

  • Habilita la API de Google Kubernetes Engine.
  • Habilitar la API de Google Kubernetes Engine
  • Si quieres usar Google Cloud CLI para esta tarea, instálala y, a continuación, inicialízala. Si ya has instalado la gcloud CLI, obtén la versión más reciente ejecutando gcloud components update.

Crear un clúster con VMs de Spot

Puedes crear un clúster con Spot VMs mediante la CLI de Google Cloud o la Google Cloud consola.

gcloud

Crea un clúster que use máquinas virtuales Spot en el grupo de nodos predeterminado en lugar de máquinas virtuales estándar:

gcloud container clusters create CLUSTER_NAME \
    --spot

Sustituye CLUSTER_NAME por el nombre de tu nuevo clúster.

Consola

Para crear un clúster con un grupo de nodos que use Spot VMs, sigue estos pasos:

  1. En la Google Cloud consola, ve a la página Crear un clúster de Kubernetes.

    Ir a Crear un clúster de Kubernetes

  2. En el menú de navegación, en la sección Grupos de nodos, haz clic en el nombre del grupo que quieras configurar y, a continuación, en Nodos.

  3. Marca la casilla Habilitar VMs de spot.

  4. Configura el clúster según sea necesario y, a continuación, haz clic en Crear.

Crear un grupo de nodos con máquinas virtuales de Spot

Puedes crear grupos de nodos con Spot VMs mediante la CLI de gcloud o la Google Cloud consola. Solo puedes habilitar VMs de aprovisionamiento esporádico en grupos de nodos nuevos. No puedes habilitar ni inhabilitar las VMs de Spot en los grupos de nodos que ya tengas.

gcloud

Crea un grupo de nodos con máquinas virtuales de Spot:

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

Sustituye POOL_NAME por el nombre del nuevo grupo de nodos.

Consola

Para crear un grupo de nodos con máquinas virtuales Spot, sigue estos pasos:

  1. Ve a la página Google Kubernetes Engine en la Google Cloud consola.

    Ir a Google Kubernetes Engine

  2. En la lista de clústeres, haga clic en el nombre del clúster que quiera modificar.

  3. Haz clic en Añadir grupo de nodos.

  4. En el menú de navegación, haga clic en Nodos.

  5. Marca la casilla Habilitar VMs de spot.

  6. Configura el grupo de nodos según sea necesario y, a continuación, haz clic en Crear.

Programar cargas de trabajo en Spot VMs

GKE añade las cloud.google.com/gke-spot=true y cloud.google.com/gke-provisioning=spot (para los nodos que ejecutan la versión 1.25.5-gke.2500 de GKE o una posterior) etiquetas a los nodos que usan VMs Spot. Puedes filtrar por esta etiqueta en las especificaciones de tu pod con el campo nodeSelector de las especificaciones del pod o con afinidad de nodo.

En el siguiente ejemplo, se crea un clúster con dos grupos de nodos, uno de los cuales usa Spot VMs. A continuación, despliega una aplicación nginx sin reconocimiento del estado en las VMs de instancia de prepago mediante un nodeSelector para controlar dónde coloca GKE los pods.

  1. Crea un clúster con el grupo de nodos predeterminado mediante VMs estándar:

    gcloud container clusters create CLUSTER_NAME
    

    Sustituye CLUSTER_NAME por el nombre de tu nuevo clúster.

  2. Obtén las credenciales del clúster:

    gcloud container clusters get-credentials CLUSTER_NAME
    
  3. Crea un grupo de nodos con Spot VMs:

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

    Sustituye POOL_NAME por el nombre del nuevo grupo de nodos.

  4. Guarda el siguiente manifiesto como un archivo llamado 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
    

    En este manifiesto, el campo nodeSelector indica a GKE que solo programe pods en nodos que usen máquinas virtuales de Spot.

  5. Aplica el manifiesto a tu clúster:

    kubectl apply -f pi-app.yaml
    
  6. Describe el Pod:

    kubectl describe pod pi
    

    El resultado debería ser similar al siguiente:

    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
    

    El campo Node muestra que GKE solo programa tus pods en nodos que usan máquinas virtuales Spot.

Usar tolerancias e intolerancias en máquinas virtuales de acceso puntual

Te recomendamos que crees clústeres con al menos un grupo de nodos sin VMs de aprovisionamiento esporádico en el que puedas colocar cargas de trabajo del sistema, como DNS. Puedes usar taints de nodos y las tolerancias correspondientes para indicar a GKE que evite colocar determinadas cargas de trabajo en máquinas virtuales de acceso puntual.

  1. Para crear un grupo de nodos con nodos que usen máquinas virtuales de Spot y que tengan taints de nodos, usa la marca --node-taints al crear el grupo de nodos:

    gcloud container node-pools create POOL_NAME \
        --node-taints=cloud.google.com/gke-spot="true":NoSchedule
        --spot
    
  2. Para añadir la tolerancia correspondiente a los pods que quieras programar en VMs de Spot, modifica tus implementaciones y añade lo siguiente a la especificación de tu pod:

    tolerations:
    - key: cloud.google.com/gke-spot
      operator: Equal
      value: "true"
      effect: NoSchedule
    

    GKE solo programa los pods con esta tolerancia en las VMs Spot con el taint de nodo añadido.

Siguientes pasos