En esta página, se explica qué son las VM Spot y cómo funcionan en Google Kubernetes Engine (GKE). Para aprender a usar VM Spot, consulta Usa VM Spot.
Descripción general de las VM Spot en GKE
Las VMs Spot son instancias de máquinas virtuales (VM) de Compute Engine que tienen un precio menor que las VM estándar de Compute Engine y no proporcionan garantía de disponibilidad. Las VMs Spot ofrecen los mismos tipos de máquinas y opciones que las VMs estándar.
Puedes usar VM Spot en tus clústeres y grupos de nodos para ejecutar cargas de trabajo sin estado, por lotes o tolerantes a errores que pueden tolerar interrupciones causadas por la naturaleza efímera de las VM Spot.
Las VM Spot permanecen disponibles hasta que Compute Engine requiera los recursos para las VM estándar.
Para obtener más información sobre las VM Spot, consulta VM Spot en la documentación de Compute Engine.
Beneficios de las VM Spot
Las VM Spot y las VM interrumpibles comparten muchos beneficios, incluidos los siguientes:
- Menor precio que las VM estándar de Compute Engine.
- Es útil para cargas de trabajo sin estado tolerantes a errores que son resilientes a la naturaleza efímera de estas VM.
- Funciona con el escalador automático de clústeres y el aprovisionamiento automático de nodos.
A diferencia de las VM interrumpibles, que vencen después de 24 horas, las VM Spot no tienen tiempo de vencimiento. Las VM Spot solo se finalizan cuando Compute Engine necesita los recursos en otra ubicación.
Cómo funcionan las VM Spot en GKE
Cuando creas un clúster o grupo de nodos con VM Spot, GKE crea VM Spot subyacentes de Compute Engine que se comportan como un grupo de instancias administrado (MIG). Los nodos que usan VM Spot se comportan como nodos estándar de GKE, pero sin garantía de disponibilidad. Cuando los recursos que usan las VM Spot son necesarios para ejecutar las VM estándar, Compute Engine las finaliza para usar los recursos en otro lugar.
Rescisión y cierre ordenado de VM Spot
Cuando Compute Engine necesita reclamar los recursos que usan las VM Spot, se envía un aviso de finalización a GKE. Las VMs Spot finalizan 30 segundos después de recibir una notificación de finalización.
De forma predeterminada, los clústeres usan el apagado ordenado de los nodos. kubelet observa el aviso de finalización y finaliza sin problemas los Pods que se ejecutan en el nodo. Si los Pods son parte de una implementación, el controlador crea y programa Pods nuevos para reemplazar los Pods cerrados.
En función del mejor esfuerzo, kubelet otorga un período de finalización ordenado de 15 segundos para Pods que no son del sistema, después de los cuales los Pods del sistema (con priorityClasses system-cluster-critical
o system-node-critical
) tienen 15 segundos para finalizar de forma correcta.
Durante la finalización correcta del nodo, kubelet actualiza el estado de los Pods y asigna una fase Failed
y un motivo Terminated
a los Pods terminados.
Cuando la cantidad de Pods finalizados alcanza un umbral de 1,000 para los clústeres con menos de 100 nodos o 5,000 para los clústeres con 100 nodos o más, la recolección de elementos no utilizados limpia los Pods.
También puedes borrar los Pods finalizados de forma manual con los siguientes comandos:
kubectl get pods --all-namespaces | grep -i NodeShutdown | awk '{print $1, $2}' | xargs -n2 kubectl delete pod -n
kubectl get pods --all-namespaces | grep -i Terminated | awk '{print $1, $2}' | xargs -n2 kubectl delete pod -n
Programa cargas de trabajo en VM Spot
GKE agrega de forma automática 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 usar VMs Spot. Puedes programar Pods específicos en nodos que usan VMs Spot mediante el campo nodeSelector en las especificaciones de tu Pod. En los siguientes ejemplos, se usa la etiqueta cloud.google.com/gke-spot
:
apiVersion: v1
kind: Pod
spec:
nodeSelector:
cloud.google.com/gke-spot: "true"
Como alternativa, puedes usar la afinidad de nodos para que GKE programe Pods en VM Spot, similar al siguiente ejemplo:
apiVersion: v1
kind: Pod
spec:
...
affinity:
nodeAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
nodeSelectorTerms:
- matchExpressions:
- key: cloud.google.com/gke-spot
operator: In
values:
- "true"
...
También puedes usar nodeAffinity.preferredDuringSchedulingIgnoredDuringExecution
para preferir que GKE coloque los Pods en los nodos que usan VM Spot.
No se recomienda usar VM Spot, ya que GKE podría programar los Pods en nodos viables existentes que usan VM estándar.
Usa taints y tolerancias para la programación
Para evitar interrupciones del sistema, usa un taint de nodo a fin de asegurarte de que GKE no programe las cargas de trabajo críticas en las VM Spot. Cuando realizas un taint de nodos que usan VM Spot, GKE solo programa Pods que tienen la tolerancia correspondiente en esos nodos.
Si usas taints de nodos, asegúrate de que tu clúster también tenga al menos un grupo de nodos que use las VM estándar de Compute Engine. Los grupos de nodos que usan las VM estándar proporcionan un lugar confiable para que GKE programe los componentes críticos del sistema, como el DNS.
Si deseas obtener información sobre cómo usar un taint de nodo para VM Spot, consulta Usa taints y tolerancias para VM Spot.
Usa VM Spot con grupos de nodos de GPU
Compatibilidad de VM Spot con GPU
Cuando creas un grupo de nodos de GPU nuevo, GKE agrega de forma automática el taint nvidia.com/gpu=present:NoSchedule
a los nodos nuevos. Solo los Pods con la tolerancia correspondiente pueden ejecutarse en estos nodos. GKE agrega de forma automática esta tolerancia a los Pods que solicitan GPU.
Tu clúster debe tener al menos un grupo de nodos existente que no sea de GPU que use las VM estándar antes de crear un grupo de nodos de GPU que use VM Spot. Si tu clúster solo tiene un grupo de nodos de GPU con VM Spot, GKE no agrega el taint nvidia.com/gpu=present:NoSchedule
a esos nodos. Como resultado, GKE podría programar cargas de trabajo del sistema en los grupos de nodos de GPU con VM Spot, lo que puede provocar interrupciones debido a las VM Spot y puede aumentar el consumo de recursos porque los nodos de GPU son más costosos que nodos que no son de GPU.
Aprovisionamiento automático de nodos y escalador automático del clúster
Puedes usar el escalador automático del clúster y el aprovisionamiento automático de nodos para escalar los clústeres y grupos de nodos de forma automática según las demandas de tus cargas de trabajo. La asistencia para el aprovisionamiento automático de nodos y el escalador automático del clúster mediante VM Spot.
VM Spot y aprovisionamiento automático de nodos
El aprovisionamiento automático de nodos crea y borra de forma automática grupos de nodos en tu clúster para satisfacer las demandas de tus cargas de trabajo. Cuando programas cargas de trabajo que requieren VMs Spot mediante una afinidad de nodo o nodeSelector
, el aprovisionamiento automático de nodos crea grupos de nodos nuevos para alojar los Pods de las cargas de trabajo. GKE agrega de forma automática el taint cloud.google.com/gke-spot=true:NoSchedule
a los nodos en los grupos de nodos nuevos. Solo los Pods con la tolerancia correspondiente pueden ejecutarse en nodos en esos grupos de nodos. Debes agregar la tolerancia correspondiente a tus implementaciones para permitir que GKE coloque los Pods en las VMs Spot:
tolerations:
- key: cloud.google.com/gke-spot
operator: Equal
value: "true"
effect: NoSchedule
Puedes asegurarte de que GKE solo programe tus pods en las VM Spot mediante la tolerancia y una regla de afinidad de nodo o nodeSelector
para filtrar. para las VM Spot.
Si programas una carga de trabajo solo con una tolerancia, GKE puede programar los Pods en VMs Spot o VMs estándar existentes con capacidad. Si necesitas que una carga de trabajo se programe en VMs Spot, usa una afinidad de nodo nodeSelector
o además de una tolerancia. Para obtener más información, consulta Cómo programar cargas de trabajo en VMs Spot.
VM Spot y escalador automático de clústeres
El escalador automático del clúster agrega y quita nodos de tus grupos de nodos de forma automática según la demanda. Si tu clúster tiene Pods que no se pueden colocar en las VM Spot existentes, el escalador automático del clúster agrega nodos nuevos que usan las VM Spot.
Política predeterminada
A partir de la versión 1.24.1-gke.800 de GKE, puedes definir la política de ubicación del escalador automático. El escalador automático del clúster intenta aprovisionar grupos de nodos de VM Spot cuando los recursos están disponibles y la política de ubicación predeterminada está configurada como ANY
. Con esta política, las VM Spot tienen un riesgo menor de interrupción. Para otros tipos de VM, la política predeterminada de distribución del escalador automático del clúster es BALANCED
.
Actualiza grupos de nodos de Standard mediante VMs Spot
Si tus grupos de nodos de clúster Standard que usan VMs Spot están configurados para usar actualizaciones de aumento, GKE crea nodos de aumento con VMs Spot. Sin embargo, GKE no espera a que las VMs Spot estén listas antes de acordonar y desviar los nodos existentes, ya que las VMs Spot no proporcionan garantía de disponibilidad. Para obtener más información, consulta Actualizaciones de aumento.
Modificaciones del comportamiento de Kubernetes
El uso de VM Spot en GKE modifica algunas garantías y restricciones que proporciona Kubernetes, como las siguientes:
- La reclamación de VM Spot es involuntaria y no está cubierta por las garantías de
PodDisruptionBudgets
. Es posible que experimentes una falta de disponibilidad superior alPodDisruptionBudget
configurado.
Prácticas recomendadas para las VM Spot
Cuando diseñes un sistema que use VM Spot, puedes evitar interrupciones importantes mediante los siguientes lineamientos:
- Las VM Spot no tienen garantías de disponibilidad. Diseña tus sistemas a partir de la suposición de que GKE podría recuperar cualquiera o todas tus VM Spot en cualquier momento, sin garantizar cuándo estarán disponibles instancias nuevas.
- Para garantizar que tus cargas de trabajo y trabajos se procesen incluso cuando no hay VM Spot disponibles, asegúrate de que tus clústeres tengan una combinación de grupos de nodos que usen VM Spot y grupos de nodos que usen VM estándar de Compute Engine.
- Asegúrate de que tu clúster tenga al menos un grupo de nodos de GPU que use VM estándar antes de agregar un grupo de nodos de GPU que use VM Spot.
- Si bien los nombres de los nodos no suelen cambiar cuando se vuelven a crear los nodos, las direcciones IP internas y externas que usan las VM Spot pueden cambiar después de la recreación.
- Usa taints y tolerancias de nodo para asegurarte de que los Pods críticos no estén programados en los grupos de nodos que usan VM Spot.
- A fin de ejecutar cargas de trabajo con estado en VMs Spot, realiza una prueba para asegurarte de que tus cargas de trabajo puedan finalizar de forma correcta dentro de 25 segundos del cierre a fin de minimizar el riesgo de corrupción de los datos del volumen persistente.
- Sigue las prácticas recomendadas de finalización de Pods de Kubernetes.
¿Qué sigue?
- Obtén más información sobre cómo usar VMs Spot en tus grupos de nodos.
- Obtén más información para realizar el ajuste de escala automático de tus clústeres.
- Obtén información para escalar las apps implementadas.
- Obtén más información sobre las VM Spot en la documentación de Compute Engine.
- Lee un instructivo sobre cómo implementar una carga de trabajo por lotes con VM puntuales en GKE.