Ejecuta VM interrumpibles

En esta página, se proporciona una descripción general de la compatibilidad con máquinas virtuales (VM) interrumpibles en Google Kubernetes Engine (GKE).

Descripción general

Las VM interrumpibles son instancias de VM de Compute Engine que duran un máximo de 24 horas y no proporcionan garantías de disponibilidad. Las VM interrumpibles tienen un precio más bajo que las VM estándar de Compute Engine y ofrecen los mismos tipos de máquinas y opciones.

Puedes usar VM interrumpibles en tus clústeres de GKE o grupos de nodos para ejecutar trabajos en lotes o tolerantes a errores que sean menos sensibles a la naturaleza efímera y no garantizada de las VM interrumpibles.

Para obtener más información sobre las VM interrumpibles, consulta VM interrumpibles en la documentación de Compute Engine.

Funcionamiento de las VM interrumpibles

Cuando los clústeres o grupos de nodos de GKE crean VM de Compute Engine, las VM se comportan como un grupo de instancias administrado. Las VM interrumpibles en GKE están sujetas a las mismas limitaciones que las instancias interrumpibles en un grupo de instancias administrado. Las instancias interrumpibles finalizan 30 segundos después de recibir una notificación de interrupción.

Además, a estas VM interrumpibles se les proporciona una etiqueta de Kubernetes: cloud.google.com/gke-preemptible=true. Las etiquetas de Kubernetes se pueden usar en el campo nodeSelector para programar pods en nodos es.

A continuación, se muestra un selector de ejemplo para filtrar VM interrumpibles:

apiVersion: v1
kind: Pod
spec:
  nodeSelector:
    cloud.google.com/gke-preemptible: "true"

Incumplimientos de las restricciones de Kubernetes

Usar VM interrumpibles en GKE invalida algunas garantías de Kubernetes. Las VM interrumpibles modifican a las restricciones siguientes:

  • La interrupción del nodo apaga los pods de forma incorrecta y también ignora el período de gracia del pod configurado. Esto significa que los pods se apagan sin previo aviso.

  • De acuerdo con la documentación del presupuesto de interrupción del pod, “El presupuesto solo puede proteger contra expulsiones voluntarias, pero no todas las causas de indisponibilidad”. La interrupción no es voluntaria, por lo que es posible que experimentes una falta de disponibilidad superior a la especificada en el presupuesto de interrupción del pod.

Prácticas recomendadas

Debido a que las VM interrumpibles no tienen garantías de disponibilidad, debes diseñar tu sistema a partir de la suposición de que cualquiera o todas tus instancias de Compute Engine se pueden interrumpir y no estar disponibles. No hay garantías en cuanto al momento en que las instancias nuevas están disponibles.

Además, no hay garantía de que los pods que se ejecutan en VM interrumpibles siempre puedan cerrarse con facilidad. GKE puede tardar varios minutos en detectar que el nodo se interrumpió y que los pods ya no están en ejecución, lo que retrasará la reprogramación de los pods a un nuevo nodo.

Si quieres asegurarte de que tus trabajos o cargas de trabajo se procesen incluso si no hay VM interrumpibles disponibles, puedes crear grupos de nodos interrumpibles y no interrumpibles en tu clúster.

Aunque los nombres de los nodos en general permanecen iguales, siempre y cuando se reemplacen después de la interrupción, las direcciones IP de VM interrumpibles internas y externas pueden cambiar cuando se produce la interrupción.

No uses VM interrumpibles con pods con estados porque podrían infringir la semántica (de uno como máximo) inherente a StatefulSets, lo que podría provocar la pérdida de datos.

Usa taints de nodos para evitar la programación de nodos de VM interrumpibles

Para evitar interrupciones del sistema, usa un taint de nodo a fin de asegurarte de que los pods críticos no estén programados en un nodo de VM interrumpible.

Si aplicas taints de nodos, asegúrate de que tu clúster también tenga nodos que no sean interrumpibles ni de taint, de modo que siempre haya un grupo de nodos de VM estándar en el que ejecutar componentes del sistema, como DNS.

Agrega un taint de nodo para VM interrumpibles

Si quieres agregar un taint de nodo para un nodo con VM interrumpibles, ejecuta el siguiente comando:

kubectl taint nodes node-name cloud.google.com/gke-preemptible="true":NoSchedule

En este caso, node-name es el nombre del nodo.

Ahora, solo los pods que toleran el taint de nodo están programados en el nodo.

Agrega tolerancia a los pods

Para agregar la tolerancia relevante a tus pods, agrega lo siguiente a la especificación de tu pod o a la especificación de la plantilla de pod de tu objeto:

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

Taints de nodos de GPU interrumpibles

Debes crear el clúster con nodos no interrumpibles antes de agregar un grupo de nodos de GPU interrumpibles. Esto garantiza que siempre haya un grupo de nodos de VM estándar para ejecutar componentes del sistema como DNS antes de agregar grupos de nodos de GPU interrumpibles.

Si no hay otros grupos de nodos en el clúster cuando se agrega un grupo de nodos interrumpibles con GPU, incluso si un clúster se crea en principio con un grupo de nodos de GPU interrumpibles, no tendrá asignado el taint "nvidia.com/gpu":NoSchedule normal. Esto significa que los pods del sistema se programarán en los nodos interrumpibles, lo que puede ser perjudicial cuando se interrumpen. Los pods también consumen recursos en los nodos de GPU. Esto desperdicia capacidad y dinero porque los nodos de GPU son más caros que los que no son de GPU.

Crea un clúster o un grupo de nodos con VM interrumpibles

Puedes usar la herramienta de línea de comandos de gcloud o Cloud Console para crear un clúster o grupo de nodos con VM interrumpibles.

gcloud

Puedes crear un clúster o grupo de nodos con VM interrumpibles mediante la marca --preemptible.

Para crear un clúster con VM interrumpibles, ejecuta el siguiente comando:

gcloud container clusters create cluster-name --preemptible

En este caso, cluster-name es el nombre del clúster que se creará.

Para crear un grupo de nodos con VM interrumpibles, ejecuta el siguiente comando:

gcloud container node-pools create pool-name --preemptible \
    --cluster cluster-name

En el ejemplo anterior, se ilustra lo siguiente:

  • pool-name es el nombre del grupo de nodos que se creará.
  • cluster-name es el nombre del clúster para el grupo de nodos.

Console

  1. Visita el menú de Google Kubernetes Engine en Cloud Console.

    Ir al menú de Google Kubernetes Engine

  2. Haz clic en el botón Crear clúster.

  3. Configura tu clúster como desees.

  4. En el panel de navegación, en Grupos de nodos del grupo de nodos que quieres configurar, haz clic en Nodos.

  5. Selecciona la casilla de verificación Habilitar nodos interrumpibles.

  6. Haz clic en Crear.

Próximos pasos