VMs de acceso puntual


En esta página se explica qué son las máquinas virtuales de acceso puntual y cómo funcionan en Google Kubernetes Engine (GKE). Para saber cómo usar las VMs de acceso puntual, consulta el artículo Usar VMs de acceso puntual.

Información general sobre las máquinas virtuales de acceso puntual en GKE

Las máquinas virtuales de acceso puntual son instancias de máquina virtual (VM) de Compute Engine que tienen un precio más bajo que las máquinas virtuales estándar de Compute Engine y no ofrecen ninguna garantía de disponibilidad. Las máquinas virtuales de acceso puntual ofrecen los mismos tipos de máquinas y opciones que las máquinas virtuales estándar.

Puedes usar máquinas virtuales de Spot en tus clústeres y grupos de nodos para ejecutar cargas de trabajo sin estado, por lotes o tolerantes a fallos que puedan tolerar las interrupciones causadas por la naturaleza efímera de las máquinas virtuales de Spot.

Las VMs de acceso puntual siguen estando disponibles hasta que Compute Engine necesita los recursos para las VMs estándar.

Para obtener más información sobre las VMs de acceso puntual, consulta la sección VMs de acceso puntual de la documentación de Compute Engine.

Ventajas de las máquinas virtuales de acceso puntual

Las máquinas virtuales de acceso puntual y las máquinas virtuales interrumpibles comparten muchas ventajas, entre las que se incluyen las siguientes:

A diferencia de las máquinas virtuales interrumpibles, que caducan al cabo de 24 horas, las máquinas virtuales de acceso puntual no tienen fecha de vencimiento. Las Spot VMs solo se cancelan cuando Compute Engine necesita los recursos en otro lugar.

Cómo funcionan las VMs de acceso puntual en GKE

Cuando creas un clúster o un grupo de nodos con Spot VMs, GKE crea Spot VMs de Compute Engine subyacentes que se comportan como un grupo de instancias gestionado (MIG). Los nodos que usan VMs de aprovisionamiento puntual se comportan como los nodos de GKE estándar, pero no tienen ninguna garantía de disponibilidad. Cuando se necesitan los recursos que usan las máquinas virtuales de Spot para ejecutar máquinas virtuales estándar, Compute Engine cancela esas máquinas virtuales de Spot para usar los recursos en otro lugar.

Finalización y apagado gradual de las máquinas virtuales de acceso puntual

Cuando Compute Engine necesita recuperar los recursos utilizados por las VMs de Spot, se envía un aviso de finalización a GKE. Las VMs de acceso puntual se cancelan 30 segundos después de recibir un aviso de cancelación.

De forma predeterminada, los clústeres usan el apagado suave de nodos. El kubelet detecta el aviso de finalización y finaliza correctamente los pods que se están ejecutando en el nodo. Si los pods forman parte de una carga de trabajo gestionada, como un deployment, el controlador crea y programa nuevos pods para sustituir los pods finalizados.

De la mejor forma posible, el kubelet concede un periodo de finalización gradual de 15 segundos para los pods que no son del sistema, tras lo cual los pods del sistema (con las clases de prioridad system-cluster-critical o system-node-critical) tienen 15 segundos para finalizar gradualmente. Durante la finalización correcta de un nodo, kubelet actualiza el estado de los pods y les asigna una fase Failed y un motivo Terminated a los pods finalizados.

La VM se apaga 30 segundos después de que se envíe la notificación de finalización, aunque especifiques un valor superior a 15 segundos en el campo terminationGracePeriodSeconds del manifiesto de tu pod.

Cuando el número de pods finalizados alcanza un umbral de 1000 en clústeres con menos de 100 nodos o de 5000 en clústeres con 100 nodos o más, la recogida de elementos no utilizados limpia los pods.

También puedes eliminar los pods finalizados manualmente 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

Programar cargas de trabajo en máquinas virtuales de acceso puntual

