Crear y usar VM Spot

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 VMs Spot son instancias de máquina virtual (VM) que usan el modelo de aprovisionamiento spot. Las VMs Spot están disponibles con un descuento de hasta el 60% del precio según demanda de las VMs estándar. Para obtener más información, consulta la página de precios. Sin embargo, Compute Engine podría reclamar 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.

Antes de comenzar

  • Lee sobre las VMs Spot, en especial las limitaciones.
  • Verifica que tengas suficiente cuota para los recursos que deseas solicitar. Para obtener más información, consulta Cuotas de asignación.
  • 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

    1. Instala Google Cloud CLI. Después de la instalación, inicializa Google Cloud CLI con el siguiente comando:

      gcloud init

      Si 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.
  • 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.

    1. Instala Google Cloud CLI.

    2. Si usas un proveedor de identidad (IdP) externo, primero debes acceder a gcloud CLI con tu identidad federada.

    3. Si usas una 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 muestra un error de autenticación y usas un proveedor de identidad (IdP) externo, confirma que accediste a la gcloud CLI con tu identidad federada.

    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 .

Roles obligatorios

Para obtener los permisos que necesitas para crear una VM Spot, pídele a tu administrador que te otorgue el rol de IAM Administrador de instancias de Compute (v1) (roles/compute.instanceAdmin.v1) en el proyecto. Para obtener más información sobre cómo otorgar roles, consulta Administra el acceso a proyectos, carpetas y organizaciones.

Este rol predefinido contiene los permisos necesarios para crear una VM Spot. Para ver los permisos exactos que son necesarios, expande la sección Permisos requeridos:

Permisos necesarios

Se requieren los siguientes permisos para crear una VM Spot:

  • compute.instances.create en el proyecto
  • Si deseas usar una imagen personalizada para crear la VM, sigue estos pasos: compute.images.useReadOnly en la imagen
  • Para usar una instantánea a fin de crear la VM, haz lo siguiente: compute.snapshots.useReadOnly en la instantánea
  • Si quieres usar una plantilla de instancias para crear la VM, sigue estos pasos: compute.instanceTemplates.useReadOnly en la plantilla de instancias
  • A fin de especificar una subred para tu VM: compute.subnetworks.use en el proyecto o en la subred elegida
  • Si deseas especificar una dirección IP estática para la VM: compute.addresses.use en el proyecto
  • Para asignar una dirección IP externa a la VM cuando se usa una red de VPC, compute.subnetworks.useExternalIp en el proyecto o en la subred elegida.
  • Para asignar una red heredada a la VM, ejecuta compute.networks.use en el proyecto.
  • Para asignar una dirección IP externa a la VM cuando se usa una red heredada, ejecuta compute.networks.useExternalIp en el proyecto
  • Para configurar los metadatos de la instancia de VM para la VM, compute.instances.setMetadata en el proyecto.
  • Para configurar etiquetas en la VM, haz lo siguiente: compute.instances.setTags en la VM
  • Para configurar etiquetas en la VM, haz lo siguiente: compute.instances.setLabels en la VM
  • A fin de configurar una cuenta de servicio para que la VM use: compute.instances.setServiceAccount en la VM
  • Crear un disco nuevo para la VM: compute.disks.create en el proyecto
  • Para conectar un disco existente en modo de solo lectura o de lectura y escritura, usa compute.disks.use en el disco.
  • Para conectar un disco existente en modo de solo lectura, haz lo siguiente: compute.disks.useReadOnly en el disco

También puedes obtener estos permisos con roles personalizados o con otros roles predefinidos.

Preparación para crear VMs Spot

