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
- La función de cierre ordenado de nodos de kubelet solo está habilitada en clústeres que ejecutan GKE versión 1.20 y posteriores. En las versiones de GKE anteriores a la 1.20, puedes usar el Controlador de eventos de terminación de nodos de Kubernetes en GCP para finalizar ordenadamente tus Pods cuando se interrumpen las VMs Spot.
- Las VM Spot no son compatibles con los grupos de nodos de Windows Server.
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:
Ve a la página de Google Kubernetes Engine en la consola de Google Cloud.
Haz clic en add_box Crear.
En el cuadro de diálogo Crear clúster, junto a GKE Standard, haz clic en Configurar.
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.
Selecciona la casilla de verificación Habilitar VM Spot.
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:
Ve a la página de Google Kubernetes Engine en la consola de Google Cloud.
En la lista de clústeres, haz clic en el nombre del clúster que deseas modificar.
Haz clic en
Agregar grupo de nodos.En el menú de navegación, haz clic en Nodos.
Selecciona la casilla de verificación Habilitar VM Spot.
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.
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.Obtén credenciales para el clúster:
gcloud container clusters get-credentials CLUSTER_NAME
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.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.Aplica el manifiesto al clúster:
kubectl apply -f pi-app.yaml
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.
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
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?
- Aprende a ejecutar una aplicación de GKE en las VMs Spot con nodos a pedido como resguardo.
- Obtén más información sobre las VM Spot en GKE.
- Lee un instructivo sobre cómo implementar una carga de trabajo por lotes con VM puntuales en GKE.