Crea e inicia una instancia de VM interrumpible

En esta página, se explica cómo crear y usar una instancia de máquina virtual (VM) interrumpible. Las VM interrumpibles están disponibles con un 60%-91% de descuento en comparación con el precio de las VM estándar. Sin embargo, Compute Engine podría detener (interrumpir) estas instancias si necesita reclamar esos recursos para otras tareas. Las instancias interrumpibles siempre se detienen después de 24 horas. Para obtener más información sobre las instancias interrumpibles, consulta la documentación de instancias interrumpibles.

Las instancias interrumpibles solo se recomiendan para aplicaciones tolerantes a errores que pueden soportar interrupciones de la instancia. Asegúrate de que tu aplicación pueda manejar las interrupciones antes de decidir crear una instancia interrumpible. Para comprender los riesgos y el valor de las instancias interrumpibles, lee la documentación de instancias interrumpibles.

Antes de comenzar

Crea una instancia interrumpible

Crea una instancia interrumpible a través de Google Cloud Console, la herramienta de gcloud o la API.

Console

Crear una instancia interrumpible es lo mismo que crear una instancia normal, con la diferencia de que se habilita la propiedad preemptible.

  1. En Google Cloud Console, ve a la página Crear una instancia.

    Ir a Crear una instancia

  2. Especifica los detalles de la VM.

  3. Expande la sección Herramientas de redes, discos, seguridad, administración, instancia única y sigue estos pasos:

    1. Expande la sección Administración.
    2. En Política de disponibilidad, establece la opción Interrumpibilidad en Encendido. Esta configuración inhabilita el reinicio automático para la VM y establece la acción de mantenimiento del host en Finalizar.
  4. Para crear y, también, iniciar la VM, haz clic en Crear.

gcloud

Con gcloud compute, usa el mismo comando instances create que usarías para crear una instancia normal, pero agrega la marca --preemptible:

gcloud compute instances create [VM_NAME] --preemptible

En el comando anterior, [VM_NAME] es el nombre de la instancia.

API

En la API, envía una solicitud normal para crear una instancia, pero incluye la propiedad preemptible en scheduling y establécela en true. Por ejemplo:

POST https://compute.googleapis.com/compute/v1/projects/[PROJECT_ID]/zones/[ZONE]/instances

{
  'machineType': 'zones/[ZONE]/machineTypes/[MACHINE_TYPE]',
  'name': '[INSTANCE_NAME]',
  'scheduling':
  {
    'preemptible': true
  },
  ...
}

Cuotas de CPU interrumpibles

Las instancias interrumpibles requieren cuotas de CPU disponibles, como las instancias normales. Para evitar que instancias interrumpibles consuman las cuotas de CPU de tus instancias normales, puedes solicitar una cuota especial de "CPU interrumpible". Después de que Compute Engine te asigne una cuota de CPU interrumpible en una región, todas las instancias interrumpibles se deducirán de esa cuota, y todas las instancias normales seguirán deduciéndose de la cuota de CPU normal.

En las regiones donde no tienes una cuota de CPU interrumpible, puedes usar la cuota de CPU normal para iniciar instancias interrumpibles. También necesitas suficiente cuota de IP y de disco, como de costumbre. La cuota de CPU interrumpible no se puede ver en la herramienta gcloud ni en las páginas de cuota de GCP Console, a menos que Compute Engine haya otorgado la cuota.

Para obtener más información sobre las cuotas, visita la página Cuotas de recursos.

Inicia una VM interrumpible

Al igual que cualquier otra VM, si se detiene o interrumpe una VM interrumpible, puedes iniciarla de nuevo y volver al estado RUNNING. Iniciar una VM interrumpible restablece el contador de 24 horas, pero como aún es una VM interrumpible, Compute Engine puede interrumpirse antes de 24 horas. No es posible convertir una instancia interrumpible en una instancia estándar mientras se ejecuta.

Si Compute Engine detiene una VM interrumpible en un grupo de instancias administrado de ajuste de escala automático (MIG) o de Google Kubernetes Engine (GKE), el grupo reinicia la VM cuando los recursos vuelven a estar disponibles.

Controla la interrupción con una secuencia de comandos de apagado

Cuando se interrumpe tu instancia, puedes usar una secuencia de comandos de apagado para realizar acciones de limpieza antes de que la instancia se detenga. Por ejemplo, puedes detener con un proceso en ejecución con facilidad y copiar un archivo de punto de control en Cloud Storage.