Antes de crear VMs de instancias interrumpibles para una carga de trabajo, completa los siguientes pasos:

  1. Configura tu carga de trabajo para administrar la preferencia. Específicamente, te recomendamos que prepares una secuencia de comandos para controlar la interrupción que se ejecute como parte de tu carga de trabajo o que sea un archivo que puedas agregar en los metadatos de la VM para que se ejecute durante el apagado. Para obtener instrucciones, consulta Administra la interrupción de VMs Spot.

  2. Te recomendamos que consultes los datos de las VMs Spot para ayudarte a elegir un tipo de máquina y una ubicación. Si seleccionas un tipo de máquina y una ubicación con una mayor disponibilidad de recursos, puedes aumentar las probabilidades de evitar errores de disponibilidad de recursos y de tener un tiempo de actividad más prolongado antes de la interrupción.

  3. Selecciona un método para crear VMs Spot. Te recomendamos que selecciones un método de la siguiente manera:

    Para obtener más información sobre las recomendaciones para crear VMs Spot, consulta las prácticas recomendadas.

Crea una VM Spot

Después de prepararte para crear VMs Spot, puedes crear una con uno de los siguientes métodos.

Console

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

    Ir a Crear una instancia

  2. En el panel Configuración de la máquina, que está abierto de forma predeterminada, completa los siguientes pasos:

    1. En la sección Modelo de aprovisionamiento, selecciona Spot en la lista Modelo de aprovisionamiento de VM. Se expandirá la sección Configuración avanzada del modelo de aprovisionamiento de VMs.
    2. En la lista Duración del aviso de interrupción, selecciona una opción según cómo quieras controlar la interrupción.

      • Si seleccionas 120 segundos, asegúrate de controlar la interrupción dentro de tu carga de trabajo antes de crear una VM Spot. Por ejemplo, verifica que tu carga de trabajo incluya una secuencia de comandos para guardar tu progreso que espere a ejecutarse hasta que se detecte la preferencia.

      • Si seleccionas 0 segundos (predeterminado), asegúrate de controlar la interrupción con una secuencia de comandos de apagado. Antes de crear una VM Spot, crea un archivo que contenga una secuencia de comandos de apagado que guarde tu progreso cuando la interrupción se deba a la preferencia. Adjunta esta secuencia de comandos de apagado como se explica en un paso posterior.

    3. Opcional: Para elegir la acción de finalización que se produce cuando Compute Engine interrumpe la VM, en la lista Cuando se finaliza la 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.
  3. Para agregar una secuencia de comandos de apagado, completa los siguientes pasos. Si seleccionaste 0 segundos (predeterminado) para la Duración del aviso de interrupción, este paso es obligatorio para controlar la interrupción. De lo contrario, si seleccionaste 120 segundos, este paso es opcional.

    1. En el menú de navegación, haz clic en Opciones avanzadas.
    2. En la sección Metadatos, haz clic en Agregar elemento.
    3. En el campo Clave, ingresa shutdown-script para la clave de metadatos.
    4. 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 Ejemplo de control de interrupción en este documento.
  4. Opcional: Especifica otras opciones de configuración. Para obtener más información, consulta Opciones de configuración durante la creación de instancias.

  5. Para crear y, también, iniciar la VM, haz clic en Crear.

gcloud

Para crear una VM con gcloud CLI, usa el comando gcloud compute instances create. Cada vez que crees una VM, te recomendamos que especifiques un tipo de máquina, una ubicación y imagen de SO.

Para crear una VM Spot, incluye la marca --provisioning-model=SPOT. Para especificar la duración del aviso de interrupción, incluye la marca --preemption-notice-duration y, si es necesario, 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 \
    --machine-type=MACHINE_TYPE \
    --zone=ZONE \
    --image-family=IMAGE_FAMILY \
    --image-project=IMAGE_PROJECT \
    --provisioning-model=SPOT \
    --instance-termination-action=TERMINATION_ACTION \
    --preemption-notice-duration=PREEMPTION_NOTICE_DURATION \
    --metadata shutdown-script=SHUTDOWN_SCRIPT

