Crear una reserva para un solo proyecto


En este documento, se explica cómo crear una reserva de un solo proyecto, que solo pueden consumir las instancias de máquina virtual (VM) del mismo proyecto. Si deseas obtener información sobre las reservas, consulta Reservas para recursos zonales de Compute Engine.

Para conocer otros métodos de creación de reservas, consulta las siguientes páginas:

  • Si tienes compromisos de 1 o 3 años en el proyecto actual, tus recursos reservados reciben de forma automática los descuentos por compromiso de uso aplicables. También puedes crear y adjuntar una reserva a un compromiso cuando compras el compromiso. Para obtener más información, consulta Adjunta reservas a compromisos.

  • Para crear una reserva que pueden usar varios proyectos, consulta Crea una reserva compartida.

Antes de comenzar

  • Revisa los requisitos y las y las restricciones para las reservas.
  • Si aún no lo hiciste, configura la autenticación. La autenticación es el proceso mediante el cual se verifica tu identidad para acceder a los servicios y las API 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:

    Select the tab for how you plan to use the samples on this page:

    Console

    When you use the Google Cloud console to access Google Cloud services and APIs, you don't need to set up authentication.

    gcloud

    1. Install the Google Cloud CLI, then initialize it by running the following command:

      gcloud init
    2. Set a default region and zone.
    3. Terraform

      Para usar las muestras de Terraform de esta página en un entorno de desarrollo local, instala e inicializa gcloud CLI y, luego, configura las credenciales predeterminadas de la aplicación con tus credenciales de usuario.

      1. Install the Google Cloud CLI.
      2. To initialize the gcloud CLI, run the following command:

        gcloud init
      3. If you're using a local shell, then create local authentication credentials for your user account:

        gcloud auth application-default login

        You don't need to do this if you're using Cloud Shell.

      Para obtener más información, consulta Set up authentication for a local development environment.

      REST

      Para usar las muestras de la API de REST en esta página en un entorno de desarrollo local, debes usar las credenciales que proporcionas a la CLI de gcloud.

        Install the Google Cloud CLI, then initialize it by running the following command:

        gcloud init

      Si deseas obtener más información, consulta Autentica para usar REST en la documentación de autenticación de Google Cloud.

Roles obligatorios

Para obtener los permisos que necesitas para crear reservas para un solo proyecto, pídele a tu administrador que te otorgue el rol de IAM de administrador de Compute (roles/compute.admin) 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 reservas de un solo proyecto. Para ver los permisos exactos que son necesarios, expande la sección Permisos requeridos:

Permisos necesarios

Se requieren los siguientes permisos para crear reservas de un solo proyecto:

  • compute.reservations.create en el proyecto
  • Para especificar una plantilla de instancias: usa compute.instanceTemplates.useReadOnly en la plantilla de instancias

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

Crea una reserva de un solo proyecto

Para consumir una reserva, una VM debe tener propiedades que coincidan de forma exacta con esa reserva. Para especificar las propiedades de las VMs que deseas reservar, elige una de las siguientes secciones de este documento:

  • Recomendado: Especifica una plantilla de instancias

    En esta sección, se explica cómo usar una plantilla de instancias para definir las propiedades de una reserva. Con una plantilla de instancias, puedes definir las propiedades de una reserva y las VMs que pueden consumirla en el mismo lugar.

  • Especifica una VM existente

    En esta sección, se explica cómo usar una VM existente para definir las propiedades de una reserva. Si usas las propiedades de una VM existente, puedes crear VMs con propiedades que coincidan con la VM de referencia para consumir la reserva.

  • Especifica las propiedades directamente

    En esta sección, se explica cómo definir directamente las propiedades de una reserva. Este método requiere que te asegures de forma manual de que las propiedades de las VMs y las reservas coincidan exactamente; cualquier propiedad que no coincida evitará el consumo.

De forma predeterminada, las VMs con propiedades que coincidan con una reserva pueden consumirla de forma automática. Si quieres controlar el consumo de reservas, haz una o más de las siguientes acciones:

Además, puedes especificar una política de posición de compactación cuando creas una reserva de un solo proyecto. Una política de posición de compactación especifica que las VMs deben ubicarse lo más cerca posible entre sí para reducir la latencia de red.

Especifica una plantilla de instancias

Para evitar errores cuando creas una reserva mediante la especificación de una plantilla de instancias, asegúrate de lo siguiente:

  • Crea tu reserva en la misma región y zona que los recursos dentro de la plantilla de instancias. Cualquier recurso zonal o regional especificado en una plantilla de instancias (como un tipo de máquina o un volumen de Persistent Disk) restringe el uso de la plantilla en las ubicaciones en las que existen esos recursos. Por ejemplo, si tu plantilla de instancias especifica un volumen de Persistent Disk existente en la zona us-central1-a, solo puedes crear tu reserva en la misma zona. Para verificar si una plantilla existente especifica algún recurso que vincula la plantilla a una región o zona específica, consulta los detalles de la plantilla y busca referencias a recursos regionales o zonales dentro.

  • Si la plantilla de instancias especifica una política de posición compacta, asegúrate de que la plantilla también especifique un tipo de máquina compatible para las políticas de posición compacta. De lo contrario, la creación de la reserva fallará.

Para crear una reserva de un solo proyecto si especificas una plantilla de instancias, selecciona una de las siguientes opciones:

Console

  1. En la consola de Google Cloud, ve a la página Reservas.

    Ir a Reservas

  2. En la pestaña Reservas según demanda (predeterminada), haz clic en Crear reserva.

    Se abrirá la página Crear una reserva.

  3. En Nombre, ingresa un nombre para tu reserva.

  4. En Región y Zona, selecciona dónde deseas reservar los recursos.

  5. En la sección Tipo de recurso compartido, selecciona Local si aún no está seleccionada.

  6. Opcional: Para permitir que una reserva de VMs con GPU sea consumida por trabajos de entrenamiento personalizados o trabajos de predicción en Vertex AI, en la sección Servicios de Google Cloud, selecciona Compartir reserva.

  7. En la sección Usar con instancia de VM, selecciona una de las siguientes opciones:

    • Para permitir que las VMs coincidentes consuman de forma automática esta reserva, selecciona Usar reserva de forma automática si aún no está seleccionada.

    • Para consumir los recursos de esta reserva solo cuando creas VMs coincidentes que se dirigen de forma específica a esta reserva por nombre, elige Seleccionar reserva específica.

  8. En Cantidad de instancias de VM, ingresa la cantidad de VMs que deseas reservar.

  9. En la sección Configuración de la máquina, haz lo siguiente:

    1. Para especificar las propiedades de tus VMs de una plantilla de instancias existente, elige Usar plantilla de instancias.

    2. En el campo Plantilla de instancias, selecciona la plantilla que prefieras. Si eliges una plantilla de instancias regional, solo puedes reservar recursos dentro de la región de la plantilla de instancias.

  10. En la sección Eliminación automática, puedes habilitar la opción de eliminación automática para permitir que Compute Engine borre la reserva en una fecha y hora específicas de forma automática. La eliminación automática de reservas puede ser útil para evitar cargos innecesarios cuando dejas de consumir la reserva.

  11. Para crear la reserva, haz clic en Crear.

    Se abrirá la página Reservas. La creación de la reserva de un solo proyecto puede tomar hasta un minuto en completarse.

gcloud

Para crear una reserva de un solo proyecto, usa el comando gcloud compute reservations create.

Para crear una reserva de un solo proyecto con la especificación de una plantilla de instancias sin marcas opcionales, ejecuta el siguiente comando:

gcloud compute reservations create RESERVATION_NAME \
    --source-instance-template=projects/PROJECT_ID/LOCATION/instanceTemplates/INSTANCE_TEMPLATE_NAME \
    --vm-count=NUMBER_OF_VMS \
    --zone=ZONE

