Ejecuta cargas de trabajo tolerantes a errores a costos más bajos con VM Spot


En esta página, se muestra cómo ejecutar cargas de trabajo tolerantes a errores, sin estado o por lotes a menores costos mediante las VM Spot en tus clústeres y grupos de nodos de Google Kubernetes Engine (GKE).

Descripción general

Las VMs Spot son máquinas virtuales (VMs) de Compute Engine que tienen un precio menor que las VMs estándar y no proporcionan garantía de disponibilidad. Las VMs Spot ofrecen las mismas opciones y tipos de máquina que las VMs estándar de Compute Engine. Compute Engine puede reclamar VMs Spot en cualquier momento debido a eventos del sistema, como cuando se necesitan recursos para las VMs estándar.

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

Las VM Spot reemplazan la necesidad de usar VM interrumpibles para ejecutar cargas de trabajo sin estado, por lotes o tolerantes a errores. A diferencia de las VM interrumpibles, que vencen después de 24 horas, las VM Spot no tienen tiempo de vencimiento. Las VM Spot se finalizan cuando Compute Engine requiere los recursos para ejecutar VM estándar.

Las VMs Spot también son compatibles con los clústeres de Autopilot de GKE a través de Pods Spot. Con Pods Spot, Autopilot programa y administra automáticamente las cargas de trabajo en las VM Spot.

Limitaciones

Antes de comenzar

Antes de comenzar, asegúrate de haber realizado las siguientes tareas:

  • Habilita la API de Google Kubernetes Engine.
  • Habilitar la API de Google Kubernetes Engine
  • Si deseas usar Google Cloud CLI para esta tarea, instala y, luego, inicializa gcloud CLI. Si ya instalaste gcloud CLI, ejecuta gcloud components update para obtener la versión más reciente.

Crea un clúster con VMs Spot

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

gcloud

Crea un clúster nuevo que use VMs Spot en el grupo de nodos predeterminado en lugar de VMs estándar:

gcloud container clusters create CLUSTER_NAME \
    --spot

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

Console

Para crear un clúster nuevo con un grupo de nodos mediante las VMs Spot, realiza los siguientes pasos:

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

    Ir a Google Kubernetes Engine

  2. Haz clic en Crear.

  3. En el cuadro de diálogo Crear clúster, junto a GKE Standard, haz clic en Configurar.

  4. En el menú de navegación, en la sección Grupos de nodos, haz clic en el nombre del grupo de nodos que deseas configurar y, luego, en Nodos.

  5. Selecciona la casilla de verificación Habilitar VM Spot.

  6. Configura el clúster según sea necesario y, luego, haz clic en Crear.

Crear un grupo de nodos con VMs Spot

Puedes crear grupos de nodos nuevos mediante las VMs Spot con la CLI de gcloud o la consola de Google Cloud. Solo puedes habilitar las VMs Spot en grupos de nodos nuevos. No puedes habilitar o inhabilitar las VMs Spot en grupos de nodos existentes.

gcloud

Crea un grupo de nodos nuevo con VMs Spot:

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

Reemplaza POOL_NAME por el nombre de tu grupo de nodos nuevo.

Console

Para crear un grupo de nodos nuevo con VMs Spot, ejecuta los siguientes pasos:

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

    Ir a Google Kubernetes Engine

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

  3. Haz clic en Agregar grupo de nodos.

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

  5. Selecciona la casilla de verificación Habilitar VM Spot.

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

Programar cargas de trabajo en VM Spot

GKE agrega las etiquetas cloud.google.com/gke-spot=true y cloud.google.com/gke-provisioning=spot (para nodos que ejecutan la versión 1.25.5-gke.2500 o una posterior de GKE) a los nodos que usan VMs Spot. Puedes filtrar esta etiqueta en las especificaciones de tu Pod a través del campo nodeSelector en tu especificación de Pod o la afinidad de nodos.

En el siguiente ejemplo, puedes crear un clúster con dos grupos de nodos, uno de los cuales usa VM Spot. Luego, implementas una aplicación nginx sin estado en las VM Spot y usa un nodeSelector para controlar dónde GKE coloca los pods.

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

    gcloud container clusters create CLUSTER_NAME
    

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

  2. Obtén credenciales para el clúster:

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

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

    Reemplaza POOL_NAME por el nombre de tu grupo de nodos nuevo.

  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 le indica a GKE que solo programe Pods en nodos que usan VM Spot.

  5. Aplica el manifiesto al clúster:

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

    kubectl describe pod pi
    

    El resultado es similar a este:

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

Usa taints y tolerancias para VM Spot

Como práctica recomendada, crea clústeres con al menos un grupo de nodos sin VMs Spot en la que puedas colocar las cargas de trabajo del sistema como DNS. Puedes usar taints de nodos y las tolerancias correspondientes para indicarle a GKE que evite colocar ciertas cargas de trabajo en las VMs Spot.

  1. Para crear un grupo de nodos que usen VMs Spot y tengan taints de nodo, usa la marca --node-taints cuando crees el grupo de nodos:

    gcloud container node-pools create POOL_NAME \
        --node-taints=cloud.google.com/gke-spot="true":NoSchedule
        --spot
    
  2. Para agregar la tolerancia correspondiente a los Pods que deseas programar en las VMs Spot, modifica las implementaciones y agrega lo siguiente a la especificación del Pod:

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

    GKE solo programa Pods con esta tolerancia en las VMs Spot con el taint de nodo agregado.

¿Qué sigue?