Reemplaza lo siguiente:

  • VM_NAME: Nombre de la VM nueva.

  • MACHINE_TYPE: Es el tipo de máquina predefinido o personalizado de la VM nueva.

  • 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.

  • IMAGE_FAMILY: Es una familia de imágenes. Esto especifica la imagen de SO no obsoleta más reciente. Por ejemplo, si especificas debian-13, se usa la versión más reciente de la familia de imágenes de Debian 13. Para obtener más información sobre el uso de las familias de imágenes, consulta Prácticas recomendadas para las familias de imágenes.

  • IMAGE_PROJECT: es el proyecto que contiene la imagen. Por ejemplo, si especificas debian-13 como familia de imágenes, especifica debian-cloud como proyecto de imagen.

  • TERMINATION_ACTION: Opcional: Especifica qué acción de finalización se debe realizar cuando Compute Engine interrumpe la VM, ya sea STOP (comportamiento predeterminado) o DELETE.

  • PREEMPTION_NOTICE_DURATION: Indica si se debe habilitar una duración del aviso de interrupción. Para gcloud CLI, el valor debe ser 120s o 0s.

    • Si especificas 120s, controla la preferencia dentro de tu carga de trabajo. (De manera opcional, también puedes especificar una secuencia de comandos de cierre).

    • Si especificas 0s (predeterminado), controla la interrupción dentro de una secuencia de comandos de apagado.

  • SHUTDOWN_SCRIPT: Es una secuencia de comandos de cierre.

    • Si estableces PREEMPTION_NOTICE_DURATION en 0s (valor predeterminado), debes especificar una secuencia de comandos de apagado para controlar 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.

    • De lo contrario, si no quieres especificar una secuencia de comandos de apagado, puedes quitar la marca --metadata shutdown-script.

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, agrega también 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.


resource "google_compute_instance" "spot_vm_instance" {
  name         = "spot-instance-name"
  machine_type = "f1-micro"
  zone         = "us-central1-c"

  boot_disk {
    initialize_params {
      image = "debian-cloud/debian-13"
    }
  }

  scheduling {
    preemptible                 = true
    automatic_restart           = false
    provisioning_model          = "SPOT"
    instance_termination_action = "STOP"
  }

  network_interface {
    # A default network is created for all GCP projects
    network = "default"
    access_config {
    }
  }
}

Si deseas obtener más información para aplicar o quitar una configuración de Terraform, consulta los comandos básicos de Terraform.

REST

Para crear una VM con la API de Compute Engine, usa el método instances.insert. Cada vez que crees una VM, te recomendamos que especifiques un tipo de máquina, una ubicación y imagen de SO.

Para crear una VM Spot, debes incluir el campo "provisioningModel": "SPOT". Para especificar la duración del aviso de interrupción, incluye el campo preemptionNoticeDuration. De manera opcional, también puedes especificar una acción de finalización para las VMs Spot si incluyes 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",
     "preemptionNoticeDuration": { "seconds": PREEMPTION_NOTICE_DURATION }
 },
"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 especificas family/debian-13 como familia de imágenes, especifica debian-cloud como 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-13-trixie-v20260908", en la que debian-cloud es IMAGE_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-13" en el que debian-cloud es IMAGE_PROJECT, Compute Engine crea una VM a partir de la versión más reciente de la familia de imágenes de Debian 13.
  • TERMINATION_ACTION: Opcional: Especifica qué acción de finalización se debe realizar cuando Compute Engine interrumpe la VM, ya sea STOP (comportamiento predeterminado) o DELETE.

  • PREEMPTION_NOTICE_DURATION: Indica si se debe habilitar una duración del aviso de interrupción. En el caso de REST, el valor debe ser 120 o 0.

    • Si especificas 120, controla la preferencia dentro de tu carga de trabajo. (De manera opcional, también puedes especificar una secuencia de comandos de cierre).

    • Si especificas 0 (predeterminado), controla la interrupción dentro de una secuencia de comandos de apagado.

  • SHUTDOWN_SCRIPT: Es una secuencia de comandos de cierre.

    • Si estableces PREEMPTION_NOTICE_DURATION en 0 (valor predeterminado), debes especificar una secuencia de comandos de apagado para controlar 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 Ejemplo de control de interrupción en este documento.

    • De lo contrario, si no quieres especificar una secuencia de comandos de apagado, puedes quitar el campo metadata y sus subcampos.

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.

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, la gcloud CLI o la API de Compute Engine.

