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. 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 se finalizarán después de 24 horas. Para obtener más información sobre las instancias interrumpibles, consulta la documentación de las instancias interrumpibles.

Las instancias interrumpibles solo se recomiendan para las aplicaciones tolerantes a errores que pueden soportar interrupciones de la instancia. Asegúrate de que la aplicación pueda manejar las interrupciones antes de optar por crear una instancia interrumpible. Para comprender los riesgos y el valor de las instancias interrumpibles, lee la documentación de las 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.

console true

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 ejemplo 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 en las que 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 Cloud 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 la 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 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 la instancia y agrégala a los metadatos de la 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 siguientes variables:
    • [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 en el que quieres guardar el archivo de punto de control del programa. Ten en cuenta que en este caso el nombre del depósito no comienza con gs://.
  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. Si quieres obtener instrucciones para crear una instancia con los permisos correspondientes, consulta la documentación sobre autenticación.

  • 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 Cloud Console, la herramienta de gcloud o la API.

Console


Visualiza las propiedades de la instancia para comprobar si es interrumpible.

  1. Ve a la página 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 interrumpible se especifica en la sección Políticas de disponibilidad, en los detalles de la instancia.

gcloud


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

gcloud compute instances describe [INSTANCE_NAME]
    

En el ejemplo 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 en el servidor de metadatos el valor scheduling/preemptible en los metadatos de instancia predeterminados de la instancia.

Por ejemplo, usa curl desde dentro de la 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

Usa Google Cloud Console, la herramienta de gcloud o la API para determinar si una instancia se interrumpió.

Console


Para verificar si una instancia se interrumpió, 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 campo filtro por etiqueta o búsqueda de texto.
  4. De forma alternativa, también puedes ingresar un nombre de instancia, si es que 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 de 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 los eventos de interrupción del 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, para solo ver los eventos de interrupción de las instancias de un grupo de instancias administrado, usa este comando:

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ó. Para obtener más información sobre una operación de interrupción específica, puedes usar el comando operations describe.

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.",
      ...
    }

A fin de limitar la respuesta para que solo se muestren las operaciones de interrupción, puedes agregar un filtro a la 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 interrumpió desde la instancia misma. Esto es útil si quieres controlar el apagado debido a una interrupción de Compute Engine diferente al 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 dentro de la 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 fuera de una secuencia de comandos de apagado, puedes agregar ?Wait_for_change=true a la URL. Con esto, se realiza una solicitud HTTP GET pendiente, que solo se mostrará cuando cambien los metadatos y se interrumpa la instancia.

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

Prácticas recomendadas

A continuación, se indican algunas prácticas recomendadas para ayudarte a aprovechar al máximo las instancias de VM interrumpibles.

Elige formas de máquinas 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 una gran capacidad de interrupción con tipos de máquinas más pequeños que con los más grandes. Las tasas de interrupción en los tipos de máquinas más pequeños, de menos de 32 núcleos, también son más bajas que en los tipos de máquinas 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 una mayor capacidad en un tipo personalizado de máquina con 48 CPU virtuales que en las n1-standard-64s.

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, pero, por lo general, es más baja durante las noches y los fines de semana. Por lo tanto, la noche y 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 que haya 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 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 la aplicación da por hecho que las interrupciones siempre se harán en grupos pequeños, puede que no estés preparado para tal evento. Puedes probar cómo se comporta la aplicación en un evento de interrupción si detienes la instancia de VM.

Intenta volver a crear las instancias interrumpidas

Si la 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 los 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 pueda guardar el progreso de un trabajo para retomar desde donde lo dejó, en lugar de comenzar desde cero.

Próximos pasos