Reemplaza lo siguiente:

  • RESERVATION_NAME: Es el nombre de la reserva que se creará.

  • PROJECT_ID: Es el ID del proyecto en el que deseas reservar los recursos y donde existe la plantilla de instancias.

  • LOCATION: la ubicación de la plantilla de instancias. Especifica uno de los siguientes valores:

    • Para una plantilla de instancias global: global.

    • Para una plantilla de instancias regional: regions/REGION. Reemplaza REGION por la región en la que se encuentra la plantilla de instancias. Si especificas una plantilla de instancias regional, solo puedes reservar VMs dentro de la misma región que la región de la plantilla.

  • INSTANCE_TEMPLATE_NAME: Es nombre de una plantilla de instancias existente. Si la plantilla de instancias especifica un tipo de máquina A3 o una política de posición compacta, debes incluir la marca --require-specific-reservation. Esto indica que solo las VMs que se dirigen a esta reserva de forma específica pueden consumirla. Para obtener más información, consulta Consume las VMs de una reserva específica.

  • NUMBER_OF_VMS: La cantidad de VMs que se reservarán.

  • ZONE: Es la zona en la que se reservarán los recursos.

Por ejemplo, a fin de crear una reserva para diez VMs en la zona us-central1-a mediante la especificación de una plantilla de instancias global, ejecuta el siguiente comando:

gcloud compute reservations create my-reservation \
    --source-instance-template=projects/example-project/global/example-instance-template \
    --vm-count=10 \
    --zone=us-central1-a

De manera opcional, puedes hacer una o más de las siguientes acciones:

  • Para especificar que solo las VMs que se dirigen a esta reserva de forma específica pueden consumirla, incluye la marca --require-specific-reservation.

    gcloud compute reservations create RESERVATION_NAME \
        --source-instance-template=projects/PROJECT_ID/LOCATION/instanceTemplates/INSTANCE_TEMPLATE_NAME \
        --require-specific-reservation \
        --vm-count=NUMBER_OF_VMS \
        --zone=ZONE
    
  • Para permitir que una reserva de VMs de GPU sea consumida por trabajos de entrenamiento personalizados o por trabajos de predicción en Vertex AI, usa el comando gcloud beta compute reservations create con la marca --reservation-sharing-policy=ALLOW_ALL.

    gcloud beta compute reservations create RESERVATION_NAME \
        --source-instance-template=projects/PROJECT_ID/LOCATION/instanceTemplates/INSTANCE_TEMPLATE_NAME \
        --reservation-sharing-policy=ALLOW_ALL \
        --vm-count=NUMBER_OF_VMS \
        --zone=ZONE
    
  • Para permitir que Compute Engine borre automáticamente la reserva, selecciona uno de los siguientes métodos:

    • Para borrar la reserva en una fecha y hora específicas, usa el comando gcloud beta compute reservations create con la marca --delete-at-time.

      gcloud beta compute reservations create RESERVATION_NAME \
          --delete-at-time=DELETE_AT_TIME \
          --source-instance-template=projects/PROJECT_ID/LOCATION/instanceTemplates/INSTANCE_TEMPLATE_NAME \
          --vm-count=NUMBER_OF_VMS \
          --zone=ZONE
      

      Reemplaza DELETE_AT_TIME por una fecha y hora con formato de marca de tiempo RFC 3339, que debe ser de la siguiente manera:none YYYY-MM-DDTHH:MM:SSOFFSET

      Reemplaza lo siguiente:

      • YYYY-MM-DD: una fecha con formato de un año de 4 dígitos, un mes de 2 dígitos y un día de 2 dígitos del mes separado por guiones (-).

      • HH:MM:SS: una hora con formato de hora de 2 dígitos con un formato de 24 horas, minutos de 2 dígitos y segundos de 2 dígitos separados por dos puntos (:).

      • OFFSET: la zona horaria con formato como una compensación del horario universal coordinado (UTC). Por ejemplo, para usar la hora estándar del Pacífico (PST), especifica -08:00. Como alternativa, para no usar compensación, especifica Z.

    • Para borrar la reserva después de una duración específica, usa el comando gcloud beta compute reservations create con la marca --delete-after-duration.

      gcloud beta compute reservations create RESERVATION_NAME \
          --delete-after-duration=DELETE_AFTER_DURATION \
          --source-instance-template=projects/PROJECT_ID/LOCATION/instanceTemplates/INSTANCE_TEMPLATE_NAME \
          --vm-count=NUMBER_OF_VMS \
          --zone=ZONE
      

      Reemplaza DELETE_AFTER_DURATION por una duración en días, horas, minutos o segundos. Por ejemplo, especifica 30m para 30 minutos o 1d2h3m4s para 1 día, 2 horas, 3 minutos y 4 segundos.

Go

import (
	"context"
	"fmt"
	"io"

	compute "cloud.google.com/go/compute/apiv1"
	computepb "cloud.google.com/go/compute/apiv1/computepb"
	"google.golang.org/protobuf/proto"
)

// Creates the reservation from given template in particular zone
func createReservation(w io.Writer, projectID, zone, reservationName, sourceTemplate string) error {
	// projectID := "your_project_id"
	// zone := "us-west3-a"
	// reservationName := "your_reservation_name"
	// template: existing template path. Following formats are allowed:
	//  	- projects/{project_id}/global/instanceTemplates/{template_name}
	//  	- projects/{project_id}/regions/{region}/instanceTemplates/{template_name}
	//  	- https://www.googleapis.com/compute/v1/projects/{project_id}/global/instanceTemplates/instanceTemplate
	//  	- https://www.googleapis.com/compute/v1/projects/{project_id}/regions/{region}/instanceTemplates/instanceTemplate

	ctx := context.Background()
	reservationsClient, err := compute.NewReservationsRESTClient(ctx)
	if err != nil {
		return err
	}
	defer reservationsClient.Close()

	req := &computepb.InsertReservationRequest{
		Project: projectID,
		ReservationResource: &computepb.Reservation{
			Name: proto.String(reservationName),
			Zone: proto.String(zone),
			SpecificReservation: &computepb.AllocationSpecificSKUReservation{
				Count:                  proto.Int64(2),
				SourceInstanceTemplate: proto.String(sourceTemplate),
			},
		},
		Zone: zone,
	}

	op, err := reservationsClient.Insert(ctx, req)
	if err != nil {
		return fmt.Errorf("unable to create reservation: %w", err)
	}

	if err = op.Wait(ctx); err != nil {
		return fmt.Errorf("unable to wait for the operation: %w", err)
	}

	fmt.Fprintf(w, "Reservation created\n")

	return nil
}

Java

import com.google.cloud.compute.v1.AllocationSpecificSKUReservation;
import com.google.cloud.compute.v1.Operation;
import com.google.cloud.compute.v1.Reservation;
import com.google.cloud.compute.v1.ReservationsClient;
import java.io.IOException;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.TimeoutException;

public class CreateReservationForInstanceTemplate {

  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 Cloud project you want to use.
    String projectId = "YOUR_PROJECT_ID";
    // Name of the zone in which you want to create the reservation.
    String zone = "us-central1-a";
    // Name of the reservation you want to create.
    String reservationName = "YOUR_RESERVATION_NAME";
    // The number of virtual machines you want to create.
    int numberOfVms = 3;
    // The URI of the instance template with GLOBAL location
    // to be used for creating the reservation.
    String instanceTemplateUri =
        "projects/YOUR_PROJECT_ID/global/instanceTemplates/YOUR_INSTANCE_TEMPLATE_NAME";
    // The URI of the instance template with REGIONAL location
    // to be used for creating the reservation. For us-central1 region in this case.
    // String instanceTemplateUri =
    // "projects/YOUR_PROJECT_ID/regions/us-central1/instanceTemplates/YOUR_INSTANCE_TEMPLATE_NAME"

    createReservationForInstanceTemplate(
        projectId, reservationName, instanceTemplateUri, numberOfVms, zone);
  }

  // Creates a reservation in a project for the instance template.
  public static Reservation createReservationForInstanceTemplate(
      String projectId, String reservationName, String instanceTemplateUri,
      int numberOfVms, String zone)
      throws IOException, ExecutionException, InterruptedException, TimeoutException {
    // 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 (ReservationsClient reservationsClient = ReservationsClient.create()) {
      Reservation reservation =
          Reservation.newBuilder()
              .setName(reservationName)
              .setZone(zone)
              .setSpecificReservation(
                  AllocationSpecificSKUReservation.newBuilder()
                      // Set the number of instances
                      .setCount(numberOfVms)
                      // Set the instance template to be used for creating the reservation.
                      .setSourceInstanceTemplate(instanceTemplateUri)
                      .build())
              .build();

      Operation response =
          reservationsClient.insertAsync(projectId, zone, reservation).get(3, TimeUnit.MINUTES);

      if (response.hasError()) {
        return null;
      }
      return reservationsClient.get(projectId, zone, reservationName);
    }
  }
}

