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
- La función de cierre suave de nodos de kubelet solo está habilitada en clústeres que ejecutan GKE 1.20 y versiones posteriores. En las versiones de GKE anteriores a la 1.20, puedes usar el gestor de eventos de finalización de nodos de Kubernetes en GCP para finalizar correctamente tus pods cuando se interrumpan las VMs Spot.
- Las VMs Spot no admiten grupos de nodos de Windows Server.
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:
En la Google Cloud consola, ve a la página Crear un clúster de Kubernetes.
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.
Marca la casilla Habilitar VMs de spot.
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:
Ve a la página Google Kubernetes Engine en la Google Cloud consola.
En la lista de clústeres, haga clic en el nombre del clúster que quiera modificar.
Haz clic en
Añadir grupo de nodos.En el menú de navegación, haga clic en Nodos.
Marca la casilla Habilitar VMs de spot.
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.
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.Obtén las credenciales del clúster:
gcloud container clusters get-credentials CLUSTER_NAME
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.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.Aplica el manifiesto a tu clúster:
kubectl apply -f pi-app.yaml
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.
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
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
- Consulta cómo ejecutar una aplicación de GKE en máquinas virtuales de acceso puntual con nodos bajo demanda como alternativa.
- Más información sobre las máquinas virtuales de acceso puntual en GKE
- Consulta un tutorial sobre cómo desplegar una carga de trabajo por lotes mediante VMs Spot en GKE.