La siguiente es una secuencia de comandos de apagado que puedes agregar a una instancia interrumpible en ejecución o a una instancia interrumpible nueva cuando la creas. Esta secuencia de comandos se ejecuta cuando la instancia comienza a cerrarse, antes de que el comando kill normal del sistema operativo detenga todos los procesos restantes. Después de detener de forma correcta el programa deseado, la secuencia de comandos realiza una carga paralela de un archivo de punto de control a un bucket de Cloud Storage.

#!/bin/bash

MY_PROGRAM="[PROGRAM_NAME]" # For example, "apache2" or "nginx"
MY_USER="[LOCAL_USERNAME]"
CHECKPOINT="/home/$MY_USER/checkpoint.out"
GSUTIL_OPTS="-m -o GSUtil:parallel_composite_upload_threshold=32M"
BUCKET_NAME="[BUCKET_NAME]" # For example, "my-checkpoint-files" (without gs://)

echo "Shutting down!  Seeing if ${MY_PROGRAM} is running."

# Find the newest copy of $MY_PROGRAM
PID="$(pgrep -n "$MY_PROGRAM")"

if [[ "$?" -ne 0 ]]; then
  echo "${MY_PROGRAM} not running, shutting down immediately."
  exit 0
fi

echo "Sending SIGINT to $PID"
kill -2 "$PID"

# Portable waitpid equivalent
while kill -0 "$PID"; do
   sleep 1
done

echo "$PID is done, copying ${CHECKPOINT} to gs://${BUCKET_NAME} as ${MY_USER}"

su "${MY_USER}" -c "gsutil $GSUTIL_OPTS cp $CHECKPOINT gs://${BUCKET_NAME}/"

echo "Done uploading, shutting down."

Si quieres agregar esta secuencia de comandos a una instancia, configúrala para que funcione con una aplicación en tu instancia y agrégala a los metadatos de tu instancia.

  1. Copia o descarga la secuencia de comandos de apagado en tu estación de trabajo local.
  2. Abre el archivo para editarlo y cambia las variables siguientes:
    • [PROGRAM_NAME] es el nombre del proceso o programa que quieres cerrar. Por ejemplo, apache2 o nginx.
    • [LOCAL_USER] es el nombre de usuario con el que accediste a la máquina virtual.
    • [BUCKET_NAME] es el nombre del bucket de Cloud Storage donde quieres guardar el archivo de punto de control del programa. Ten en cuenta que el nombre del bucket no comienza con gs:// en este caso.
  3. Guarda los cambios.
  4. Agrega la secuencia de comandos de apagado a una instancia nueva o a una instancia existente.

Esta secuencia de comandos supone lo siguiente:

  • La instancia se creó con acceso de lectura y escritura a Cloud Storage como mínimo. Consulta la documentación sobre autenticación si quieres obtener instrucciones para crear una instancia con los permisos adecuados.

  • Tienes un bucket de Cloud Storage existente y permiso para escribir en él.

Comprueba si una instancia es interrumpible

Puedes verificar si una instancia está configurada para ser interrumpible con Cloud Console, la herramienta de gcloud o la API.

Console

Comprueba si una instancia es interrumpible mediante las propiedades de la instancia.

  1. En Google Cloud Console, ve a la página Instancias de VM.

    Ir a Instancias de VM

  2. Selecciona el proyecto y haz clic en Continuar.

  3. Haz clic en el nombre de la instancia que quieres verificar. Se abrirá la página de detalles de la instancia.

  4. El estado interrumpible se especifica en la sección Políticas de disponibilidad, en los detalles de la instancia.

gcloud


En gcloud compute, usa instances describe para obtener información sobre una instancia, incluso si la instancia es interrumpible.

gcloud compute instances describe [INSTANCE_NAME]

En el comando anterior, [INSTANCE_NAME] es el nombre de la instancia.

La información de respuesta incluye el estado interrumpible en la sección de programación.

...
scheduling:
  automaticRestart: false
  onHostMaintenance: TERMINATE
  preemptible: true
...

API


Si quieres comprobar si una instancia es interrumpible, usa la API para enviar una solicitud GET al URI de la instancia.

GET https://compute.googleapis.com/compute/v1/projects/[PROJECT_ID]/zones/[ZONE]/instances/[INSTANCE_NAME]