Node.js

// Import the Compute library
const computeLib = require('@google-cloud/compute');
const compute = computeLib.protos.google.cloud.compute.v1;

// Instantiate a reservationsClient
const reservationsClient = new computeLib.ReservationsClient();
// Instantiate a zoneOperationsClient
const zoneOperationsClient = new computeLib.ZoneOperationsClient();

/**
 * TODO(developer): Update/uncomment these variables before running the sample.
 */
// The ID of the project where you want to reserve resources and where the instance template exists.
const projectId = await reservationsClient.getProjectId();
// The zone in which to reserve resources.
const zone = 'us-central1-a';
// The name of the reservation to create.
// reservationName = 'reservation-01';
// The number of VMs to reserve.
const vmsNumber = 3;

/**
 * The name of an existing instance template.
 * TODO(developer): Uncomment and update instanceTemplateName before running the sample.
 */
// const instanceTemplateName = 'pernament-region-template-name';

/**
 * // The location of the instance template.
 * TODO(developer): Uncomment the `location` variable depending on which template you want to use.
 */

// The location for a regional instance template: regions/{region}. Replace region with the region where the instance template is located.
// If you specify a regional instance template, then you can only reserve VMs within the same region as the template's region.
// const location = `regions/${zone.slice(0, -2)}`;

// The location for a global instance template.
// const location = 'global';

async function callCreateComputeReservationInstanceTemplate() {
  // Create reservation for 3 VMs in zone us-central1-a by specifying a instance template.
  const specificReservation = new compute.AllocationSpecificSKUReservation({
    count: vmsNumber,
    sourceInstanceTemplate: `projects/${projectId}/${location}/instanceTemplates/${instanceTemplateName}`,
  });

  // Create a reservation.
  const reservation = new compute.Reservation({
    name: reservationName,
    specificReservation,
    // To specify that only VMs that specifically target this reservation can consume it,
    // set specificReservationRequired field to true.
    specificReservationRequired: true,
  });

  const [response] = await reservationsClient.insert({
    project: projectId,
    reservationResource: reservation,
    zone,
  });

  let operation = response.latestResponse;

  // Wait for the create reservation operation to complete.
  while (operation.status !== 'DONE') {
    [operation] = await zoneOperationsClient.wait({
      operation: operation.name,
      project: projectId,
      zone: operation.zone.split('/').pop(),
    });
  }

  console.log(`Reservation: ${reservationName} created.`);
}

await callCreateComputeReservationInstanceTemplate();

Python

from __future__ import annotations

import sys
from typing import Any

from google.api_core.extended_operation import ExtendedOperation
from google.cloud import compute_v1


def wait_for_extended_operation(
    operation: ExtendedOperation, verbose_name: str = "operation", timeout: int = 300
) -> Any:
    """
    Waits for the extended (long-running) operation to complete.

    If the operation is successful, it will return its result.
    If the operation ends with an error, an exception will be raised.
    If there were any warnings during the execution of the operation
    they will be printed to sys.stderr.

    Args:
        operation: a long-running operation you want to wait on.
        verbose_name: (optional) a more verbose name of the operation,
            used only during error and warning reporting.
        timeout: how long (in seconds) to wait for operation to finish.
            If None, wait indefinitely.

    Returns:
        Whatever the operation.result() returns.

    Raises:
        This method will raise the exception received from `operation.exception()`
        or RuntimeError if there is no exception set, but there is an `error_code`
        set for the `operation`.

        In case of an operation taking longer than `timeout` seconds to complete,
        a `concurrent.futures.TimeoutError` will be raised.
    """
    result = operation.result(timeout=timeout)

    if operation.error_code:
        print(
            f"Error during {verbose_name}: [Code: {operation.error_code}]: {operation.error_message}",
            file=sys.stderr,
            flush=True,
        )
        print(f"Operation ID: {operation.name}", file=sys.stderr, flush=True)
        raise operation.exception() or RuntimeError(operation.error_message)

    if operation.warnings:
        print(f"Warnings during {verbose_name}:\n", file=sys.stderr, flush=True)
        for warning in operation.warnings:
            print(f" - {warning.code}: {warning.message}", file=sys.stderr, flush=True)

    return result


def create_reservation_from_template(
    project_id: str, reservation_name: str, template: str
) -> compute_v1.Reservation:
    """
    Create a new reservation based on an existing template.

    Args:
        project_id: project ID or project number of the Cloud project you use.
        reservation_name: the name of new reservation.
        template: existing template path. Following formats are allowed:
            - projects/{project_id}/global/instanceTemplates/{template_name}
            - projects/{project_id}/regions/{region}/instanceTemplates/{template_name}
            - https://www.googleapis.com/compute/v1/projects/{project_id}/global/instanceTemplates/instanceTemplate
            - https://www.googleapis.com/compute/v1/projects/{project_id}/regions/{region}/instanceTemplates/instanceTemplate

    Returns:
        Reservation object that represents the new reservation.
    """

    reservations_client = compute_v1.ReservationsClient()
    request = compute_v1.InsertReservationRequest()
    request.project = project_id
    request.zone = "us-central1-a"

    specific_reservation = compute_v1.AllocationSpecificSKUReservation()
    specific_reservation.count = 1
    specific_reservation.source_instance_template = template

    reservation = compute_v1.Reservation()
    reservation.name = reservation_name
    reservation.specific_reservation = specific_reservation

    request.reservation_resource = reservation
    operation = reservations_client.insert(request)
    wait_for_extended_operation(operation, "Reservation creation")

    return reservations_client.get(
        project=project_id, zone="us-central1-a", reservation=reservation_name
    )

REST

Para crear una reserva de un solo proyecto, realiza una solicitud POST al método reservations.insert.

Para crear una reserva de un solo proyecto si especificas una plantilla de instancias sin marcas opcionales, realiza la siguiente solicitud POST:

POST https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/zones/ZONE/reservations

{
  "name": "RESERVATION_NAME",
  "specificReservation": {
    "count": "NUMBER_OF_VMS",
    "sourceInstanceTemplate": "projects/PROJECT_ID/LOCATION/instanceTemplates/INSTANCE_TEMPLATE_NAME"
  }
}

Reemplaza lo siguiente:

  • PROJECT_ID: Es el ID del proyecto en el que deseas reservar los recursos y donde existe la plantilla de instancias.

  • ZONE: Es la zona en la que se reservarán los recursos.

  • RESERVATION_NAME: Es el nombre de la reserva que se creará.

  • NUMBER_OF_VMS: La cantidad de VMs que se reservarán.

  • LOCATION: la ubicación de la plantilla de instancias. Especifica uno de los siguientes valores:

    • Para una plantilla de instancias global: global.

    • Para una plantilla de instancias regional: regions/REGION. Reemplaza REGION por la región en la que se encuentra la plantilla de instancias. Si especificas una plantilla de instancias regional, solo puedes reservar VMs dentro de la misma región que la región de la plantilla.

  • INSTANCE_TEMPLATE_NAME: Es nombre de una plantilla de instancias existente. Si la plantilla de instancias especifica un tipo de máquina A3 o una política de posición compacta, debes incluir el campo specificReservationRequired en el cuerpo de la solicitud y configurarlo como true. Esto indica que solo las VMs que se dirigen a esta reserva de forma específica pueden consumirla. Para obtener más información, consulta Consume las VMs de una reserva específica.

Por ejemplo, a fin de crear una reserva para diez VMs en la zona us-central1-a mediante la especificación de una plantilla de instancias global, realiza la siguiente solicitud POST:

POST https://compute.googleapis.com/compute/v1/projects/example-project/zones/us-central1-a/reservations

{
  "name": "my-reservation",
  "specificReservation": {
    "count": "10",
    "sourceInstanceTemplate": "projects/example-project/global/instanceTemplates/example-instance-template"
  }
}