GKE añade automáticamente 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 programar pods específicos en nodos que usen Spot VMs mediante el campo nodeSelector de las especificaciones del 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"

También puedes usar la afinidad de nodos para indicar a GKE que programe pods en máquinas virtuales de acceso puntual, como en el 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 pods en nodos que usen Spot VMs. No se recomienda usar máquinas virtuales Spot, ya que GKE podría programar los pods en nodos viables que utilicen máquinas virtuales estándar.

Usar taints y tolerancias para la programación

Para evitar interrupciones en el sistema, usa un taint de nodo para asegurarte de que GKE no programe cargas de trabajo críticas en VMs de aprovisionamiento esporádico. Cuando marcas nodos que usan máquinas virtuales de acceso puntual, GKE solo programa pods que tengan la tolerancia correspondiente en esos nodos.

Si usas etiquetas de nodos, asegúrate de que tu clúster también tenga al menos un grupo de nodos que use VMs estándar de Compute Engine. Los grupos de nodos que usan máquinas virtuales estándar proporcionan un lugar fiable para que GKE programe componentes críticos del sistema, como el DNS.

Para obtener información sobre cómo usar un taint de nodo en las máquinas virtuales de acceso puntual, consulta Usar taints y tolerancias en máquinas virtuales de acceso puntual.

Usar Spot VMs con grupos de nodos de GPU

Las máquinas virtuales de acceso puntual admiten el uso de GPUs. Cuando creas un grupo de nodos de GPU, GKE añade automáticamente el taint nvidia.com/gpu=present:NoSchedule a los nodos nuevos. Solo los pods con la tolerancia correspondiente pueden ejecutarse en estos nodos. GKE añade automáticamente esta tolerancia a los pods que solicitan GPUs.

Tu clúster debe tener al menos un grupo de nodos que no use GPUs y que utilice máquinas virtuales estándar antes de crear un grupo de nodos con GPUs que utilice Spot VMs. Si tu clúster solo tiene un grupo de nodos con GPU y Spot VMs, GKE no añade el taint nvidia.com/gpu=present:NoSchedule a esos nodos. Por lo tanto, GKE puede programar cargas de trabajo del sistema en los grupos de nodos con GPU que tengan Spot VMs, lo que puede provocar interrupciones debido a las Spot VMs y aumentar el consumo de recursos, ya que los nodos con GPU son más caros que los nodos sin GPU.

Herramienta de adaptación dinámica de clústeres y aprovisionamiento automático de nodos

Puedes usar el autoescalador de clústeres y el aprovisionamiento automático de nodos para escalar automáticamente tus clústeres y grupos de nodos en función de las demandas de tus cargas de trabajo. Tanto la herramienta de adaptación dinámica de clústeres como el aprovisionamiento automático de nodos admiten el uso de VMs de tipo Spot.

Máquinas virtuales de acceso puntual y aprovisionamiento automático de nodos

El aprovisionamiento automático de nodos crea y elimina automáticamente grupos de nodos en tu clúster para satisfacer las demandas de tus cargas de trabajo. Cuando programas cargas de trabajo que requieren máquinas virtuales de acceso puntual mediante una nodeSelector o una afinidad de nodo, el aprovisionamiento automático de nodos crea grupos de nodos para alojar los pods de las cargas de trabajo. GKE añade automáticamente la cloud.google.com/gke-spot=true:NoSchedule marca a los nodos de los nuevos grupos de nodos. Solo los pods con la tolerancia correspondiente pueden ejecutarse en los nodos de esos grupos de nodos. Debes añadir la tolerancia correspondiente a tus implementaciones para permitir que GKE coloque los pods en VMs de aprovisionamiento esporádico:

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

Puedes asegurarte de que GKE solo programe tus pods en Spot VMs tanto con una tolerancia como con una regla de afinidad de nodo o nodeSelector para filtrar las Spot VMs.