La información de respuesta incluye el estado de interrumpible en scheduling.

{
    "kind": "compute#instance",
    "id": "4468501694759003918",
    "creationTimestamp": "2015-04-15T15:40:59.004-07:00",
    "zone": "https://www.googleapis.com/compute/v1/projects/[PROJECT_ID]/zones/us-central1-f",
    "status": "RUNNING",
    "name": "example-instance",
    "scheduling":
    {
       "preemptible": true
    },
    ...
 }

Como alternativa, puedes determinar si una instancia es interrumpible desde dentro de la instancia misma. Solo verifica el valor en el servidor de metadatos para el valor scheduling/preemptible en los metadatos de instancia predeterminados de tu instancia.

Por ejemplo, usa curl desde tu instancia para obtener el valor de scheduling/preemptible:

curl "http://metadata.google.internal/computeMetadata/v1/instance/scheduling/preemptible" -H "Metadata-Flavor: Google"
TRUE

Si este valor es TRUE, la instancia es interrumpible.

Detecta si se interrumpió una instancia

Determina si una instancia se interrumpió con Google Cloud Console, la herramienta de gcloud o la API.

Console

Para verificar si se interrumpió una instancia, consulta los registros de actividad del sistema.

  1. En Google Cloud Console, ve a la página Registros.

    Ir a Registros

  2. Selecciona el proyecto y haz clic en Continuar.

  3. Agrega compute.instances.preempted al filtro por etiqueta o campo de búsqueda de texto.

  4. De forma alternativa, también puedes ingresar un nombre de instancia si quieres ver las operaciones de interrupción de una instancia específica.

  5. Presiona Intro para aplicar los filtros especificados. Cloud Console actualiza la lista de registros para mostrar solo las operaciones en las que se interrumpió una instancia.

  6. Selecciona una operación en la lista para obtener detalles acerca de la instancia que se interrumpió.

gcloud


Usa el comando gcloud compute operations list con un parámetro de filtro para obtener una lista de eventos de interrupción de tu proyecto.

gcloud compute operations list \
    --filter="operationType=compute.instances.preempted"

Puedes usar el parámetro de filtro para ampliar aún más los resultados. Por ejemplo, si quieres ver eventos de interrupción solo para instancias dentro de un grupo de instancias administrado, realiza lo siguiente:

gcloud compute operations list \
    --filter="operationType=compute.instances.preempted AND targetLink:instances/[BASE_INSTANCE_NAME]"

gcloud muestra una respuesta similar a la que se ve a continuación:

NAME                  TYPE                         TARGET                                   HTTP_STATUS STATUS TIMESTAMP
systemevent-xxxxxxxx  compute.instances.preempted  us-central1-f/instances/example-instance-xxx  200         DONE   2015-04-02T12:12:10.881-07:00

Un tipo de operación compute.instances.preempted indica que la instancia se interrumpió. Puedes usar el comando operations describe para obtener más información sobre una operación de interrupción específica.

gcloud compute operations describe \
    systemevent-xxxxxxxx

gcloud muestra una respuesta similar a la que se ve a continuación:

...
operationType: compute.instances.preempted
progress: 100
selfLink: https://compute.googleapis.com/compute/v1/projects/[PROJECT_ID]/zones/us-central1-f/operations/systemevent-xxxxxxxx
startTime: '2015-04-02T12:12:10.881-07:00'
status: DONE
statusMessage: Instance was preempted.
...

API


Para obtener una lista de las operaciones del sistema recientes, envía una solicitud GET al URI de las operaciones de zona.

GET https://compute.googleapis.com/compute/v1/projects/[PROJECT_ID]/zones/[ZONE]/operations

La respuesta contiene una lista de operaciones recientes.

{
  "kind": "compute#operation",
  "id": "15041793718812375371",
  "name": "systemevent-xxxxxxxx",
  "zone": "https://www.googleapis.com/compute/v1/projects/[PROJECT_ID]/zones/us-central1-f",
  "operationType": "compute.instances.preempted",
  "targetLink": "https://www.googleapis.com/compute/v1/projects/[PROJECT_ID]/zones/us-central1-f/instances/example-instance",
  "targetId": "12820389800990687210",
  "status": "DONE",
  "statusMessage": "Instance was preempted.",
  ...
}