De manera opcional, puedes hacer una o más de las siguientes acciones:

  • Para especificar que solo las VMs que se dirigen a esta reserva de forma específica pueden consumirla, incluye el campo specificReservationRequired en el cuerpo de la solicitud y configúralo como true.

    POST https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/zones/ZONE/reservations
    
    {
      "name": "RESERVATION_NAME",
      "specificReservation": {
        "count": "NUMBER_OF_VMS",
        "sourceInstanceTemplate": "projects/PROJECT_ID/LOCATION/instanceTemplates/INSTANCE_TEMPLATE_NAME"
      },
      "specificReservationRequired": true
    }
    
  • Para permitir que una reserva de VMs con GPU sea consumida por trabajos de entrenamiento personalizados o por trabajos de predicción en Vertex AI, realiza una solicitud POST al método beta.reservations.insert. En el cuerpo de la solicitud, incluye el campo serviceShareType y configúralo como ALLOW_ALL.

    POST https://compute.googleapis.com/compute/beta/projects/PROJECT_ID/zones/ZONE/reservations
    
    {
      "name": "RESERVATION_NAME",
      "reservationSharingPolicy": {
        "serviceShareType": "ALLOW_ALL"
      },
      "specificReservation": {
        "count": "NUMBER_OF_VMS",
        "sourceInstanceTemplate": "projects/PROJECT_ID/LOCATION/instanceTemplates/INSTANCE_TEMPLATE_NAME"
      }
    }
    
  • Para permitir que Compute Engine borre automáticamente la reserva, selecciona uno de los siguientes métodos:

    • Para borrar la reserva en una fecha y hora específicas, haz una solicitud POST al método beta.reservations.insert. En el cuerpo de la solicitud, incluye el campo deleteAtTime.

      POST https://compute.googleapis.com/compute/beta/projects/PROJECT_ID/zones/ZONE/reservations
      
      {
        "deleteAtTime": "DELETE_AT_TIME",
        "name": "RESERVATION_NAME",
        "specificReservation": {
          "count": "NUMBER_OF_VMS",
          "sourceInstanceTemplate": "projects/PROJECT_ID/LOCATION/instanceTemplates/INSTANCE_TEMPLATE_NAME"
        }
      }
      

      Reemplaza DELETE_AT_TIME por una fecha y hora con formato de marca de tiempo RFC 3339, que debe ser de la siguiente manera:

      YYYY-MM-DDTHH:MM:SSOFFSET
      

      Reemplaza lo siguiente:

      • YYYY-MM-DD: una fecha con formato de un año de 4 dígitos, un mes de 2 dígitos y un día de 2 dígitos del mes separado por guiones (-).

      • HH:MM:SS: una hora con formato de hora de 2 dígitos con un formato de 24 horas, minutos de 2 dígitos y segundos de 2 dígitos separados por dos puntos (:).

      • OFFSET: la zona horaria con formato como una compensación del horario universal coordinado (UTC). Por ejemplo, para usar la hora estándar del Pacífico (PST), especifica -08:00. Como alternativa, para no usar compensación, especifica Z.

    • Para borrar la reserva después de una duración específica, haz una solicitud POST al método beta.reservations.insert. En el cuerpo de la solicitud, incluye el campo deleteAfterDuration.

      POST https://compute.googleapis.com/compute/beta/projects/PROJECT_ID/zones/ZONE/reservations
      
      {
        "deleteAfterDuration": {
          "seconds": "DELETE_AFTER_DURATION"
        },
        "name": "RESERVATION_NAME",
        "specificReservation": {
          "count": "NUMBER_OF_VMS",
          "sourceInstanceTemplate": "projects/PROJECT_ID/LOCATION/instanceTemplates/INSTANCE_TEMPLATE_NAME"
        }
      }
      

      Reemplaza DELETE_AFTER_DURATION por una duración en segundos. Por ejemplo, especifica 86400 para 86,400 segundos (1 día).

Especifica una VM existente

Solo puedes crear una reserva basada en una VM existente en la misma zona que la VM.

Después de crear la reserva, puedes consumirla si creas VMs con propiedades que coincidan con la VM de referencia. Para ello, puedes optar por cualquiera de las siguientes opciones:

Para crear una reserva de un solo proyecto que use las propiedades de una VM existente, haz lo siguiente:

  1. En la consola de Google Cloud, ve a la página Reservas.

    Ir a Reservas

  2. Haz clic en Crear reserva.

    Se abrirá la página Crear una reserva.

  3. En Nombre, ingresa un nombre para tu reserva.

  4. En Región y Zona, selecciona dónde deseas reservar los recursos.

  5. En la sección Tipo de recurso compartido, haz clic en Local si aún no está seleccionado.

  6. En la sección Usar con instancia de VM, selecciona una de las siguientes opciones:

    • Para permitir que las VMs coincidentes consuman de forma automática esta reserva, selecciona Usar reserva de forma automática si aún no está seleccionada.

    • Para consumir los recursos de esta reserva solo cuando creas VMs coincidentes que se dirigen de forma específica a esta reserva por nombre, elige Seleccionar reserva específica.

  7. En Cantidad de instancias de VM, ingresa la cantidad de VMs que deseas reservar.

  8. En la sección Configuración de la máquina, haz lo siguiente:

    1. Selecciona Usar VM existente.

    2. En VM existente, selecciona la VM cuyas propiedades deseas usar para crear la reserva.

  9. Opcional: Para especificar una política de posición compacta para una reserva que cumpla con los requisitos, en la sección Política de posición de grupo, haz clic en la lista Selecciona o crea una política de posición de grupo y, luego, realiza una de las siguientes acciones:

    • Para crear una política de posición compacta que especifiques en esta reserva, haz lo siguiente:

      1. Haz clic en Crear política de posición de grupo.

        Aparecerá el panel Crear una política de posición de grupo.

      2. En Nombre de la política, ingresa un nombre para tu política.

      3. Haz clic en Crear.

        La creación de la política de posición compacta puede tomar unos segundos en completarse.

    • De lo contrario, selecciona una política de posición compacta existente.

  10. En la sección Eliminación automática, puedes habilitar la opción de eliminación automática para permitir que Compute Engine borre la reserva en una fecha y hora específicas de forma automática. La eliminación automática de reservas puede ser útil para evitar cargos innecesarios cuando dejas de consumir la reserva.

  11. Para crear la reserva, haz clic en Crear.

    Se abrirá la página Reservas. La creación de la reserva puede tardar hasta un minuto en completarse.

Especifica las propiedades directamente

Para crear una reserva de un solo proyecto a través de la especificación directa de las propiedades, selecciona una de las siguientes opciones:

Console

  1. En la consola de Google Cloud, ve a la página Reservas.

    Ir a Reservas

  2. En la pestaña Reservas según demanda (predeterminada), haz clic en Crear reserva.

    Se abrirá la página Crear una reserva.

  3. En Nombre, ingresa un nombre para tu reserva.

  4. En Región y Zona, selecciona dónde deseas reservar los recursos.

  5. En la sección Tipo de recurso compartido, haz clic en Local si aún no está seleccionada.

  6. Opcional: Para permitir que una reserva de VMs con GPU sea consumida por trabajos de entrenamiento personalizados o trabajos de predicción en Vertex AI, en la sección Servicios de Google Cloud, selecciona Compartir reserva.

  7. En la sección Usar con instancia de VM, selecciona una de las siguientes opciones:

    • Para permitir que las VMs coincidentes consuman de forma automática esta reserva, selecciona Usar reserva de forma automática si aún no está seleccionada.

    • Para consumir los recursos de esta reserva solo cuando creas VMs coincidentes que se dirigen de forma específica a esta reserva por nombre, elige Seleccionar reserva específica.

  8. En Cantidad de instancias de VM, ingresa la cantidad de VMs que deseas reservar.

  9. En la sección Configuración de máquina, selecciona Especificar tipo de máquina y, luego, especifica lo siguiente:

    1. En Familia de máquinas, Serie y Tipo de máquina, selecciona una familia de máquinas, una serie y un tipo de máquina.

    2. Opcional: Para especificar una plataforma de CPU mínima o conectar GPUs a las VMs N1, haz lo siguiente:

      1. Para expandir la sección Plataforma de CPU y GPU, haz clic en la flecha de expansión .

      2. Opcional: Para especificar una plataforma de CPU mínima, selecciona una opción en Plataforma de CPU.

      3. Opcional: Para conectar GPUs a las VMs N1, haz clic en Agregar GPU. Luego, en Tipo de GPU y Cantidad de GPU, selecciona el tipo y la cantidad de GPUs que se adjuntarán a cada VM N1.

    3. Opcional: Para agregar discos SSD locales, haz lo siguiente:

      1. En Cantidad de discos, selecciona la cantidad de discos SSD locales para cada VM.

      2. En Tipo de interfaz, selecciona la interfaz para los discos SSD locales.

    4. Opcional: A fin de especificar una política de posición compacta para una reserva que cumpla con los requisitos, haz clic en la listaSelecciona o crea una política de posición de grupo y luego, realiza una de las siguientes acciones:

      • Para crear una política de posición compacta que especifiques en esta reserva, sigue estos pasos:

        1. Haz clic en Crear política de posición de grupo.

          Aparecerá el panel Crear una política de posición de grupo.

        2. En Nombre de la política, ingresa un nombre para tu política.

        3. Haz clic en Crear.

          La creación de la política de posición compacta puede tomar unos segundos en completarse.

      • De lo contrario, selecciona una política de posición compacta existente.

  10. Opcional: Para especificar una política de posición compacta para una reserva que cumpla con los requisitos, en la sección Política de posición de grupo, haz clic en la lista Selecciona o crea una política de posición de grupo y, luego, realiza una de las siguientes acciones:

    • Para crear una política de posición compacta que especifiques en esta reserva, haz lo siguiente:

      1. Haz clic en Crear política de posición de grupo.

        Aparecerá el panel Crear una política de posición de grupo.

      2. En Nombre de la política, ingresa un nombre para tu política.

      3. Haz clic en Crear.

        La creación de la política de posición compacta puede tomar unos segundos en completarse.

    • De lo contrario, selecciona una política de posición compacta existente.

  11. En la sección Eliminación automática, puedes habilitar la opción de eliminación automática para permitir que Compute Engine borre la reserva en una fecha y hora específicas de forma automática. La eliminación automática de reservas puede ser útil para evitar cargos innecesarios cuando dejas de consumir la reserva.

  12. Para crear la reserva, haz clic en Crear.

    Se abrirá la página Reservas. La creación de la reserva de un solo proyecto puede tomar hasta un minuto en completarse.

gcloud

Para crear una reserva de un solo proyecto, usa el comando gcloud compute reservations create.

Para crear una reserva de un solo proyecto a través de la especificación directa de las propiedades y sin incluir marcas opcionales, ejecuta el siguiente comando:

gcloud compute reservations create RESERVATION_NAME \
    --machine-type=MACHINE_TYPE \
    --vm-count=NUMBER_OF_VMS \
    --zone=ZONE

Reemplaza lo siguiente:

  • RESERVATION_NAME: Es el nombre de la reserva que se creará.

  • MACHINE_TYPE: Un tipo de máquina que se usará para cada VM. Si especificas un tipo de máquina A3, debes incluir la marca --require-specific-reservation. Esto indica que solo las VMs que se dirigen a esta reserva de forma específica pueden consumirla. Para obtener más información, consulta Consume las VMs de una reserva específica.

  • NUMBER_OF_VMS: La cantidad de VMs que se reservarán.

  • ZONE: Es la zona en la que se reservarán los recursos.

Por ejemplo, a fin de crear una reserva en la zona us-central1-a para diez VMs, cada una con un tipo predefinido de máquina N2 con 4 CPU virtuales, ejecuta el siguiente comando:

gcloud compute reservations create my-reservation \
    --machine-type=n2-standard-4 \
    --vm-count=10 \
    --zone=us-central1-a

De manera opcional, puedes hacer una o más de las siguientes acciones:

  • Para adjuntar GPUs a tus VMs N1 reservadas, incluye la marca --accelerator.

    gcloud compute reservations create RESERVATION_NAME \
        --accelerator=count=NUMBER_OF_ACCELERATORS,type=ACCELERATOR_TYPE
        --machine-type=MACHINE_TYPE \
        --vm-count=NUMBER_OF_VMS \
        --zone=ZONE
    

    Reemplaza lo siguiente:

  • Para agregar uno o más discos SSD locales a cada VM reservada, incluye una o más marcas --local-ssd. Puedes especificar hasta 24 discos SSD locales. Cada disco SSD local es de 375 GB.

    Por ejemplo, para especificar dos discos SSD locales cuando creas una reserva, incluye dos marcas --local-ssd de la siguiente manera:

    gcloud compute reservations create RESERVATION_NAME \
        --local-ssd=size=375,interface=INTERFACE_1 \
        --local-ssd=size=375,interface=INTERFACE_2 \
        --machine-type=MACHINE_TYPE \
        --vm-count=NUMBER_OF_VMS \
        --zone=ZONE
    

    Reemplaza INTERFACE_1 y INTERFACE_2 por el tipo de interfaz que deseas que use cada disco SSD local. Especifica uno de los siguientes valores:

    • Interfaces de disco NVMe: nvme

    • Interfaces de disco SCSI: scsi

    Asegúrate de que el tipo de máquina que especifiques para las VMs reservadas admita las interfaces de disco elegidas. De lo contrario, la creación de la reserva fallará. Para obtener más información, consulta cómo elegir una interfaz de disco.

  • Para que las VMs reservadas usen una plataforma de CPU mínima específica en lugar de la plataforma de CPU predeterminada de la zona, incluye la marca --min-cpu-platform.

    gcloud compute reservations create RESERVATION_NAME \
        --machine-type=MACHINE_TYPE \
        --min-cpu-platform="MIN_CPU_PLATFORM" \
        --vm-count=NUMBER_OF_VMS \
        --zone=ZONE
    

    Reemplaza MIN_CPU_PLATFORM por una plataforma de CPU mínima. Para asegurarte de que una plataforma de CPU esté disponible en la zona en la que reservas recursos, consulta las plataformas de CPU disponibles por zona.

  • Para especificar que solo las VMs que se dirigen a esta reserva de forma específica pueden consumirla, incluye la marca --require-specific-reservation.

    gcloud compute reservations create RESERVATION_NAME \
        --machine-type=MACHINE_TYPE \
        --require-specific-reservation \
        --vm-count=NUMBER_OF_VMS \
        --zone=ZONE
    
  • A fin de especificar una política de posición compacta para reducir la latencia de red entre las VMs, incluye la marca --resource-policies=policy.

    gcloud compute reservations create RESERVATION_NAME \
        --machine-type=MACHINE_TYPE \
        --resource-policies=policy=COMPACT_PLACEMENT_POLICY_NAME \
        --require-specific-reservation \
        --vm-count=NUMBER_OF_VMS \
        --zone=ZONE
    

    Reemplaza COMPACT_PLACEMENT_POLICY_NAME por el nombre de una política de posición compacta existente. Además, para evitar errores cuando creas una reserva de un solo proyecto que especifique una política de posición compacta, asegúrate de especificar lo siguiente:

    • Un tipo de máquina compatible y una cantidad máxima de VMs para las políticas de posición compacta.

    • Una zona dentro de la región en la que se encuentra la política de posición compacta.

    • La marca --require-specific-reservation Esto indica que solo las VMs que se dirigen a esta reserva de forma específica pueden consumirla.

  • Para permitir que una reserva de VMs de GPU sea consumida por trabajos de entrenamiento personalizados o por trabajos de predicción en Vertex AI, usa el comando gcloud beta compute reservations create con la marca --reservation-sharing-policy=ALLOW_ALL.

    gcloud beta compute reservations create RESERVATION_NAME \
        --machine-type=MACHINE_TYPE \
        --reservation-sharing-policy=ALLOW_ALL \
        --vm-count=NUMBER_OF_VMS \
        --zone=ZONE
    
  • Para permitir que Compute Engine borre automáticamente la reserva, selecciona uno de los siguientes métodos:

    • Para borrar la reserva en una fecha y hora específicas, usa el comando gcloud beta compute reservations create con la marca --delete-at-time.

      gcloud beta compute reservations create RESERVATION_NAME \
          --delete-at-time=DELETE_AT_TIME \
          --machine-type=MACHINE_TYPE \
          --vm-count=NUMBER_OF_VMS \
          --zone=ZONE
      

      Reemplaza DELETE_AT_TIME por una fecha y hora con formato de marca de tiempo RFC 3339, que debe ser de la siguiente manera:

      YYYY-MM-DDTHH:MM:SSOFFSET
      

      Reemplaza lo siguiente:

      • YYYY-MM-DD: una fecha con formato de un año de 4 dígitos, un mes de 2 dígitos y un día de 2 dígitos del mes separado por guiones (-).

      • HH:MM:SS: una hora con formato de hora de 2 dígitos con un formato de 24 horas, minutos de 2 dígitos y segundos de 2 dígitos separados por dos puntos (:).

      • OFFSET: la zona horaria con formato como una compensación del horario universal coordinado (UTC). Por ejemplo, para usar la hora estándar del Pacífico (PST), especifica -08:00. Como alternativa, para no usar compensación, especifica Z.

    • Para borrar la reserva después de una duración específica, usa el comando gcloud beta compute reservations create con la marca --delete-after-duration.

      gcloud beta compute reservations create RESERVATION_NAME \
          --delete-after-duration=DELETE_AFTER_DURATION \
          --machine-type=MACHINE_TYPE \
          --vm-count=NUMBER_OF_VMS \
          --zone=ZONE
      

      Reemplaza DELETE_AFTER_DURATION por una duración en días, horas, minutos o segundos. Por ejemplo, especifica 30m para 30 minutos o 1d2h3m4s para 1 día, 2 horas, 3 minutos y 4 segundos.

