Crea y, también, 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. Una instancia interrumpible es una que puedes crear y ejecutar a un precio mucho menor que las instancias normales. Sin embargo, Compute Engine podría finalizar (interrumpir) estas instancias si requiere acceso a los recursos para otras tareas. Las instancias interrumpibles siempre finalizarán 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 Platform 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 GCP Console, ve a la página VM Instances.

    Ir a la página Instancias de VM

  2. Haz clic en Crear instancia.
  3. En la página Crear una instancia nueva, llena las propiedades que quieras para tu instancia.
  4. Haz clic en Administración, Seguridad, Discos, Redes, Instancia única.
  5. En Política de disponibilidad, establece la opción Interrumpible en Encendido. Esta configuración inhabilita el reinicio automático para la instancia y establece la acción de mantenimiento del host en Finalizar.
  6. Haz clic en Crear para crear la instancia.

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 [INSTANCE_NAME] --preemptible

En el comando anterior, [INSTANCE_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. 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 necesitarás suficiente cuota de IP y de disco, como de costumbre. La cuota de CPU interrumpible no se puede ver en la herramienta de 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.

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 finalizar sin problemas un proceso en ejecución 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 agregar 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 finalice todos los procesos restantes. Después de finalizar sin problemas el programa deseado, la secuencia de comandos realiza una carga paralela de un archivo de punto de control a un depósito de Google 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 depósito de Cloud Storage donde quieres guardar el archivo de punto de control del programa. Ten en cuenta que el nombre del depósito 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ó, como mínimo, con acceso de lectura y escritura a Cloud Storage. Consulta la documentación sobre autenticación si quieres obtener instrucciones para crear una instancia con los alcances adecuados.

  • Tienes un depósito 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 GCP Console, la herramienta de gcloud o la API.

Console


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

  1. Ve a la página de instancias de VM.

    Ir a la página Instancias de VM

  2. Selecciona tu 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 de 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://compute.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 Platform Console, la herramienta de gcloud o la API.

Console


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

  1. Ve a la página Registros.

    Ir a la página Registros

  2. Selecciona tu 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. GCP 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://compute.googleapis.com/compute/v1/projects/[PROJECT_ID]/zones/us-central1-f",
  "operationType": "compute.instances.preempted",
  "targetLink": "https://compute.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://compute.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, será 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 mostrará 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

Prácticas recomendadas

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

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

Los recursos para instancias de VM interrumpible se obtienen de la capacidad de exceso y de realizar copias de seguridad de Google Cloud Platform. 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. Las tasas de interrupción para tipos de máquinas más pequeños con menos de 32 núcleos también son más bajas que para los tipos de máquinas más grandes, según el historial.

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 Platform varía según la ubicación y la hora del día, pero, por lo general, es más baja durante la noche y 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 habrá cambios en los patrones de interrupción en diferentes momentos. Por ejemplo, es posible que, si una zona sufre una interrupción parcial, se interrumpa una gran cantidad de instancias interrumpibles para hacer lugar a instancias regulares 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 se da por hecho que las interrupciones siempre se harán 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 secuencia 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

¿Te ha resultado útil esta página? Enviar comentarios:

Enviar comentarios sobre...

Documentación de Compute Engine