En esta página, se explica cómo crear y administrar VM Spot, lo que incluye lo siguiente:
- Cómo crear, iniciar e identificar VM Spot
- Cómo detectar, manejar y probar la interrupción de las VM Spot
- Prácticas recomendadas para las VM Spot
Las VM Spot son instancias de máquina virtual (VM) con el modelo de aprovisionamiento spot. Las VMs Spot están disponibles con un descuento de hasta el 91% del precio predeterminado de las VMs estándar. Sin embargo, Compute Engine podría recuperar los recursos interrumpiendo las VMs Spot en cualquier momento. Las VMs Spot se recomiendan solo para cargas de trabajo tolerantes a errores que pueden soportar la interrupción de la VM. Asegúrate de que tu carga de trabajo pueda administrar la interrupción antes de decidir crear VMs Spot.
Si quieres crear y administrar VMs Spot con TPUs, consulta la documentación de Cloud TPU para VMs Spot.
Antes de comenzar
- Lee la documentación conceptual sobre las VMs Spot:
- Revisa las limitaciones y los precios de las VM Spot.
- Si quieres evitar que las VM Spot consuman las cuotas de las CPU, GPU y discos estándar de las VM, considera solicitar una cuota interrumpible para las VM Spot.
-
Si aún no lo hiciste, configura la autenticación.
La autenticación verifica tu identidad para acceder a los servicios y las APIs de Google Cloud . Para ejecutar código o muestras desde un entorno de desarrollo local, puedes autenticarte en Compute Engine seleccionando una de las siguientes opciones:
Selecciona la pestaña que corresponda a la forma en que planeas usar las muestras de esta página:
Console
Cuando usas la consola de Google Cloud para acceder a los servicios y las APIs de Google Cloud , no necesitas configurar la autenticación.
gcloud
-
Instala Google Cloud CLI. Después de la instalación, inicializa Google Cloud CLI con el siguiente comando:
gcloud initSi usas un proveedor de identidad externo (IdP), primero debes acceder a la gcloud CLI con tu identidad federada.
-
- Configura una región y una zona predeterminadas.
-
Instala Google Cloud CLI.
-
Si usas un proveedor de identidad (IdP) externo, primero debes acceder a gcloud CLI con tu identidad federada.
-
Si usas un shell local, crea credenciales de autenticación locales para tu cuenta de usuario:
gcloud auth application-default login
No es necesario que lo hagas si usas Cloud Shell.
Si se devuelve un error de autenticación y usas un proveedor de identidad (IdP) externo, confirma que accediste a la gcloud CLI con tu identidad federada.
Terraform
Para usar las muestras de Terraform de esta página en un entorno de desarrollo local, instala e inicializa la gcloud CLI y, luego, configura las credenciales predeterminadas de la aplicación con tus credenciales de usuario.
Si deseas obtener más información, consulta Configura la autenticación para un entorno de desarrollo local.
REST
Para usar las muestras de la API de REST incluidas en esta página en un entorno de desarrollo local, debes usar las credenciales que proporciones a la gcloud CLI.
Instala Google Cloud CLI.
Si usas un proveedor de identidad externo (IdP), primero debes acceder a la gcloud CLI con tu identidad federada.
Para obtener más información, consulta Autentícate para usar REST en la documentación de autenticación de Google Cloud .
Crea una VM Spot
Una VM Spot es cualquier VM que esté configurada para usar el modelo de aprovisionamiento spot:
- El modelo de aprovisionamiento de VM configurado como Spot en la consola de Google Cloud
--provisioning-model=SPOTen la CLI de gcloud"provisioningModel": "SPOT"en la API de Compute Engine
Para aprender a crear una VM Spot, selecciona uno de los siguientes métodos según cómo quieras controlar la preferencia:
- Crea una VM Spot con 120 segundos para controlar la interrupción (vista previa)
- Crea una VM Spot con hasta 30 segundos para controlar la interrupción (opción predeterminada)
De manera alternativa, para crear varias VM Spot con las mismas propiedades, puedes crear una plantilla de instancias y usar la plantilla para crear un grupo de instancias administrado (MIG). Para obtener más información, consulta las prácticas recomendadas.
Crea una VM Spot con 120 segundos para controlar la interrupción
Antes de crear una VM Spot con un aviso de interrupción de 120 segundos, asegúrate de controlar la interrupción dentro de tu carga de trabajo.
gcloud
Para crear una VM Spot con una duración de aviso previo de desalojo de 120 segundos desde gcloud CLI, usa el comando gcloud beta compute instances create y, luego, incluye la marca --preemption-notice-duration=120s. Para crear VMs Spot, debes incluir la marca --provisioning-model=SPOT.
De manera opcional, también puedes especificar una acción de finalización para las VMs Spot si incluyes también la marca --instance-termination-action.
gcloud beta compute instances create VM_NAME \
--provisioning-model=SPOT \
--preemption-notice-duration=120s \
--instance-termination-action=TERMINATION_ACTION
Reemplaza lo siguiente:
VM_NAME: Nombre de la VM nueva.TERMINATION_ACTION: Opcional: Especifica qué acción de finalización se debe realizar cuando Compute Engine interrumpe la VM, ya seaSTOP(comportamiento predeterminado) oDELETE.
Para obtener más información sobre las opciones que puedes especificar cuando creas una VM, consulta Opciones de configuración durante la creación de instancias. Por ejemplo, para crear VM Spot con una imagen y un tipo de máquina especificados, usa el siguiente comando:
gcloud beta compute instances create VM_NAME \
--provisioning-model=SPOT \
--preemption-notice-duration=120s \
[--image=IMAGE | --image-family=IMAGE_FAMILY] \
--image-project=IMAGE_PROJECT \
--machine-type=MACHINE_TYPE \
--instance-termination-action=TERMINATION_ACTION
Reemplaza lo siguiente:
VM_NAME: Nombre de la VM nueva.IMAGE: Especifica una de las siguientes opciones:IMAGE: Es una versión específica de una imagen pública o la familia de imágenes. Por ejemplo, una imagen específica es--image=debian-10-buster-v20200309.- Es una familia de imágenes.
Esto crea la VM a partir de la imagen de SO no obsoleta más reciente.
Por ejemplo, si especificas
--image-family=debian-10, Compute Engine crea una VM a partir de la última versión de la imagen de SO en la familia de imágenes Debian 10.
IMAGE_PROJECT: es el proyecto que contiene la imagen. Por ejemplo, si especificasdebian-10como familia de imágenes, especificadebian-cloudcomo proyecto de imagen.MACHINE_TYPE: Es el tipo de máquina predefinido o personalizado de la VM nueva.Para obtener una lista de los tipos de máquinas disponibles en una zona, usa el comando
gcloud compute machine-types listcon la marca--zones.TERMINATION_ACTION: Opcional: Especifica qué acción de finalización se debe realizar cuando Compute Engine interrumpe la VM, ya seaSTOP(comportamiento predeterminado) oDELETE.
REST
Para crear una VM Spot con una duración de aviso previo de desalojo de 120 segundos desde la API de Compute Engine, usa el método beta instances.insert y, luego, incluye el campo "preemptionNoticeDuration": { "seconds": 120 }.
Debes especificar un tipo de máquina y un nombre para la VM. De manera opcional, también puedes especificar una imagen para el disco de arranque.
Para crear VM Spot, debes incluir el campo "provisioningModel": spot.
De manera opcional, también puedes especificar una acción de finalización para las VM Spot si incluyes también el campo "instanceTerminationAction".
POST https://compute.googleapis.com/compute/beta/projects/PROJECT_ID/zones/ZONE/instances { "machineType": "zones/ZONE/machineTypes/MACHINE_TYPE", "name": "VM_NAME", "disks": [ { "initializeParams": { "sourceImage": "projects/IMAGE_PROJECT/global/images/IMAGE" }, "boot": true } ], "scheduling": { "provisioningModel": "SPOT", "preemptionNoticeDuration": { "seconds": 120 }, "instanceTerminationAction": "TERMINATION_ACTION" } }
Reemplaza lo siguiente:
PROJECT_ID: El ID del proyecto en el que se creará la VM.ZONE: La zona en la que se creará la VM. La zona también debe admitir el tipo de máquina que se usará para la VM nueva.MACHINE_TYPE: Es el tipo de máquina predefinido o personalizado de la VM nueva.VM_NAME: es el nombre de la VM nueva.IMAGE_PROJECT: El proyecto que contiene la imagen. Por ejemplo, si especificasfamily/debian-10como familia de imágenes, especificadebian-cloudcomo proyecto de imagen.IMAGE: Especifica una de las siguientes opciones:- Una versión específica de una imagen pública Por ejemplo, una imagen específica es
"sourceImage": "projects/debian-cloud/global/images/debian-10-buster-v20200309", en la quedebian-cloudesIMAGE_PROJECT. - Es una familia de imágenes.
Esto crea la VM a partir de la imagen de SO no obsoleta más reciente.
Por ejemplo, si especificas
"sourceImage": "projects/debian-cloud/global/images/family/debian-10"en el quedebian-cloudesIMAGE_PROJECT, Compute Engine crea una VM a partir de la versión más reciente de la familia de imágenes de Debian 10.
- Una versión específica de una imagen pública Por ejemplo, una imagen específica es
TERMINATION_ACTION: Opcional: Especifica qué acción de finalización se debe realizar cuando Compute Engine interrumpe la VM, ya seaSTOP(comportamiento predeterminado) oDELETE.
Para obtener más información sobre las opciones que puedes especificar cuando creas una VM, consulta Opciones de configuración durante la creación de instancias.
Crea una VM Spot con hasta 30 segundos para controlar la interrupción (opción predeterminada).
De forma predeterminada, se notifica a una VM Spot sobre la interrupción al comienzo del período de apagado de mejor esfuerzo de 30 segundos, y debes controlar la interrupción dentro de una secuencia de comandos de apagado.
Console
En la consola de Google Cloud , ve a la página Crear una instancia.
En el panel Configuración de la máquina, que está abierto de forma predeterminada, completa los siguientes pasos:
- En la sección Modelo de aprovisionamiento, selecciona Spot en la lista Modelo de aprovisionamiento de VM.
Opcional: Para seleccionar la acción de finalización que se produce cuando Compute Engine interrumpe la VM, completa los siguientes pasos:
- Expande la sección Configuración avanzada del modelo de aprovisionamiento de VMs.
- En la lista Finalización de VM, selecciona una de las siguientes opciones:
- Para detener la VM durante la interrupción, selecciona Detener (predeterminado).
- Para borrar la VM durante la interrupción, selecciona Borrar.
En el menú de navegación, haz clic en Opciones avanzadas. En el panel Avanzado que aparece, completa los siguientes pasos:
- En la sección Metadatos, haz clic en Agregar elemento.
- En el campo Clave, ingresa
shutdown-scriptpara la clave de metadatos. - En el campo Valor, agrega el contenido de una secuencia de comandos de apagado que controle la preferencia. Para ver un ejemplo de secuencia de comandos de apagado, consulta Controla la interrupción en este documento.
Opcional: Especifica otros parámetros de configuración. Para obtener más información, consulta Opciones de configuración durante la creación de instancias.
Para crear y, también, iniciar la VM, haz clic en Crear.
gcloud
Para crear una VM a partir de la CLI de gcloud, usa el comando gcloud compute instances create.
Para crear las Spot VM, debes incluir la marca --provisioning-model=SPOT. Para controlar la interrupción, incluye la marca --metadata shutdown-script para especificar una secuencia de comandos de apagado. De manera opcional, también puedes especificar una acción de finalización para las VMs Spot si incluyes también la marca --instance-termination-action.
gcloud compute instances create VM_NAME \
--provisioning-model=SPOT \
--metadata shutdown-script=SHUTDOWN_SCRIPT \
--instance-termination-action=TERMINATION_ACTION
Reemplaza lo siguiente:
VM_NAME: Nombre de la VM nueva.SHUTDOWN_SCRIPT: Una secuencia de comandos de apagado que puedes formatear como se muestra en Ejecuta secuencias de comandos de apagado Para ver un ejemplo de secuencia de comandos de apagado, consulta Controla la interrupción en este documento.TERMINATION_ACTION: Opcional: Especifica qué acción de finalización se debe realizar cuando Compute Engine interrumpe la VM, ya seaSTOP(comportamiento predeterminado) oDELETE.
Para obtener más información sobre las opciones que puedes especificar cuando creas una VM, consulta Opciones de configuración durante la creación de instancias. Por ejemplo, para crear VM Spot con una imagen y un tipo de máquina especificados, usa el siguiente comando:
gcloud compute instances create VM_NAME \
--provisioning-model=SPOT \
--metadata shutdown-script=SHUTDOWN_SCRIPT \
[--image=IMAGE | --image-family=IMAGE_FAMILY] \
--image-project=IMAGE_PROJECT \
--machine-type=MACHINE_TYPE \
--instance-termination-action=TERMINATION_ACTION \
Reemplaza lo siguiente:
VM_NAME: Nombre de la VM nueva.SHUTDOWN_SCRIPT: Una secuencia de comandos de apagado que controla la preferencia. Para obtener más información sobre cómo dar formato y especificar una secuencia de comandos de apagado, consulta Ejecuta secuencias de comandos de apagado. Para ver un ejemplo de secuencia de comandos de apagado, consulta Controla la interrupción en este documento.IMAGE: Especifica una de las siguientes opciones:IMAGE: Es una versión específica de una imagen pública o la familia de imágenes. Por ejemplo, una imagen específica es--image=debian-10-buster-v20200309.- Es una familia de imágenes.
Esto crea la VM a partir de la imagen de SO no obsoleta más reciente.
Por ejemplo, si especificas
--image-family=debian-10, Compute Engine crea una VM a partir de la última versión de la imagen de SO en la familia de imágenes Debian 10.
IMAGE_PROJECT: es el proyecto que contiene la imagen. Por ejemplo, si especificasdebian-10como familia de imágenes, especificadebian-cloudcomo proyecto de imagen.MACHINE_TYPE: Es el tipo de máquina predefinido o personalizado de la VM nueva.Para obtener una lista de los tipos de máquinas disponibles en una zona, usa el comando
gcloud compute machine-types listcon la marca--zones.TERMINATION_ACTION: Opcional: Especifica qué acción de finalización se debe realizar cuando Compute Engine interrumpe la VM, ya seaSTOP(comportamiento predeterminado) oDELETE.
Terraform
Puedes usar un recurso de Terraform para crear una VM Spot con el bloque scheduling, como se muestra en el siguiente ejemplo.
Para agregar una secuencia de comandos de apagado para controlar la interrupción, también agrega un bloque metadata, como se muestra en Ejecuta secuencias de comandos de apagado.
Para ver un ejemplo de secuencia de comandos de apagado, consulta Controla la interrupción en este documento.
REST
Para crear una VM desde la API de Compute Engine, usa el método instances.insert:
Debes especificar un tipo de máquina y un nombre para la VM. De manera opcional, también puedes especificar una imagen para el disco de arranque.
Para crear VM Spot, debes incluir el campo "provisioningModel": spot.
Para controlar la interrupción, también incluye el campo "metadata" y especifica una secuencia de comandos de apagado.
De manera opcional, también puedes especificar una acción de finalización para las VMs Spot si incluyes también el campo "instanceTerminationAction".
POST https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/zones/ZONE/instances { "machineType": "zones/ZONE/machineTypes/MACHINE_TYPE", "name": "VM_NAME", "disks": [ { "initializeParams": { "sourceImage": "projects/IMAGE_PROJECT/global/images/IMAGE" }, "boot": true } ], "scheduling": { "provisioningModel": "SPOT", "instanceTerminationAction": "TERMINATION_ACTION" }, "metadata": { "items": [ { "key": "shutdown-script", "value": "SHUTDOWN_SCRIPT" } ] } }
Reemplaza lo siguiente:
PROJECT_ID: El ID del proyecto en el que se creará la VM.ZONE: La zona en la que se creará la VM. La zona también debe admitir el tipo de máquina que se usará para la VM nueva.MACHINE_TYPE: Es el tipo de máquina predefinido o personalizado de la VM nueva.VM_NAME: es el nombre de la VM nueva.IMAGE_PROJECT: El proyecto que contiene la imagen. Por ejemplo, si especificasfamily/debian-10como familia de imágenes, especificadebian-cloudcomo proyecto de imagen.IMAGE: Especifica una de las siguientes opciones:- Una versión específica de una imagen pública Por ejemplo, una imagen específica es
"sourceImage": "projects/debian-cloud/global/images/debian-10-buster-v20200309", en la quedebian-cloudesIMAGE_PROJECT. - Es una familia de imágenes.
Esto crea la VM a partir de la imagen de SO no obsoleta más reciente.
Por ejemplo, si especificas
"sourceImage": "projects/debian-cloud/global/images/family/debian-10"en el quedebian-cloudesIMAGE_PROJECT, Compute Engine crea una VM a partir de la versión más reciente de la familia de imágenes de Debian 10.
- Una versión específica de una imagen pública Por ejemplo, una imagen específica es
TERMINATION_ACTION: Opcional: Especifica qué acción de finalización se debe realizar cuando Compute Engine interrumpe la VM, ya seaSTOP(comportamiento predeterminado) oDELETE.SHUTDOWN_SCRIPT: Una secuencia de comandos de apagado que controla la preferencia. Para obtener más información sobre cómo dar formato y especificar una secuencia de comandos de apagado, consulta Ejecuta secuencias de comandos de apagado. Para ver un ejemplo de secuencia de comandos de apagado, consulta Controla la interrupción en este documento.
Para obtener más información sobre las opciones que puedes especificar cuando creas una VM, consulta Opciones de configuración durante la creación de instancias.
Go
En el siguiente ejemplo, se crea una VM Spot sin una secuencia de comandos de apagado para controlar la interrupción. Para obtener más información sobre cómo especificar una secuencia de comandos de apagado para una VM nueva o existente, consulta Ejecuta secuencias de comandos de apagado. Para ver un ejemplo de secuencia de comandos de apagado, consulta Controla la interrupción en este documento.
Java
En el siguiente ejemplo, se crea una VM Spot sin una secuencia de comandos de apagado para controlar la interrupción. Para obtener más información sobre cómo especificar una secuencia de comandos de apagado para una VM nueva o existente, consulta Ejecuta secuencias de comandos de apagado. Para ver un ejemplo de secuencia de comandos de apagado, consulta Controla la interrupción en este documento.
Python
En el siguiente ejemplo, se crea una VM Spot sin una secuencia de comandos de apagado para controlar la interrupción. Para obtener más información sobre cómo especificar una secuencia de comandos de apagado para una VM nueva o existente, consulta Ejecuta secuencias de comandos de apagado. Para ver un ejemplo de secuencia de comandos de apagado, consulta Controla la interrupción en este documento.
Inicia VM Spot
Al igual que otras VM, las VM Spot se inician cuando se crean. Del mismo modo, si se detienen las VM Spot, puedes reiniciar las VM para reanudar el estado RUNNING.
Puedes detener y reiniciar las VM Spot interrumpidas tantas veces como desees, siempre que haya capacidad.
Para obtener más información, consulta Ciclo de vida de las instancias de VM.
Si Compute Engine detiene una o más VM Spot en un grupo de instancias administrado (MIG) con ajuste de escala automático o un clúster de Google Kubernetes Engine (GKE), el grupo reinicia las VM cuando los recursos vuelven a estar disponibles.
Identifica el modelo de aprovisionamiento y la acción de finalización de una VM
Identifica el modelo de aprovisionamiento de una VM para ver si es una VM estándar, una VM Stock o una VM interrumpible. Para una VM Spot, también puedes identificar la acción de finalización. Puedes identificar el modelo de aprovisionamiento y la acción de finalización de una VM con laGoogle Cloud consola, gcloud CLI o la API de Compute Engine.
Console
Ve a la página Instancias de VM.
Haz clic en el nombre de la VM que deseas identificar. Se abrirá la página Detalles de instancia de VM.
Ve a la sección Administración en la parte inferior de la página. En la subsección Políticas de disponibilidad, verifica las siguientes opciones:
- Si el modelo de aprovisionamiento de VM está configurado como Spot, la VM es Spot.
- Cuando se finaliza la VM indica qué acción se debe realizar cuando Compute Engine interrumpe la VM, ya sea Detener o Borrar la VM.
- De lo contrario, si el modelo de aprovisionamiento de VM se configura como Estándar o —:
- Si la opción Interrumpible está configurada como Activado, la VM es interrumpible.
- De lo contrario, la VM es estándar.
- Si el modelo de aprovisionamiento de VM está configurado como Spot, la VM es Spot.
gcloud
Para describir una VM a partir de la CLI de gcloud, usa el comando gcloud compute instances describe:
gcloud compute instances describe VM_NAME
En el comando anterior, VM_NAME es el nombre de la VM que deseas verificar.
En el resultado, verifica el campo scheduling para identificar la VM:
Si el resultado incluye el campo
provisioningModelconfigurado comoSPOT, que es similar a lo siguiente, la VM es Spot.... scheduling: ... provisioningModel: SPOT instanceTerminationAction: TERMINATION_ACTION ...
En el ejemplo anterior,
TERMINATION_ACTIONindica qué acción se debe realizar cuando Compute Engine interrumpe la VM, ya sea detenerla (STOP) o borrarla (DELETE). Si falta el campoinstanceTerminationAction, el valor predeterminado esSTOP.De lo contrario, si el resultado incluye el campo
provisioningModelconfigurado comostandardo si el resultado omite el campoprovisioningModel:- Si el resultado incluye el campo
preemptibleconfigurado comotrue, la VM es interrumpible. - De lo contrario, la VM es estándar.
- Si el resultado incluye el campo
REST
Para describir una VM desde la API de Compute Engine, usa el método instances.get:
GET https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/zones/ZONE/instances/VM_NAME
Reemplaza lo siguiente:
PROJECT_ID: El ID del proyecto en el que se encuentra la VM.ZONE: la zona en la que se encuentra la VMVM_NAME: el nombre de la VM que deseas verificar.
En el resultado, verifica el campo scheduling para identificar la VM:
Si el resultado incluye el campo
provisioningModelconfigurado comoSPOT, que es similar a lo siguiente, la VM es Spot.{ ... "scheduling": { ... "provisioningModel": "SPOT", "instanceTerminationAction": "TERMINATION_ACTION" ... }, ... }En el ejemplo anterior,
TERMINATION_ACTIONindica qué acción se debe realizar cuando Compute Engine interrumpe la VM, ya sea detenerla (STOP) o borrarla (DELETE). Si falta el campoinstanceTerminationAction, el valor predeterminado esSTOP.De lo contrario, si el resultado incluye el campo
provisioningModelconfigurado comostandardo si el resultado omite el campoprovisioningModel:- Si el resultado incluye el campo
preemptibleconfigurado comotrue, la VM es interrumpible. - De lo contrario, la VM es estándar.
- Si el resultado incluye el campo
Go
Java
Python
Administra la interrupción de una VM Spot
Para aprender a administrar la interrupción de una VM Spot, consulta las siguientes secciones:
- Controla la interrupción.
- Detecta la interrupción de las VMs Spot.
- Prueba la configuración de interrupción.
Cómo controlar la interrupción
Cuando Compute Engine comienza a interrumpir una VM Spot, puedes intentar realizar acciones de limpieza antes de que la VM termine de cerrarse. El control de la preferencia puede incluir la detención correcta de un proceso en ejecución y la transferencia del estado de tu carga de trabajo.
Puedes usar los siguientes métodos para controlar la interrupción de una VM Spot:
- Controla la interrupción dentro de tu carga de trabajo. Recomendamos este método para las VMs Spot con una duración de aviso previo a la interrupción de 120 segundos (versión preliminar). Específicamente, dentro de tu carga de trabajo, configura el código para controlar la preferencia hasta que comience la preferencia, como se explica en Cómo detectar la preferencia en una VM. Luego, el código para controlar la interrupción se ejecuta durante la duración del aviso de interrupción. (De manera opcional, estas VMs también pueden especificar una secuencia de comandos de apagado, que se ejecuta durante un período de apagado).
- Controla la interrupción con una secuencia de comandos de apagado. Recomendamos este método para las VMs Spot sin una duración de notificación previa a la interrupción, que es la configuración predeterminada. Específicamente, configura tu código para controlar la apropiación previa en una secuencia de comandos de cierre, como se muestra en el siguiente ejemplo. La secuencia de comandos de apagado se ejecuta automáticamente durante un máximo de 30 segundos durante el período de apagado de mejor esfuerzo para cualquier tipo de apagado. Por lo tanto, es posible que desees configurar el código para controlar la interrupción de modo que solo se ejecute si se interrumpe la VM, como se explica en Cómo detectar la interrupción dentro de una VM.
En el siguiente ejemplo, se muestra cómo controlar la preferencia subiendo un archivo de punto de control a un bucket de Cloud Storage dentro de una secuencia de comandos de apagado y cómo agregar una secuencia de comandos de apagado mientras se crea o actualiza una VM Spot. Esta secuencia de comandos se ejecuta cuando la VM comienza a apagarse, antes de que el comando kill normal del sistema operativo detenga todos los procesos restantes. Después de detener de forma correcta un programa especificado, 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_USER"
CHECKPOINT="/home/$MY_USER/checkpoint.out"
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 "gcloud storage cp $CHECKPOINT gs://${BUCKET_NAME}/"
echo "Done uploading, shutting down."
Esta secuencia de comandos supone lo siguiente:
La VM se creó, como mínimo, con acceso de lectura/escritura a Cloud Storage como mínimo. Para obtener instrucciones sobre cómo crear una VM con los permisos adecuados, consulta la documentación sobre autenticación.
Tienes un bucket de Cloud Storage existente y permiso para escribir en él.
Si quieres agregar esta secuencia de comandos a una VM, configúrala para que funcione con la carga de trabajo en tu VM y agrégala a los metadatos de la VM.
Copia o descarga la secuencia de comandos de apagado:
Copia la secuencia de comandos de apagado anterior después de reemplazar lo siguiente:
PROGRAM_NAMEes el nombre del proceso o programa que quieres cerrar. Por ejemplo,apache2onginx.LOCAL_USERes el nombre de usuario con el que accediste a la máquina virtual.BUCKET_NAMEes el nombre del bucket de Cloud Storage en el que quieres guardar el archivo de punto de control del programa. Ten en cuenta que el nombre del bucket no comienza congs://en este caso.
Descarga la secuencia de comandos de apagado en tu estación de trabajo local y, luego, reemplaza las siguientes variables en el archivo:
[PROGRAM_NAME]es el nombre del proceso o programa que quieres cerrar. Por ejemplo,apache2onginx.[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 depósito no comienza congs://en este caso.
Agrega la secuencia de comandos de apagado a una VM nueva o a una VM existente.
Detecta la interrupción de las VM Spot
En las siguientes secciones, se explican los métodos que puedes usar para detectar la interrupción de las VMs de Spot.
- Detecta la interrupción dentro de una VM: Por ejemplo, usa este método para verificar la interrupción dentro de una secuencia de comandos de apagado o para activar el control de interrupciones para las VMs Spot con una duración de aviso de interrupción de 120 segundos (vista previa).
- Ver operaciones de interrupción: Por ejemplo, usa este método cuando quieras determinar por qué se apagaron las VMs Spot.
Detecta la interrupción dentro de una VM
Para detectar si se está interrumpiendo una VM desde el interior de la VM, verifica el servidor de metadatos del valor preempted en los metadatos predeterminados de tu VM. Por ejemplo, usa los siguientes métodos:
Verifica el valor actual de
preempted. Puedes ejecutar el siguiente comandocurldesde tu VM para obtener el valor actual depreempted:curl "http://metadata.google.internal/computeMetadata/v1/instance/preempted" -H "Metadata-Flavor: Google" TRUESi este valor es
TRUE, Compute Engine interrumpió la VM; de lo contrario, esFALSE. Por ejemplo, usa este comando dentro de una secuencia de comandos de apagado para verificar si el apagado se debió a una interrupción o no.Espera hasta que
preemptedseaTRUE. Para esperar hasta quepreemptedseaTRUE, puedes agregar?wait_for_change=truea la URL del comando anterior. Este comando realiza una solicitud HTTP GET pendiente que solo se muestra cuando cambian los metadatos y se reemplaza la VM.curl "http://metadata.google.internal/computeMetadata/v1/instance/preempted?wait_for_change=true" -H "Metadata-Flavor: Google" TRUEEste comando es útil cuando deseas activar el control de interrupciones fuera de una secuencia de comandos de apagado. Por ejemplo, usa este método para activar el control de interrupciones para las VMs Spot con una duración de aviso de interrupción de 120 segundos (vista previa).
Cómo ver las operaciones de interrupción
Puedes ver las operaciones de interrupción de Compute Engine conGoogle Cloud console, la gcloud CLI o la API de Compute Engine.
Console
Para verificar si se interrumpió una VM, consulta los registros de actividad del sistema.
En la consola de Google Cloud , ve a la página Registros.
Selecciona el proyecto y haz clic en Continuar.
Agrega
compute.instances.preemptedal filtro por etiqueta o campo de búsqueda de texto.De forma alternativa, también puedes ingresar un nombre de VM si quieres ver las operaciones de interrupción de una VM específica.
Presiona Intro para aplicar los filtros especificados. La Google Cloud consola actualiza la lista de registros para mostrar solo las operaciones en las que se interrumpió una VM.
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"
De forma opcional, puedes usar parámetros de filtro adicionales 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, usa el siguiente comando:
gcloud compute operations list \
--filter="operationType=compute.instances.preempted AND targetLink:instances/BASE_INSTANCE_NAME"
En el ejemplo anterior, BASE_INSTANCE_NAME es el nombre base especificado como un prefijo para los nombres de todas las VM en este grupo de instancias administrado.
El resultado es similar a este:
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 de VM se interrumpió. Puedes usar el comando gcloud compute operations describe para obtener más información sobre una operación de interrupción específica.
gcloud compute operations describe SYSTEM_EVENT \
--zone=ZONE
Reemplaza lo siguiente:
SYSTEM_EVENT: el evento del sistema del resultado del comandogcloud compute operations list, por ejemplo,systemevent-xxxxxxxx.ZONE: la zona del evento del sistema, por ejemplo,us-central1-f.
El resultado es similar a este:
... operationType: compute.instances.preempted progress: 100 selfLink: https://compute.googleapis.com/compute/v1/projects/my-project/zones/us-central1-f/operations/systemevent-xxxxxxxx startTime: '2015-04-02T12:12:10.881-07:00' status: DONE statusMessage: Instance was preempted. ...
REST
A fin de obtener una lista de las operaciones del sistema recientes para un proyecto y una zona específicos, usa el método zoneOperations.get.
GET https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/zones/ZONE/operations
Reemplaza lo siguiente:
PROJECT_ID: Un ID del proyecto.ZONE: Una zona.
Opcional, 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"
De manera alternativa, si quieres ver las operaciones de interrupción de una VM 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/VM_NAME
Reemplaza lo siguiente:
+ PROJECT_ID: el ID del proyecto.
+ ZONE: la zona.
+ VM_NAME: el nombre de una VM específica en esta zona y este proyecto.
La respuesta contiene una lista de operaciones recientes. Por ejemplo, una interrupción es similar a la siguiente:
{
"kind": "compute#operation",
"id": "15041793718812375371",
"name": "systemevent-xxxxxxxx",
"zone": "https://www.googleapis.com/compute/v1/projects/my-project/zones/us-central1-f",
"operationType": "compute.instances.preempted",
"targetLink": "https://www.googleapis.com/compute/v1/projects/my-project/zones/us-central1-f/instances/example-instance",
"targetId": "12820389800990687210",
"status": "DONE",
"statusMessage": "Instance was preempted.",
...
}
Prueba la configuración de interrupción
Puedes ejecutar eventos de mantenimiento simulados en tus VMs de Spot para forzarlas a interrumpirse. Usa esta función para probar cómo tus cargas de trabajo detectan y controlan la interrupción. Para obtener información sobre cómo probar los eventos de mantenimiento en tus instancias, consulta Simula un evento de mantenimiento de host.
Prácticas recomendadas
Estas son algunas de las prácticas recomendadas para ayudarte a aprovechar al máximo las VM Spot.
Usa plantillas de instancias. En lugar de crear VM Spot una a la vez, puedes usar plantillas de instancias para crear varias VM Spot con las mismas propiedades. Las plantillas de instancias son necesarias para usar los MIG. De manera alternativa, también puedes crear varias VM Spot con la API de instancia masiva.
Usa MIG para distribuir y volver a crear automáticamente las VM Spot. Usa MIG para hacer que las cargas de trabajo en las VM Spot sean más flexibles y resilientes. Por ejemplo, usa MIG regionales para distribuir VM en varias zonas, lo que ayuda a mitigar los errores de disponibilidad de recursos. Además, usa la reparación automática para volver a crear de forma automática las VM Spot después de que se interrumpen.
Elige tipos de máquina más pequeños. Los recursos de VM Spot se obtienen del exceso y la capacidad de copia de seguridad Google Cloud . La capacidad de las VMs Spot suele ser más fácil de obtener en tipos de máquinas más pequeños, es decir, tipos de máquinas con menos recursos, como la memoria y las CPU virtuales. Puedes encontrar más capacidad para las VM Spot si seleccionas un tipo personalizado de máquina más pequeño, pero la capacidad es aún más probable para tipos predefinidos de máquinas más pequeños. Por ejemplo, en comparación con la capacidad del tipo predefinido de máquina
n2-standard-32, la capacidad para el tipo personalizado de máquinan2-custom-24-96es más probable, pero la capacidad para el tipo predefinido de máquinan2-standard-16es aún más probable.Ejecuta clústeres grandes de VM Spot durante las horas de menor actividad. La carga en los Google Cloud centros de datos varía según la ubicación y la hora del día, pero, por lo general, es más baja durante las noches y los fines de semana. En este sentido, a la noche y en los fines de semana son los mejores momentos para ejecutar clústeres grandes de VM Spot.
Diseña tus cargas de trabajo 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 VM Spot a fin de dejar lugar para las VM estándar 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 carga de trabajo da por hecho que las interrupciones siempre se hacen en grupos pequeños, es posible que no estés preparado para tal evento.
Intenta crear las VM Spot que se interrumpiron. Si se interrumpieron tus VM Spot, intenta crear VM nuevas una o dos veces antes de volver a las VM estándar. Según tus requisitos, puede ser una buena idea combinar VM estándar y VM Spot 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
- Conéctate a tu instancia de VM.
- Obtén más información sobre las secuencias de comandos de apagado.
- Obtén más información sobre cómo limitar el entorno de ejecución de una VM.
- Obtén información sobre las plantillas de instancias.
- Obtén información sobre los MIG.