Go

import (
	"context"
	"fmt"
	"io"

	compute "cloud.google.com/go/compute/apiv1"
	computepb "cloud.google.com/go/compute/apiv1/computepb"
	"google.golang.org/protobuf/proto"
)

// Creates the reservation with accelerated image
func createBaseReservation(w io.Writer, projectID, zone, reservationName string) error {
	// projectID := "your_project_id"
	// zone := "us-west3-a"
	// reservationName := "your_reservation_name"

	ctx := context.Background()
	reservationsClient, err := compute.NewReservationsRESTClient(ctx)
	if err != nil {
		return err
	}
	defer reservationsClient.Close()

	// Creating reservation based on direct properties
	req := &computepb.InsertReservationRequest{
		Project: projectID,
		ReservationResource: &computepb.Reservation{
			Name: proto.String(reservationName),
			Zone: proto.String(zone),
			SpecificReservation: &computepb.AllocationSpecificSKUReservation{
				Count: proto.Int64(2),
				// Properties, which allows customising instances
				InstanceProperties: &computepb.AllocationSpecificSKUAllocationReservedInstanceProperties{
					// Attaching GPUs to the reserved VMs
					// Read more: https://cloud.google.com/compute/docs/gpus#n1-gpus
					GuestAccelerators: []*computepb.AcceleratorConfig{
						{
							AcceleratorCount: proto.Int32(1),
							AcceleratorType:  proto.String("nvidia-tesla-t4"),
						},
					},
					// Including local SSD disks
					LocalSsds: []*computepb.AllocationSpecificSKUAllocationAllocatedInstancePropertiesReservedDisk{
						{
							DiskSizeGb: proto.Int64(375),
							Interface:  proto.String("NVME"),
						},
					},
					MachineType: proto.String("n1-standard-2"),
					// Specifying minimum CPU platform
					// Read more: https://cloud.google.com/compute/docs/instances/specify-min-cpu-platform
					MinCpuPlatform: proto.String("Intel Skylake"),
				},
			},
		},
		Zone: zone,
	}

	op, err := reservationsClient.Insert(ctx, req)
	if err != nil {
		return fmt.Errorf("unable to create reservation: %w", err)
	}

	if err = op.Wait(ctx); err != nil {
		return fmt.Errorf("unable to wait for the operation: %w", err)
	}

	fmt.Fprintf(w, "Reservation created\n")

	return nil
}

Java

import com.google.cloud.compute.v1.AcceleratorConfig;
import com.google.cloud.compute.v1.AllocationSpecificSKUAllocationAllocatedInstancePropertiesReservedDisk;
import com.google.cloud.compute.v1.AllocationSpecificSKUAllocationReservedInstanceProperties;
import com.google.cloud.compute.v1.AllocationSpecificSKUReservation;
import com.google.cloud.compute.v1.Operation;
import com.google.cloud.compute.v1.Reservation;
import com.google.cloud.compute.v1.ReservationsClient;
import java.io.IOException;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.TimeoutException;

public class CreateReservation {

  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 Cloud project you want to use.
    String projectId = "YOUR_PROJECT_ID";
    // Name of the zone in which you want to create the disk.
    String zone = "us-central1-a";
    // Name of the reservation you want to create.
    String reservationName = "YOUR_RESERVATION_NAME";
    // Number of instances in the reservation.
    int numberOfVms = 3;

    createReservation(projectId, reservationName, numberOfVms, zone);
  }

  // Creates reservation with optional flags
  public static Reservation createReservation(
      String projectId, String reservationName, int numberOfVms, String zone)
      throws IOException, ExecutionException, InterruptedException, TimeoutException {
    // Create the reservation with optional properties:
    // Machine type of the instances in the reservation.
    String machineType = "n1-standard-2";
    // Number of accelerators to be attached to the instances in the reservation.
    int numberOfAccelerators = 1;
    // Accelerator type to be attached to the instances in the reservation.
    String acceleratorType = "nvidia-tesla-t4";
    // Minimum CPU platform to be attached to the instances in the reservation.
    String minCpuPlatform = "Intel Skylake";
    // Local SSD size in GB to be attached to the instances in the reservation.
    int localSsdSize = 375;
    // Local SSD interfaces to be attached to the instances in the reservation.
    String localSsdInterface1 = "NVME";
    String localSsdInterface2 = "SCSI";
    boolean specificReservationRequired = true;
    // 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 (ReservationsClient reservationsClient = ReservationsClient.create()) {
      Reservation reservation =
          Reservation.newBuilder()
              .setName(reservationName)
              .setZone(zone)
              .setSpecificReservationRequired(specificReservationRequired)
              .setSpecificReservation(
                  AllocationSpecificSKUReservation.newBuilder()
                      // Set the number of instances
                      .setCount(numberOfVms)
                      // Set instance properties
                      .setInstanceProperties(
                          AllocationSpecificSKUAllocationReservedInstanceProperties.newBuilder()
                              .setMachineType(machineType)
                              .setMinCpuPlatform(minCpuPlatform)
                              .addGuestAccelerators(
                                  AcceleratorConfig.newBuilder()
                                      .setAcceleratorCount(numberOfAccelerators)
                                      .setAcceleratorType(acceleratorType)
                                      .build())
                              .addLocalSsds(
                            AllocationSpecificSKUAllocationAllocatedInstancePropertiesReservedDisk
                                      .newBuilder()
                                      .setDiskSizeGb(localSsdSize)
                                      .setInterface(localSsdInterface1)
                                      .build())
                              .addLocalSsds(
                            AllocationSpecificSKUAllocationAllocatedInstancePropertiesReservedDisk
                                      .newBuilder()
                                      .setDiskSizeGb(localSsdSize)
                                      .setInterface(localSsdInterface2)
                                      .build())
                              .build())
                      .build())
              .build();

      Operation response =
          reservationsClient.insertAsync(projectId, zone, reservation).get(7, TimeUnit.MINUTES);

      if (response.hasError()) {
        return null;
      }
      return reservationsClient.get(projectId, zone, reservationName);
    }
  }
}

Node.js

// Import the Compute library
const computeLib = require('@google-cloud/compute');
const compute = computeLib.protos.google.cloud.compute.v1;

// Instantiate a reservationsClient
const reservationsClient = new computeLib.ReservationsClient();
// Instantiate a zoneOperationsClient
const zoneOperationsClient = new computeLib.ZoneOperationsClient();

/**
 * TODO(developer): Update/uncomment these variables before running the sample.
 */
// The ID of the project where you want to reserve resources.
const projectId = await reservationsClient.getProjectId();
// The zone in which to reserve resources.
const zone = 'us-central1-a';
// The name of the reservation to create.
// reservationName = 'reservation-01';
// The number of VMs to reserve.
const vmsNumber = 3;
// Machine type to use for each VM.
const machineType = 'n1-standard-4';