Si programas una carga de trabajo usando solo una tolerancia, GKE puede programar los pods en máquinas virtuales de acceso puntual o en máquinas virtuales estándar con capacidad. Si necesitas programar una carga de trabajo en máquinas virtuales de acceso puntual, usa un nodeSelector o una afinidad de nodo, además de una tolerancia. Para obtener más información, consulta Programar cargas de trabajo en VMs de acceso puntual.

Máquinas virtuales de acceso puntual y herramienta de adaptación dinámica de clústeres

Autoescalador de clústeres: añade y elimina nodos automáticamente en tus grupos de nodos en función de la demanda. Puedes configurar la herramienta de escalado automático de clústeres para que añada nodos nuevos con preferencia por las VMs Spot. Para obtener más información, consulta Máquinas virtuales de acceso puntual y escalado automático de clústeres.

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. La herramienta de ajuste automático de escala de clústeres intenta aprovisionar grupos de nodos de VMs de instancia de prepago cuando hay recursos disponibles y la política de ubicación predeterminada se ha definido como ANY. Con esta política, las máquinas virtuales de acceso puntual tienen un riesgo menor de ser desalojadas. En otros tipos de VMs, la política de distribución predeterminada del autoescalador de clústeres es BALANCED.

Actualizar grupos de nodos estándar con Spot VMs

Si los grupos de nodos de tu clúster estándar que usan máquinas virtuales de Spot están configurados para usar actualizaciones de aumento, GKE crea nodos de aumento con máquinas virtuales de Spot. Sin embargo, GKE no espera a que las máquinas virtuales de acceso puntual estén listas antes de acordonar y vaciar los nodos existentes, ya que las máquinas virtuales de acceso puntual no ofrecen ninguna garantía de disponibilidad. Para obtener más información, consulta Mejoras de Surge.

Modificaciones en el comportamiento de Kubernetes

Al usar VMs de acceso puntual en GKE, se modifican algunas garantías y restricciones que proporciona Kubernetes, como las siguientes:

  • La recuperación de las máquinas virtuales de Spot es involuntaria y no está cubierta por las garantías de PodDisruptionBudgets. Es posible que la indisponibilidad sea mayor que la que hayas configurado en PodDisruptionBudget.

Prácticas recomendadas para las VMs de acceso puntual

Cuando diseñes un sistema que use máquinas virtuales de Spot, puedes evitar interrupciones importantes siguiendo estas directrices:

  • Las VMs de acceso puntual no tienen garantías de disponibilidad. Diseña tus sistemas partiendo de la base de que GKE puede reclamar todas o algunas de tus máquinas virtuales de Spot en cualquier momento, sin garantía de cuándo estarán disponibles las nuevas instancias.
  • Para asegurarte de que tus cargas de trabajo y trabajos se procesen aunque no haya VMs de acceso puntual disponibles, comprueba que tus clústeres tengan una combinación de grupos de nodos que usen VMs de acceso puntual y grupos de nodos que usen VMs estándar de Compute Engine.
  • Asegúrate de que tu clúster tenga al menos un grupo de nodos que no use GPUs y que utilice VMs estándar antes de añadir un grupo de nodos con GPUs que use Spot VMs.
  • Aunque los nombres de los nodos no suelen cambiar cuando se vuelven a crear, las direcciones IP internas y externas que usan las VMs de Spot pueden cambiar después de la recreación.
  • Usa etiquetas y tolerancias de nodos para asegurarte de que los pods críticos no se programen en grupos de nodos que usen máquinas virtuales de Spot.
  • Para ejecutar cargas de trabajo con estado en máquinas virtuales de acceso puntual, haz pruebas para asegurarte de que tus cargas de trabajo se pueden terminar correctamente en un plazo de 25 segundos tras el apagado para minimizar el riesgo de que se dañen los datos del volumen persistente.
  • Sigue las prácticas recomendadas para la finalización de pods de Kubernetes.

Siguientes pasos