Console

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

    Ir a la página Instancias de VM

  2. Haz clic en el nombre de la VM que deseas identificar. Se abrirá la página Detalles de instancia de VM.

  3. 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 una VM 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.

gcloud

Para describir una VM a partir de gcloud CLI, 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 provisioningModel configurado como SPOT, que es similar a lo siguiente, la VM es VM Spot.

    ...
    scheduling:
    ...
    provisioningModel: SPOT
    instanceTerminationAction: TERMINATION_ACTION
    ...
    

    En el ejemplo anterior, TERMINATION_ACTION indica qué acción se debe realizar cuando Compute Engine interrumpe la VM, ya sea detenerla (STOP) o borrarla (DELETE). Si falta el campo instanceTerminationAction, el valor predeterminado es STOP.

  • De lo contrario, si el resultado incluye el campo provisioningModel configurado como standard o si el resultado omite el campo provisioningModel:

    • Si el resultado incluye el campo preemptible configurado como true, la VM es interrumpible.
    • De lo contrario, la VM es estándar.

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 VM
  • VM_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 provisioningModel configurado como SPOT, que es similar a lo siguiente, la VM es VM Spot.

    {
      ...
      "scheduling":
      {
         ...
         "provisioningModel": "SPOT",
         "instanceTerminationAction": "TERMINATION_ACTION"
         ...
      },
      ...
    }
    

    En el ejemplo anterior, TERMINATION_ACTION indica qué acción se debe realizar cuando Compute Engine interrumpe la VM, ya sea detenerla (STOP) o borrarla (DELETE). Si falta el campo instanceTerminationAction, el valor predeterminado es STOP.

  • De lo contrario, si el resultado incluye el campo provisioningModel configurado como standard o si el resultado omite el campo provisioningModel:

    • Si el resultado incluye el campo preemptible configurado como true, la VM es interrumpible.
    • De lo contrario, la VM es estándar.

Go


import (
	"context"
	"fmt"
	"io"

	compute "cloud.google.com/go/compute/apiv1"
	"cloud.google.com/go/compute/apiv1/computepb"
)

// isSpotVM checks if a given instance is a Spot VM or not.
func isSpotVM(w io.Writer, projectID, zone, instanceName string) (bool, error) {
	// projectID := "your_project_id"
	// zone := "europe-central2-b"
	// instanceName := "your_instance_name"
	ctx := context.Background()
	client, err := compute.NewInstancesRESTClient(ctx)
	if err != nil {
		return false, fmt.Errorf("NewInstancesRESTClient: %w", err)
	}
	defer client.Close()

	req := &computepb.GetInstanceRequest{
		Project:  projectID,
		Zone:     zone,
		Instance: instanceName,
	}

	instance, err := client.Get(ctx, req)
	if err != nil {
		return false, fmt.Errorf("GetInstance: %w", err)
	}

	isSpot := instance.GetScheduling().GetProvisioningModel() == computepb.Scheduling_SPOT.String()

	var isSpotMessage string
	if !isSpot {
		isSpotMessage = " not"
	}
	fmt.Fprintf(w, "Instance %s is%s spot\n", instanceName, isSpotMessage)

	return instance.GetScheduling().GetProvisioningModel() == computepb.Scheduling_SPOT.String(), nil
}

Java


import com.google.cloud.compute.v1.Instance;
import com.google.cloud.compute.v1.InstancesClient;
import com.google.cloud.compute.v1.Scheduling;
import java.io.IOException;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.TimeoutException;