async function callCreateComputeReservationFromProperties() {
  // Create specific reservation for 3 VMs that each use an N1 predefined machine type with 4 vCPUs.
  const specificReservation = new compute.AllocationSpecificSKUReservation({
    count: vmsNumber,
    instanceProperties: {
      machineType,
      // To have the reserved VMs use a specific minimum CPU platform instead of the zone's default CPU platform.
      minCpuPlatform: 'Intel Skylake',
      // If you want to attach GPUs to your reserved N1 VMs, update and uncomment guestAccelerators if needed.
      // guestAccelerators: [
      //   {
      //     // The number of GPUs to add per reserved VM.
      //     acceleratorCount: 1,
      //     // Supported GPU model for N1 VMs. Ensure that your chosen GPU model is available in the zone,
      //     // where you want to reserve resources.
      //     acceleratorType: 'nvidia-tesla-t4',
      //   },
      // ],
      // If you want to add local SSD disks to each reserved VM, update and uncomment localSsds if needed.
      // You can specify up to 24 Local SSD disks. Each Local SSD disk is 375 GB.
      // localSsds: [
      //   {
      //     diskSizeGb: 375,
      //     // The type of interface you want each Local SSD disk to use. Specify one of the following values: NVME or SCSI.
      //     // Make sure that the machine type you specify for the reserved VMs supports the chosen disk interfaces.
      //     interface: 'NVME',
      //   },
      // ],
    },
  });

  // Create a reservation.
  const reservation = new compute.Reservation({
    name: reservationName,
    zone,
    specificReservation,
    // To specify that only VMs that specifically target this reservation can consume it,
    // set specificReservationRequired field to true.
    specificReservationRequired: true,
  });

  const [response] = await reservationsClient.insert({
    project: projectId,
    reservationResource: reservation,
    zone,
  });

  let operation = response.latestResponse;

  // Wait for the create reservation operation to complete.
  while (operation.status !== 'DONE') {
    [operation] = await zoneOperationsClient.wait({
      operation: operation.name,
      project: projectId,
      zone: operation.zone.split('/').pop(),
    });
  }

  console.log(`Reservation: ${reservationName} created.`);
}

await callCreateComputeReservationFromProperties();

Python

from __future__ import annotations

import sys
from typing import Any

from google.api_core.extended_operation import ExtendedOperation
from google.cloud import compute_v1


def wait_for_extended_operation(
    operation: ExtendedOperation, verbose_name: str = "operation", timeout: int = 300
) -> Any:
    """
    Waits for the extended (long-running) operation to complete.

    If the operation is successful, it will return its result.
    If the operation ends with an error, an exception will be raised.
    If there were any warnings during the execution of the operation
    they will be printed to sys.stderr.

    Args:
        operation: a long-running operation you want to wait on.
        verbose_name: (optional) a more verbose name of the operation,
            used only during error and warning reporting.
        timeout: how long (in seconds) to wait for operation to finish.
            If None, wait indefinitely.

    Returns:
        Whatever the operation.result() returns.

    Raises:
        This method will raise the exception received from `operation.exception()`
        or RuntimeError if there is no exception set, but there is an `error_code`
        set for the `operation`.

        In case of an operation taking longer than `timeout` seconds to complete,
        a `concurrent.futures.TimeoutError` will be raised.
    """
    result = operation.result(timeout=timeout)

    if operation.error_code:
        print(
            f"Error during {verbose_name}: [Code: {operation.error_code}]: {operation.error_message}",
            file=sys.stderr,
            flush=True,
        )
        print(f"Operation ID: {operation.name}", file=sys.stderr, flush=True)
        raise operation.exception() or RuntimeError(operation.error_message)

    if operation.warnings:
        print(f"Warnings during {verbose_name}:\n", file=sys.stderr, flush=True)
        for warning in operation.warnings:
            print(f" - {warning.code}: {warning.message}", file=sys.stderr, flush=True)

    return result


def create_compute_reservation(
    project_id: str,
    zone: str = "us-central1-a",
    reservation_name="your-reservation-name",
) -> compute_v1.Reservation:
    """Creates a compute reservation in GCP.
    Args:
        project_id (str): The ID of the Google Cloud project.
        zone (str): The zone to create the reservation.
        reservation_name (str): The name of the reservation to create.
    Returns:
        Reservation object that represents the new reservation.
    """

    instance_properties = compute_v1.AllocationSpecificSKUAllocationReservedInstanceProperties(
        machine_type="n1-standard-1",
        # Optional. Specifies the minimum CPU platform for the VM instance.
        min_cpu_platform="Intel Ivy Bridge",
        # Optional. Specifies amount of local ssd to reserve with each instance.
        local_ssds=[
            compute_v1.AllocationSpecificSKUAllocationAllocatedInstancePropertiesReservedDisk(
                disk_size_gb=375, interface="NVME"
            ),
            compute_v1.AllocationSpecificSKUAllocationAllocatedInstancePropertiesReservedDisk(
                disk_size_gb=375, interface="SCSI"
            ),
        ],
        # Optional. Specifies the GPUs allocated to each instance.
        # guest_accelerators=[
        #     compute_v1.AcceleratorConfig(
        #         accelerator_count=1, accelerator_type="nvidia-tesla-t4"
        #     )
        # ],
    )

    reservation = compute_v1.Reservation(
        name=reservation_name,
        specific_reservation=compute_v1.AllocationSpecificSKUReservation(
            count=3,  # Number of resources that are allocated.
            # If you use source_instance_template, you must exclude the instance_properties field.
            # It can be a full or partial URL.
            # source_instance_template="projects/[PROJECT_ID]/global/instanceTemplates/my-instance-template",
            instance_properties=instance_properties,
        ),
    )

    # Create a client
    client = compute_v1.ReservationsClient()

    operation = client.insert(
        project=project_id,
        zone=zone,
        reservation_resource=reservation,
    )
    wait_for_extended_operation(operation, "Reservation creation")

    reservation = client.get(
        project=project_id, zone=zone, reservation=reservation_name
    )

    print("Name: ", reservation.name)
    print("STATUS: ", reservation.status)
    print(reservation.specific_reservation)
    # Example response:
    # Name:  your-reservation-name
    # STATUS:  READY
    # count: 3
    # instance_properties {
    #   machine_type: "n1-standard-1"
    #   local_ssds {
    #     disk_size_gb: 375
    #     interface: "NVME"
    #   }
    # ...

    return reservation

Terraform

Para crear una reserva de un solo proyecto, usa el recurso de Terraform google_compute_reservation.

Por ejemplo, para crear una reserva de un solo proyecto para un tipo de máquina predefinido de N2 con 2 CPU virtuales, usa el siguiente recurso:


resource "google_compute_reservation" "default" {
  name = "gce-reservation-local"
  zone = "us-central1-a"

  /**
   * To specify a single-project reservation, omit the share_settings block
   * (default) or set the share_type field to LOCAL.
   */
  share_settings {
    share_type = "LOCAL"
  }

  specific_reservation {
    count = 1
    instance_properties {
      machine_type = "n2-standard-2"
    }
  }

  /**
   * To let VMs with affinity for any reservation consume this reservation, omit
   * the specific_reservation_required field (default) or set it to false.
   */
  specific_reservation_required = false
}

Para obtener más información sobre cómo usar Terraform, consulta Usa Terraform con Google Cloud.

REST

Para crear una reserva de un solo proyecto, realiza una solicitud POST al método reservations.insert.

Para crear una reserva de un solo proyecto a través de la especificación directa de las propiedades y sin incluir ningún campo opcional, realiza la siguiente solicitud POST:

POST https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/zones/ZONE/reservations

{
  "name": "RESERVATION_NAME",
  "specificReservation": {
    "count": "NUMBER_OF_VMS",
    "instanceProperties": {
      "machineType": "MACHINE_TYPE"
    }
  }
}

Reemplaza lo siguiente:

  • PROJECT_ID: el ID del proyecto en el que deseas reservar los recursos.

  • ZONE: Es la zona en la que se reservarán los recursos.

  • RESERVATION_NAME: Es el nombre de la reserva que se creará.

  • NUMBER_OF_VMS: La cantidad de VMs que se reservarán.

  • MACHINE_TYPE: Un tipo de máquina que se usará para cada VM. Si especificas un tipo de máquina A3, debes incluir el campo specificReservationRequired en el cuerpo de la solicitud y configurar el campo como true. Esto indica que solo las VMs que se dirigen a esta reserva de forma específica pueden consumirla. Para obtener más información, consulta Consume las VMs de una reserva específica.