Para determinar la respuesta a fin de mostrar solo las operaciones de prioridad, puedes agregar un filtro a tu solicitud a la API: operationType="compute.instances.preempted". Si quieres ver las operaciones de interrupción de una instancia específica, agrega un parámetro targetLink al filtro: operationType="compute.instances.preempted" AND targetLink="https://www.googleapis.com/compute/v1/projects/[PROJECT_ID]/zones/[ZONE]/instances/[INSTANCE_NAME]".

Como alternativa, puedes determinar si una instancia se reemplazó desde la instancia en sí. Esto es útil si quieres controlar el apagado debido a una interrupción de Compute Engine diferente de un apagado normal en una secuencia de comandos de apagado. Si quieres hacerlo, solo debes verificar el servidor de metadatos para el valor preempted en los metadatos de instancia predeterminados de tu instancia.

Por ejemplo, usa curl desde tu instancia para obtener el valor de preempted:

curl "http://metadata.google.internal/computeMetadata/v1/instance/preempted" -H "Metadata-Flavor: Google"
TRUE

Si este valor es TRUE, Compute Engine interrumpió la instancia, de lo contrario, es FALSE.

Si quieres usarlo por fuera de una secuencia de comandos de apagado, puedes agregar ?Wait_for_change=true a la URL. Esto realiza una solicitud HTTP GET pendiente que solo se muestra cuando cambien los metadatos y se reemplace la instancia.

curl "http://metadata.google.internal/computeMetadata/v1/instance/preempted?wait_for_change=true" -H "Metadata-Flavor: Google"
TRUE

Prueba la configuración de interrupción

Puedes ejecutar eventos de mantenimiento simulados en tus instancias para forzarlas a interrumpirse. Usa esta función para probar cómo tus apps manejan las instancias interrumpibles. Consulta Prueba las políticas de disponibilidad para saber cómo probar los eventos de mantenimiento en las instancias.

También puedes simular una interrupción de instancia si detienes la instancia, que se puede usar en lugar de simular un evento de mantenimiento y evita los límites de cuota.

Prácticas recomendadas

Estas son algunas prácticas recomendadas para ayudarte a aprovechar al máximo las instancias de VM interrumpibles.

Usa la API de instancias masivas

En lugar de crear VM individuales, puedes usar la API de instancia masiva.

Elige formas de máquina más pequeñas

Los recursos para instancias de VM interrumpibles se obtienen del exceso y la capacidad de copia de seguridad de Google Cloud. Suele ser más fácil obtener mucha capacidad de interrupción con tipos de máquinas más pequeños que los con más grandes.

También puedes obtener más capacidad adicional mediante un tipo personalizado de máquina que se encuentre entre los tipos predefinidos. Por ejemplo, es probable que haya más capacidad para un tipo personalizado de máquina con 48 CPU virtuales que las n1-estándar-64.

Ejecuta clústeres grandes de VM interrumpibles durante las horas de menor actividad

La carga en los centros de datos de Google Cloud varía según la ubicación y la hora del día, pero generalmente es más baja durante las noches y los fines de semana. Como tal, a la noche y en los fines de semana son los mejores momentos para ejecutar clústeres grandes de VM interrumpibles.

Diseña tus aplicaciones para que sean tolerantes a fallas y a la interrupción

Es importante estar preparado para el hecho de que hay cambios en los patrones de interrupción en diferentes momentos. Por ejemplo, si una zona sufre una interrupción parcial, se puede interrumpir una gran cantidad de instancias interrumpibles para dar lugar a las instancias normales que deben moverse como parte de la recuperación. Durante ese período, la tasa de interrupción se verá muy diferente a la de cualquier otro día. Si tu aplicación da por hecho que las interrupciones siempre se hacen en grupos pequeños, es posible que no estés preparado para tal evento. Puedes probar el comportamiento de tu aplicación en un evento de interrupción si detienes la instancia de VM.

Intenta volver a crear las instancias interrumpidas

Si tu instancia de VM se interrumpió, intenta crear instancias interrumpibles nuevas una o dos veces antes de volver a las instancias normales. Según tus requisitos, puede ser una buena idea combinar instancias interrumpibles y normales en tus clústeres para garantizar que el trabajo avance a un ritmo adecuado.

Usa secuencias de comandos de apagado

Administra las notificaciones de cierre y de interrupción con una secuencia de comandos de apagado que puede guardar el progreso de un trabajo para que pueda continuar donde lo dejó, en lugar de comenzar desde cero.

Próximos pasos