public class CheckIsSpotVm {
  public static void main(String[] args)
          throws IOException, ExecutionException, InterruptedException, TimeoutException {
    // TODO(developer): Replace these variables before running the sample.
    // Project ID or project number of the Google Cloud project you want to use.
    String projectId = "your-project-id";
    // Name of the virtual machine to check.
    String instanceName = "your-route-name";
    // Name of the zone you want to use. For example: "us-west3-b"
    String zone = "your-zone";

    boolean isSpotVm = isSpotVm(projectId, instanceName, zone);
    System.out.printf("Is %s spot VM instance - %s", instanceName, isSpotVm);
  }

  // Check if a given instance is Spot VM or not.
  public static boolean isSpotVm(String projectId, String instanceName, String zone)
          throws IOException {
    // Initialize client that will be used to send requests. This client only needs to be created
    // once, and can be reused for multiple requests.
    try (InstancesClient client = InstancesClient.create()) {
      Instance instance = client.get(projectId, zone, instanceName);

      return instance.getScheduling().getProvisioningModel()
              .equals(Scheduling.ProvisioningModel.SPOT.name());
    }
  }
}

Python

from google.cloud import compute_v1


def is_spot_vm(project_id: str, zone: str, instance_name: str) -> bool:
    """
    Check if a given instance is Spot VM or not.
    Args:
        project_id: project ID or project number of the Cloud project you want to use.
        zone: name of the zone you want to use. For example: "us-west3-b"
        instance_name: name of the virtual machine to check.
    Returns:
        The Spot VM status of the instance.
    """
    instance_client = compute_v1.InstancesClient()
    instance = instance_client.get(
        project=project_id, zone=zone, instance=instance_name
    )
    return (
        instance.scheduling.provisioning_model
        == compute_v1.Scheduling.ProvisioningModel.SPOT.name
    )

Administra la interrupción de las VMs Spot

Para aprender a administrar la interrupción de las VMs Spot, consulta las siguientes secciones:

Controla 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 apagarse. 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. Para obtener más información sobre cómo elegir dónde controlar la interrupción de tu carga de trabajo, consulta la definición de duración del aviso de interrupción.

  • 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. 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 Detecta la preferencia dentro de una VM. Luego, tu 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 de 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. El script 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.

Ejemplo de manejo de interrupciones

En el siguiente ejemplo de secuencia de comandos, se muestra cómo controlar la interrupción subiendo un archivo de punto de control a un bucket de Cloud Storage. Puedes ejecutar esta secuencia de comandos dentro de tu carga de trabajo o configurarla como una secuencia de comandos de apagado. 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. Después de que la secuencia de comandos finaliza o se agota el tiempo de espera, el comando kill normal del sistema operativo detiene todos los procesos restantes.