Por ejemplo, a fin de crear una reserva en la zona us-central1-a para diez VMs, cada una con un tipo predefinido de máquina N2 con 4 CPU virtuales, realiza la siguiente solicitud POST:

POST https://compute.googleapis.com/compute/v1/projects/example-project/zones/us-central1-a/reservations

{
  "name": "my-reservation",
  "specificReservation": {
    "count": "10",
    "instanceProperties": {
      "machineType": "n2-standard-4",
    }
  }
}

De manera opcional, puedes hacer una o más de las siguientes acciones:

  • Para conectar las GPUs a tus VM N1 reservadas, incluye el campo guestAccelerators en el cuerpo de la solicitud.

    POST https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/zones/ZONE/reservations
    
    {
      "name": "RESERVATION_NAME",
      "specificReservation": {
        "count": "NUMBER_OF_VMS",
        "instanceProperties": {
          "guestAccelerators": [
            {
              "acceleratorCount": NUMBER_OF_ACCELERATORS,
              "acceleratorType": "ACCELERATOR_TYPE"
            }
          ],
          "machineType": "MACHINE_TYPE"
        }
      }
    }
    

    Reemplaza lo siguiente:

  • Para agregar uno o más discos SSDs locales a cada VM reservada, incluye el campo localSsds en el cuerpo de la solicitud. Puedes especificar hasta 24 discos SSD locales. Cada disco SSD local es de 375 GB.

    Por ejemplo, para especificar dos discos SSD locales cuando creas una reserva, realiza una solicitud de la siguiente manera:

    POST https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/zones/ZONE/reservations
    
    {
      "name": "RESERVATION_NAME",
      "specificReservation": {
        "count": "NUMBER_OF_VMS",
        "instanceProperties": {
          "localSsds": [
            {
              "diskSizeGb": "375",
              "interface": "INTERFACE_1"
            },
            {
              "diskSizeGb": "375",
              "interface": "INTERFACE_2"
            }
          ],
          "machineType": "MACHINE_TYPE"
        }
      }
    }
    

    Reemplaza INTERFACE_1 y INTERFACE_2 por el tipo de interfaz que deseas que use cada disco SSD local. Especifica uno de los siguientes valores:

    • Interfaces de disco NVMe: NVME

    • Interfaces de disco SCSI: SCSI

    Asegúrate de que el tipo de máquina que especifiques para las VMs reservadas admita las interfaces de disco elegidas. De lo contrario, la creación de la reserva fallará. Para obtener más información, consulta cómo elegir una interfaz de disco.

  • Para que las VMs reservadas usen una plataforma de CPU mínima específica en lugar de la plataforma de CPU predeterminada de la zona, incluye el campo minCpuPlatform en el cuerpo de la solicitud.

    POST https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/zones/ZONE/reservations
    
    {
      "name": "RESERVATION_NAME",
      "specificReservation": {
        "count": "NUMBER_OF_VMS",
        "instanceProperties": {
          "machineType": "MACHINE_TYPE",
          "minCpuPlatform": "MIN_CPU_PLATFORM"
        }
      }
    }
    

    Reemplaza MIN_CPU_PLATFORM por una plataforma de CPU mínima. Para asegurarte de que una plataforma de CPU esté disponible en la zona en la que reservas recursos, consulta las plataformas de CPU disponibles por zona.

  • Para especificar una política de posición compacta, a fin de reducir la latencia de red entre tus VMs reservadas, incluye el campo resourcePolicies en el cuerpo de la solicitud.

    POST https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/zones/ZONE/reservations
    
    {
      "name": "RESERVATION_NAME",
      "resourcePolicies": {
        "policy" : "projects/example-project/regions/REGION/resourcePolicies/COMPACT_PLACEMENT_POLICY_NAME"
      },
      "specificReservation": {
        "count": "NUMBER_OF_VMS",
        "instanceProperties": {
          "machineType": "MACHINE_TYPE"
        }
      },
      "specificReservationRequired": true
    }
    

    Reemplaza lo siguiente:

    • REGION: la región en la que se encuentra la política de posición compacta. Solo puedes crear la reserva dentro de la región de la política de posición.

    • COMPACT_PLACEMENT_POLICY_NAME: el nombre de una política de posición compacta existente.

    Además, para evitar errores cuando creas una reserva de un solo proyecto que especifique una política de posición compacta, asegúrate de especificar lo siguiente:

    • Un tipo de máquina compatible para las políticas de colocación compacta.

    • El campo specificReservationRequired configurado como true. Esto indica que solo las VMs que se dirigen a esta reserva de forma específica pueden consumirla.

  • Para especificar que solo las VMs que se dirigen a esta reserva de forma específica pueden consumirla, incluye el campo specificReservationRequired en el cuerpo de la solicitud y configúralo como true.

    POST https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/zones/ZONE/reservations
    
    {
      "name": "RESERVATION_NAME",
      "specificReservation": {
        "count": "NUMBER_OF_VMS",
        "instanceProperties": {
          "machineType": "MACHINE_TYPE"
        }
      },
      "specificReservationRequired": true
    }
    
  • Para permitir que una reserva de VMs con GPU sea consumida por trabajos de entrenamiento personalizados o por trabajos de predicción en Vertex AI, realiza una solicitud POST al método beta.reservations.insert. En el cuerpo de la solicitud, incluye el campo serviceShareType y configúralo como ALLOW_ALL.

    POST https://compute.googleapis.com/compute/beta/projects/PROJECT_ID/zones/ZONE/reservations
    
    {
      "name": "RESERVATION_NAME",
      "reservationSharingPolicy": {
        "serviceShareType": "ALLOW_ALL"
      },
      "specificReservation": {
        "count": "NUMBER_OF_VMS",
        "instanceProperties": {
          "machineType": "MACHINE_TYPE"
        }
      }
    }
    
  • Para permitir que Compute Engine borre automáticamente la reserva, selecciona uno de los siguientes métodos:

    • Para borrar la reserva en una fecha y hora específicas, haz una solicitud POST al método beta.reservations.insert. En el cuerpo de la solicitud, incluye el campo deleteAtTime.

      POST https://compute.googleapis.com/compute/beta/projects/PROJECT_ID/zones/ZONE/reservations
      
      {
        "deleteAtTime": "DELETE_AT_TIME",
        "name": "RESERVATION_NAME",
        "specificReservation": {
          "count": "NUMBER_OF_VMS",
          "instanceProperties": {
            "machineType": "MACHINE_TYPE"
          }
        }
      }
      

      Reemplaza DELETE_AT_TIME por una fecha y hora con formato de marca de tiempo RFC 3339, que debe ser de la siguiente manera:

      YYYY-MM-DDTHH:MM:SSOFFSET
      

      Reemplaza lo siguiente:

      • YYYY-MM-DD: una fecha con formato de un año de 4 dígitos, un mes de 2 dígitos y un día de 2 dígitos del mes separado por guiones (-).

      • HH:MM:SS: una hora con formato de hora de 2 dígitos con un formato de 24 horas, minutos de 2 dígitos y segundos de 2 dígitos separados por dos puntos (:).

      • OFFSET: la zona horaria con formato como una compensación del horario universal coordinado (UTC). Por ejemplo, para usar la hora estándar del Pacífico (PST), especifica -08:00. Como alternativa, para no usar compensación, especifica Z.

    • Para borrar la reserva después de una duración específica, haz una solicitud POST al método beta.reservations.insert. En el cuerpo de la solicitud, incluye el campo deleteAfterDuration.

      POST https://compute.googleapis.com/compute/beta/projects/PROJECT_ID/zones/ZONE/reservations
      
      {
        "deleteAfterDuration": {
          "seconds": "DELETE_AFTER_DURATION"
        },
        "name": "RESERVATION_NAME",
        "specificReservation": {
          "count": "NUMBER_OF_VMS",
          "instanceProperties": {
            "machineType": "MACHINE_TYPE"
          }
        }
      }
      

      Reemplaza DELETE_AFTER_DURATION por una duración en segundos. Por ejemplo, especifica 86400 para 86,400 segundos (1 día).

Soluciona problemas

Obtén más información sobre cómo solucionar problemas de creación de reservas.

¿Qué sigue?