#!/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 o escritura a Cloud Storage. 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, luego, agrégala a tu carga de trabajo o a los metadatos de la VM.

  1. Copia o descarga la secuencia de comandos de ejemplo:

    • Copia la secuencia de comandos anterior después de reemplazar lo siguiente:

      • 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 en el que deseas guardar el archivo de punto de control del programa. Ten en cuenta que el nombre del bucket no comienza con gs:// en este caso.
    • Descarga la secuencia de comandos de ejemplo en tu estación de trabajo local. Luego, reemplaza las siguientes variables en el archivo:

      • 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 en el que deseas guardar el archivo de punto de control del programa. Ten en cuenta que el nombre del bucket no comienza con gs:// en este caso.
  2. Configura la detección de interrupciones y agrega la secuencia de comandos según dónde planees controlar la interrupción, ya sea dentro de tu carga de trabajo o dentro de una secuencia de comandos de apagado. Para obtener más información sobre cómo elegir dónde controlar la interrupción de tu carga de trabajo, consulta la definición de duración del aviso de interrupción.

    • Controla la preferencia dentro de tu carga de trabajo: Completa los siguientes pasos.

      1. Configura la secuencia de comandos para que espere hasta que comience la interrupción, como se explica en Cómo detectar la interrupción en una VM.

      2. Agrega el script a tu carga de trabajo.

    • Controla la interrupción con una secuencia de comandos de apagado: Completa los siguientes pasos.

      1. Te recomendamos que configures la secuencia de comandos para que se ejecute solo cuando el apagado se deba a una interrupción, como se explica en Cómo detectar una interrupción en una VM. Por ejemplo, no es necesario que subas un archivo de punto de control cuando se apaga tu VM porque finalizó la carga de trabajo.

      2. 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.
  • 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 para el valor preempted en los metadatos predeterminados de tu VM. Por ejemplo, usa uno o más de los siguientes métodos según dónde planees controlar la preferencia.

  • Si controlas la interrupción en una secuencia de comandos de apagado, verifica el valor actual de preempted. Puedes ejecutar el siguiente comando de curl desde tu VM para obtener el valor actual 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 VM; de lo contrario, es FALSE. Por ejemplo, usa este comando en una secuencia de comandos de apagado para realizar diferentes acciones según si el apagado se debió a una interrupción o no.

  • Si controlas la preferencia dentro de tu carga de trabajo, espera hasta que preempted sea TRUE. Para esperar hasta que preempted sea TRUE, puedes agregar el parámetro de consulta ?wait_for_change=true a la URL del comando anterior. Con este parámetro de consulta, el comando realiza una solicitud HTTP GET pendiente que solo se muestra cuando cambian los metadatos y se interrumpe la VM.

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

    Este 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.

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.

  1. En la consola de Google Cloud , 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 VM si quieres ver las operaciones de interrupción de una VM específica.

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

  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"

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-yyyyyyyy  compute.instances.preempted  us-central1-f/instances/example-instance-yyy  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 comando gcloud compute operations list, por ejemplo, systemevent-yyyyyyyy.
  • 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-yyyyyyyy
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:

De manera opcional, para determinar el alcance de la respuesta y 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-yyyyyyyy",
  "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 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.

  • Ver la disponibilidad de recursos Antes de crear VMs Spot, o si intentas crear VMs Spot, pero sigues encontrando errores de disponibilidad de recursos, puedes ver la disponibilidad de un tipo de máquina en una región o zona específica. Comprobar la disponibilidad de los recursos ayuda a aumentar las posibilidades de crear VMs Spot correctamente. Para obtener instrucciones, consulta Cómo ver la disponibilidad de las VMs Spot.

  • Consulta los datos históricos. Antes de crear VMs Spot, puedes consultar el porcentaje histórico de interrupción y los precios históricos de los tipos de máquinas que quieres que usen tus VMs Spot. Esta información te ayuda a comparar y elegir el tipo de máquina que mejor se adapte a tus necesidades de carga de trabajo y costos. Para obtener instrucciones, consulta Cómo ver la tasa de interrupción y los precios de las VMs 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 mejorar la disponibilidad de recursos y volver a crear automáticamente las VMs Spot. Usa MIG para hacer que las cargas de trabajo en las VM Spot sean más flexibles y resilientes. Por ejemplo, para evitar errores de disponibilidad de recursos, puedes aumentar la flexibilidad de tu carga de trabajo permitiendo lo siguiente:

    Además, los MIG pueden reparar las VMs Spot interrumpidas recreándolas automáticamente.

  • Elige tipos de máquina más pequeños. Los recursos de las VMs 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áquina n2-custom-24-96 es más probable, pero la capacidad para el tipo predefinido de máquina n2-standard-16 es aún más probable.

  • Ejecuta clústeres grandes de VM Spot 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, en general, es más baja por 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 errores 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.

  • Guarda el progreso para mitigar la interrupción. Administra las notificaciones de cierre y de interrupción guardando el progreso de tu carga de trabajo para que pueda continuar donde lo dejó, en lugar de comenzar desde cero. Por ejemplo, guarda el progreso cada vez que se detecte una interrupción, como se explica en Administra la interrupción de las VMs Spot. Para mayor resiliencia, también considera guardar el progreso a intervalos regulares, no solo cuando se detecta la interrupción.

Próximos pasos