Consumir reservas


Este documento explica cómo consumir reservas en Compute Engine. Para aprender a consumir reservas en otros Google Cloud productos, consulte la siguiente documentación:

Después de crear una reserva, o Compute Engine crea automáticamente una reserva para que puedas cumplir con una reserva futura, Compute Engine conserva tus recursos reservados por ti. Luego puedes usar esos recursos reservados para crear instancias de Compute Engine que coincidan con las propiedades de la reserva. Esta acción se conoce como consumir una reserva . Puede utilizar su capacidad reservada para crear instancias hasta que la reserva se consuma por completo .

Limitaciones

No puedes consumir una reserva para crear los siguientes recursos de Compute Engine:

  • Detectar máquinas virtuales o instancias interrumpibles

  • Nodos de único inquilino

Antes de comenzar

Roles requeridos

Para obtener los permisos que necesita para consumir reservas, solicite a su administrador que le otorgue el rol de IAM de Administrador de instancia informática (v1) ( roles/compute.instanceAdmin.v1 ) en el proyecto. Para obtener más información sobre cómo otorgar roles, consulte Administrar el acceso a proyectos, carpetas y organizaciones .

Este rol predefinido contiene los permisos necesarios para consumir reservas. Para ver los permisos exactos que se requieren, expanda la sección Permisos requeridos :

Permisos requeridos

Se requieren los siguientes permisos para consumir reservas:

  • Para crear reservas: compute.reservations.create en el proyecto.
  • Para crear instancias:
    • compute.instances.create en el proyecto.
    • Para usar una imagen personalizada para crear la VM: compute.images.useReadOnly en la imagen
    • Para usar una instantánea para crear la VM: compute.snapshots.useReadOnly en la instantánea
    • Para usar una plantilla de instancia para crear la VM: compute.instanceTemplates.useReadOnly en la plantilla de instancia
    • Para asignar una red heredada a la VM: compute.networks.use en el proyecto
    • Para 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 heredada: compute.networks.useExternalIp en el proyecto
    • Para especificar una subred para la VM: compute.subnetworks.use en el proyecto o en la subred elegida
    • Para asignar una dirección IP externa a la VM cuando se usa una red VPC: compute.subnetworks.useExternalIp en el proyecto o en la subred elegida
    • Para configurar metadatos de instancia de VM para la VM: compute.instances.setMetadata en el proyecto
    • Para configurar etiquetas para la VM: compute.instances.setTags en la VM
    • Para configurar etiquetas para la VM: compute.instances.setLabels en la VM
    • Para configurar una cuenta de servicio para que la use la VM: compute.instances.setServiceAccount en la VM
    • Para crear un nuevo disco para la VM: compute.disks.create en el proyecto
    • Para conectar un disco existente en modo de solo lectura o lectura-escritura: compute.disks.use en el disco
    • Para conectar un disco existente en modo de solo lectura: compute.disks.useReadOnly en el disco
  • Para crear plantillas de instancias: compute.instanceTemplates.create en el proyecto.

Es posible que también pueda obtener estos permisos con roles personalizados u otros roles predefinidos .

Consumir una reserva

Los ejemplos de las siguientes secciones muestran cómo consumir una reserva creando una única instancia informática. También puede consumir reservas creando instancias que coincidan con las propiedades de las reservas usando una opción de implementación diferente o actualizando las propiedades de las instancias existentes para que coincidan con las reservas consumidas automáticamente.

Para consumir una reserva, utilice uno de los siguientes métodos:

Consumir una reserva consumida automáticamente

Cuando crea una reserva consumida automáticamente, las instancias informáticas que coinciden con las propiedades de la reserva la consumen automáticamente. Este comportamiento de consumo se aplica tanto a instancias en ejecución nuevas como existentes. Cuando creas reservas, o Compute Engine crea automáticamente una reserva para cumplir con una reserva futura, este tipo de reserva es la configuración predeterminada.

Si las propiedades de una reserva automática de proyecto único y una reserva automática compartida coinciden, las instancias de su proyecto consumen primero la reserva de proyecto único y luego consumen la reserva compartida. Para más información, consulta el orden de consumo para reservas .

Para crear y consumir una reserva automática de ejemplo, seleccione una de las siguientes opciones:

Consola

El siguiente ejemplo muestra cómo crear una reserva automática en la zona us-central1-a para tres instancias N2 con 32 vCPU e Intel Cascade Lake como plataforma de CPU mínima. También muestra cómo crear una instancia única para consumir la reserva.

Para crear la reserva automática de ejemplo y consumirla, haga lo siguiente:

  1. Para crear una reserva de ejemplo, complete los siguientes pasos:

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

      Ir a Reservas

    2. En la pestaña Reserva bajo demanda (predeterminada), haga clic en Crear reserva . Aparece la página Crear una reserva .

    3. En el campo Nombre , ingrese un nombre para la reserva. Por ejemplo, ingrese reservation-01 .

    4. Seleccione la Región y Zona donde reservar recursos. Por ejemplo, seleccione us-central1 y us-central1-a respectivamente.

    5. En la sección Tipo de recurso compartido , realice una de las siguientes acciones:

      • Para crear una reserva de un solo proyecto, seleccione Local .

      • Para crear una reserva compartida, seleccione Compartido y luego especifique los proyectos con los que desea compartir la reserva.

    6. En la sección Usar con instancia de VM , seleccione Usar reserva automáticamente , si aún no está seleccionado.

    7. En el campo Número de instancias de VM , ingrese 3 .

    8. En la pestaña Propósito general , seleccione N2 .

    9. En la sección Tipo de máquina , en la pestaña Preestablecido (predeterminado), seleccione n2-standard-32 .

    10. Expanda Plataforma de CPU y GPU y luego, en el campo Plataforma de CPU , seleccione Intel Cascade Lake o posterior .

    11. Haga clic en Crear .

  2. Para crear una instancia que consuma la reserva de ejemplo, complete los siguientes pasos:

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

      Ir a Crear una instancia

      Aparece la página Crear una instancia y muestra el panel de configuración de la máquina .

    2. En el panel de configuración de la máquina, haga lo siguiente:

      1. En el campo Nombre , ingrese un nombre para la instancia. Para este ejemplo, ingrese instance-01 .

      2. Especifique la Región y Zona donde reservar recursos. Para este ejemplo, seleccione us-central1 y us-central1-a respectivamente.

      3. En la pestaña Propósito general , seleccione N2 .

      4. En la sección Tipo de máquina , en la pestaña Preestablecido (predeterminado), seleccione n2-standard-32 .

      5. Expanda la sección Opciones avanzadas y luego, en el campo Plataforma de CPU , seleccione Intel Cascade Lake o posterior .

    3. En el menú de navegación, haga clic en Avanzado .

    4. En la sección Reservas del panel Avanzado , seleccione Usar selección automática , si aún no está seleccionado.

    5. Haga clic en Crear .

nube de gcloud

El siguiente ejemplo muestra cómo crear una reserva automática en la zona us-central1-a para tres instancias N2 con 32 vCPU e Intel Cascade Lake como plataforma de CPU mínima. También muestra cómo crear una instancia única para consumir la reserva.

Para crear la reserva automática de ejemplo y consumirla, haga lo siguiente:

  1. Para crear la reserva de ejemplo, usa el comando gcloud compute reservations create :

    gcloud compute reservations create reservation-01 \
        --machine-type=n2-standard-32 \
        --min-cpu-platform="Intel Cascade Lake" \
        --vm-count=3 \
        --zone=us-central1-a
    
  2. Para crear una instancia que consuma la reserva de ejemplo, use el comando gcloud compute instances create con el indicador --reservation-affinity establecido en any . Dado que any es la configuración predeterminada, también puede omitir este indicador.

    gcloud compute instances create instance-01 \
        --machine-type=n2-standard-32 \
        --min-cpu-platform="Intel Cascade Lake" \
        --reservation-affinity=any \
        --zone=us-central1-a
    

Ir

Para crear la reserva automática de ejemplo usando una plantilla de instancia y crear una instancia para consumir la reserva usando la misma plantilla, use el siguiente código de ejemplo:

import (
	"context"
	"fmt"
	"io"

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

// consumeAnyReservation creates instance, consuming any available reservation
func consumeAnyReservation(w io.Writer, projectID, zone, instanceName, sourceTemplate string) error {
	// projectID := "your_project_id"
	// zone := "us-west3-a"
	// instanceName := "your_instance_name"
	// sourceTemplate: 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()

	instancesClient, err := compute.NewInstancesRESTClient(ctx)
	if err != nil {
		return fmt.Errorf("NewInstancesRESTClient: %w", err)
	}
	defer instancesClient.Close()

	req := &computepb.InsertInstanceRequest{
		Project:                projectID,
		Zone:                   zone,
		SourceInstanceTemplate: proto.String(sourceTemplate),
		InstanceResource: &computepb.Instance{
			Name: proto.String(instanceName),
			// specifies that any matching reservation should be consumed
			ReservationAffinity: &computepb.ReservationAffinity{
				ConsumeReservationType: proto.String("ANY_RESERVATION"),
			},
		},
	}

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

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

	return nil
}

Java

El siguiente ejemplo muestra cómo crear una instancia N1 con cuatro vCPU e Intel Skylake como plataforma de CPU mínima en la zona us-central1-a . La instancia consume automáticamente una reserva coincidente.

Para crear la instancia de ejemplo, utilice el siguiente código de ejemplo:

import static com.google.cloud.compute.v1.ReservationAffinity.ConsumeReservationType.ANY_RESERVATION;

import com.google.api.gax.longrunning.OperationFuture;
import com.google.cloud.compute.v1.AttachedDisk;
import com.google.cloud.compute.v1.AttachedDiskInitializeParams;
import com.google.cloud.compute.v1.InsertInstanceRequest;
import com.google.cloud.compute.v1.Instance;
import com.google.cloud.compute.v1.InstancesClient;
import com.google.cloud.compute.v1.NetworkInterface;
import com.google.cloud.compute.v1.Operation;
import com.google.cloud.compute.v1.ReservationAffinity;
import java.io.IOException;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.TimeoutException;

public class ConsumeAnyMatchingReservation {

  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";
    // Zone where the VM instance will be created.
    String zone = "us-central1-a";
    // Name of the VM instance you want to query.
    String instanceName = "YOUR_INSTANCE_NAME";
    // machineType: machine type of the VM being created.
    // *   For a list of machine types, see https://cloud.google.com/compute/docs/machine-types
    String machineTypeName = "n1-standard-4";
    // sourceImage: path to the operating system image to mount.
    // *   For details about images you can mount, see https://cloud.google.com/compute/docs/images
    String sourceImage = "projects/debian-cloud/global/images/family/debian-11";
    // diskSizeGb: storage size of the boot disk to attach to the instance.
    long diskSizeGb = 10L;
    // networkName: network interface to associate with the instance.
    String networkName = "default";
    // Minimum CPU platform of the instances.
    String minCpuPlatform = "Intel Skylake";

    createInstanceAsync(projectId, zone, instanceName, machineTypeName, sourceImage,
        diskSizeGb, networkName, minCpuPlatform);
  }

  // Create a virtual machine targeted with the reserveAffinity field.
  // In this consumption model, existing and new VMs automatically consume a reservation
  // if their properties match the VM properties specified in the reservation.
  public static Instance createInstanceAsync(String projectId, String zone,
      String instanceName, String machineTypeName, String sourceImage,
      long diskSizeGb, String networkName, String minCpuPlatform)
      throws IOException, InterruptedException, ExecutionException, TimeoutException {
    String machineType = String.format("zones/%s/machineTypes/%s", zone, machineTypeName);
    // 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 instancesClient = InstancesClient.create()) {
      AttachedDisk disk =
          AttachedDisk.newBuilder()
              .setBoot(true)
              .setAutoDelete(true)
              .setType(AttachedDisk.Type.PERSISTENT.toString())
              .setDeviceName("disk-1")
              .setInitializeParams(
                  AttachedDiskInitializeParams.newBuilder()
                      .setSourceImage(sourceImage)
                      .setDiskSizeGb(diskSizeGb)
                      .build())
              .build();

      NetworkInterface networkInterface = NetworkInterface.newBuilder()
          .setName(networkName)
          .build();

      ReservationAffinity reservationAffinity =
          ReservationAffinity.newBuilder()
              .setConsumeReservationType(ANY_RESERVATION.toString())
              .build();

      Instance instanceResource =
          Instance.newBuilder()
              .setName(instanceName)
              .setMachineType(machineType)
              .addDisks(disk)
              .addNetworkInterfaces(networkInterface)
              .setMinCpuPlatform(minCpuPlatform)
              .setReservationAffinity(reservationAffinity)
              .build();

      InsertInstanceRequest insertInstanceRequest = InsertInstanceRequest.newBuilder()
          .setProject(projectId)
          .setZone(zone)
          .setInstanceResource(instanceResource)
          .build();

      OperationFuture<Operation, Operation> operation = instancesClient.insertAsync(
          insertInstanceRequest);

      Operation response = operation.get(3, TimeUnit.MINUTES);

      if (response.hasError()) {
        return null;
      }
      return instancesClient.get(projectId, zone, instanceName);
    }
  }
}

Nodo.js

El siguiente ejemplo muestra cómo crear una instancia N1 con cuatro vCPU e Intel Skylake como plataforma de CPU mínima en la zona us-central1-a . La instancia consume automáticamente una reserva coincidente.

Para crear la instancia de ejemplo, utilice el siguiente código de ejemplo:

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

// Instantiate a reservationsClient
const instancesClient = new computeLib.InstancesClient();
// 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 create instance.
const projectId = await instancesClient.getProjectId();
// The zone in which to create instance.
const zone = 'us-central1-a';
// The name of the instance to create.
// const instanceName = 'instance-01';
// Machine type to use for VM.
const machineType = 'n1-standard-4';

// Create instance to consume reservation if their properties match the VM properties
async function callCreateInstanceToConsumeAnyReservation() {
  // Describe the size and source image of the boot disk to attach to the instance.
  const disk = new compute.Disk({
    boot: true,
    autoDelete: true,
    type: 'PERSISTENT',
    initializeParams: {
      diskSizeGb: '10',
      sourceImage: 'projects/debian-cloud/global/images/family/debian-12',
    },
  });

  //  Define networkInterface
  const networkInterface = new compute.NetworkInterface({
    name: 'global/networks/default',
  });

  // Define reservationAffinity
  const reservationAffinity = new compute.ReservationAffinity({
    consumeReservationType: 'ANY_RESERVATION',
  });

  // Create an instance
  const instance = new compute.Instance({
    name: instanceName,
    machineType: `zones/${zone}/machineTypes/${machineType}`,
    minCpuPlatform: 'Intel Skylake',
    disks: [disk],
    networkInterfaces: [networkInterface],
    reservationAffinity,
  });

  const [response] = await instancesClient.insert({
    project: projectId,
    instanceResource: instance,
    zone,
  });

  let operation = response.latestResponse;

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

  console.log(`Instance ${instanceName} created.`);
}

await callCreateInstanceToConsumeAnyReservation();

Pitón

El siguiente ejemplo muestra cómo crear una reserva automática en la zona us-central1-a para tres instancias N1 con una vCPU e Intel Ivy como plataforma de CPU mínima. También muestra cómo crear una instancia única para consumir la reserva.

Para crear la reserva automática de ejemplo y consumirla, haga lo siguiente:

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 consume_any_project_reservation(
    project_id: str,
    zone: str,
    reservation_name: str,
    instance_name: str,
    machine_type: str = "n1-standard-1",
    min_cpu_platform: str = "Intel Ivy Bridge",
) -> compute_v1.Instance:
    """
    Creates a specific reservation in a single project and launches a VM
    that consumes the newly created reservation.
    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.
        instance_name (str): The name of the instance to create.
        machine_type (str): The machine type for the instance.
        min_cpu_platform (str): The minimum CPU platform for the instance.
    """
    instance_properties = (
        compute_v1.AllocationSpecificSKUAllocationReservedInstanceProperties(
            machine_type=machine_type,
            min_cpu_platform=min_cpu_platform,
        )
    )

    reservation = compute_v1.Reservation(
        name=reservation_name,
        specific_reservation=compute_v1.AllocationSpecificSKUReservation(
            count=3,
            instance_properties=instance_properties,
        ),
    )

    # Create a reservation client
    client = compute_v1.ReservationsClient()
    operation = client.insert(
        project=project_id,
        zone=zone,
        reservation_resource=reservation,
    )
    wait_for_extended_operation(operation, "Reservation creation")

    instance = compute_v1.Instance()
    instance.name = instance_name
    instance.machine_type = f"zones/{zone}/machineTypes/{machine_type}"
    instance.min_cpu_platform = min_cpu_platform
    instance.zone = zone

    # Set the reservation affinity to target any matching reservation
    instance.reservation_affinity = compute_v1.ReservationAffinity(
        consume_reservation_type="ANY_RESERVATION",  # Type of reservation to consume
    )
    # Define the disks for the instance
    instance.disks = [
        compute_v1.AttachedDisk(
            boot=True,  # Indicates that this is a boot disk
            auto_delete=True,  # The disk will be deleted when the instance is deleted
            initialize_params=compute_v1.AttachedDiskInitializeParams(
                source_image="projects/debian-cloud/global/images/family/debian-11",
                disk_size_gb=10,
            ),
        )
    ]
    instance.network_interfaces = [
        compute_v1.NetworkInterface(
            network="global/networks/default",  # The network to use
            access_configs=[
                compute_v1.AccessConfig(
                    name="External NAT",  # Name of the access configuration
                    type="ONE_TO_ONE_NAT",  # Type of access configuration
                )
            ],
        )
    ]
    # Create a request to insert the instance
    request = compute_v1.InsertInstanceRequest()
    request.zone = zone
    request.project = project_id
    request.instance_resource = instance

    vm_client = compute_v1.InstancesClient()
    operation = vm_client.insert(request)
    wait_for_extended_operation(operation, "instance creation")
    print(f"Instance {instance_name} that targets any open reservation created.")

    return vm_client.get(project=project_id, zone=zone, instance=instance_name)

DESCANSAR

El siguiente ejemplo muestra cómo crear una reserva automática en la zona us-central1-a para tres instancias N2 con 32 vCPU e Intel Cascade Lake como plataforma de CPU mínima. También muestra cómo crear una instancia única para consumir la reserva.

Para crear la reserva automática de ejemplo y consumirla, haga lo siguiente:

  1. Para crear la reserva de ejemplo, realice una solicitud POST al método reservations.insert :

    POST https://compute.googleapis.com/compute/v1/projects/example-project/zones/us-central1-a/reservations
    
    {
      "name": "reservation-01",
      "specificReservation": {
        "count": "3",
        "instanceProperties": {
          "machineType": "n2-standard-32",
          "minCpuPlatform": "Intel Cascade Lake",
        }
      }
    }
    
  2. Para crear una instancia que consuma la reserva de ejemplo, realice una solicitud POST al método instances.insert . En el cuerpo de la solicitud, incluya el campo consumeReservationType establecido en ANY_RESERVATION . Sin embargo, como ANY_RESERVATION es la configuración predeterminada, también puede omitir el campo.

    POST https://compute.googleapis.com/compute/v1/projects/example-project/zones/us-central1-a/instances
    
    {
      "name": "instance-01",
      "machineType": "zones/us-central1-a/machineTypes/n2-standard-32",
      "minCpuPlatform": "Intel Cascade Lake",
      "disks": [
        {
          "boot": true,
          "initializeParams": {
            "sourceImage": "projects/debian-cloud/global/images/family/debian-12"
          }
        }
      ],
      "networkInterfaces": [
        {
          "network": "global/networks/default"
        }
      ],
      "reservationAffinity": {
        "consumeReservationType": "ANY_RESERVATION"
      }
    }
    

Consumir una reserva específicamente dirigida

Las reservas dirigidas específicamente permiten que las nuevas instancias informáticas consuman una reserva coincidente solo si las instancias apuntan a la reserva. Las instancias se crean correctamente solo si sus propiedades coinciden con las propiedades de la reserva. De lo contrario, encontrará errores.

Según el método de creación que desee utilizar, cree reservas e instancias específicas dirigidas a ellas de la siguiente manera:

Método de creación Cuando creas una reserva Cuando creas instancias
Consola de Google Cloud En la sección Usar con instancia de VM , seleccione Seleccionar reserva específica . En el panel Avanzado , en la sección Reservas , seleccione Elegir una reserva .
CLI de Google Cloud Incluya la marca --require-specific-reservation . Incluya las siguientes banderas:
  • El indicador --reservation-affinity establecido en specific .
  • El indicador --reservation se establece en la URL de la reserva.
Ir Incluya el campo SpecificReservationRequired establecido en true . En el campo ReservationAffinity , incluya los siguientes campos:
  • El campo ConsumeReservationType establecido en SPECIFIC_RESERVATION .
  • El campo Key está configurado en compute.googleapis.com/reservation-name .
  • El campo Values se establece en la URL de la reserva.
Java Incluya el campo setSpecificReservationRequired establecido en true . En el campo ReservationAffinity , incluya los siguientes campos:
  • El campo setConsumeReservationType establecido en SPECIFIC_RESERVATION .
  • El campo setKey está configurado en compute.googleapis.com/reservation-name .
  • El campo addValues ​​establecido en la URL de la reserva.
Node.js y API REST Incluya el campo specificReservationRequired establecido en true . En el campo reservationAffinity , incluya los siguientes campos:
  • El campo consumeReservationType establecido en SPECIFIC_RESERVATION .
  • El campo key está configurado en compute.googleapis.com/reservation-name .
  • El campo values se establece en la URL de la reserva.
Python y Terraform Incluya el specific_reservation_required establecido en true . En el campo reservation_affinity , incluya los siguientes campos:
  • El campo consume_reservation_type establecido en SPECIFIC_RESERVATION .
  • El campo key está configurado en compute.googleapis.com/reservation-name .
  • El campo values se establece en la URL de la reserva.

Para crear una reserva específica de ejemplo y una instancia para consumirla, seleccione una de las siguientes opciones:

Consola

El siguiente ejemplo muestra cómo crear una reserva específica en la zona us-central1-a para tres instancias N2 con 32 vCPU e Intel Cascade Lake como plataforma de CPU mínima. También muestra cómo crear una instancia única para consumir la reserva.

Para crear la reserva específica de ejemplo y consumirla, haga lo siguiente:

  1. Para crear una reserva de ejemplo, complete los siguientes pasos:

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

      Ir a Reservas

    2. En la pestaña Reserva bajo demanda (predeterminada), haga clic en Crear reserva . Aparece la página Crear una reserva .

    3. En el campo Nombre , ingrese un nombre para la reserva. Por ejemplo, ingrese reservation-02 .

    4. Especifique la Región y Zona donde reservar recursos. Para este ejemplo, seleccione us-central1 y us-central1-a respectivamente.

    5. En la sección Tipo de recurso compartido , realice una de las siguientes acciones:

      • Para crear una reserva de un solo proyecto, seleccione Local .

      • Para crear una reserva compartida, seleccione Compartido y luego especifique los proyectos con los que desea compartir la reserva.

    6. En la sección Usar con instancia de VM , seleccione Seleccionar reserva específica .

    7. En el campo Número de instancias de VM , ingrese 3 .

    8. En la pestaña Propósito general , seleccione N2 .

    9. En la sección Tipo de máquina , en la pestaña Preestablecido (predeterminado), seleccione n2-standard-32 .

    10. Expanda Plataforma de CPU y GPU y luego, en el campo Plataforma de CPU , seleccione Intel Cascade Lake o posterior .

    11. Haga clic en Crear .

  2. Para crear una instancia que consuma la reserva de ejemplo, complete los siguientes pasos:

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

      Ir a Crear una instancia

      Aparece la página Crear una instancia y muestra el panel de configuración de la máquina .

    2. En el panel de configuración de la máquina, haga lo siguiente:

      1. En el campo Nombre , ingrese un nombre para la instancia. Para este ejemplo, ingrese instance-02 .

      2. Especifique la Región y Zona donde reservar recursos. Para este ejemplo, seleccione us-central1 y us-central1-a respectivamente.

      3. En la pestaña Propósito general , seleccione N2 .

      4. En la sección Tipo de máquina , en la pestaña Preestablecido (predeterminado), seleccione n2-standard-32 .

      5. Expanda la sección Opciones avanzadas y luego, en el campo Plataforma de CPU , seleccione Intel Cascade Lake o posterior .

    3. En el menú de navegación, haga clic en Avanzado .

    4. En la sección Reservas del panel Avanzado , seleccione Elegir una reserva y luego haga clic en Elegir reserva .

    5. En el panel Elegir una reserva que aparece, haga lo siguiente:

      1. Seleccione la reserva específica que creó en los pasos anteriores. Si desea consumir una reserva compartida que existe en un proyecto diferente, en la lista Proyecto , seleccione el proyecto en el que existe la reserva.

      2. Haga clic en Elegir .

    6. Haga clic en Crear .

nube de gcloud

El siguiente ejemplo muestra cómo crear una reserva específica en la zona us-central1-a para tres instancias N2 con 32 vCPU e Intel Cascade Lake como plataforma de CPU mínima. También muestra cómo crear una instancia única para consumir la reserva.

Para crear la reserva específica de ejemplo y consumirla, haga lo siguiente:

  1. Para crear la reserva de ejemplo, usa el comando gcloud compute reservations create con la marca --require-specific-reservation :

    gcloud compute reservations create reservation-02 \
        --machine-type=n2-standard-32 \
        --min-cpu-platform="Intel Cascade Lake" \
        --require-specific-reservation \
        --vm-count=3 \
        --zone=us-central1-a
    
  2. Para crear una instancia que consuma la reserva de ejemplo, usa el gcloud compute instances create con las marcas --reservation y --reservation-affinity=specific :

    gcloud compute instances create instance-02 \
        --machine-type=n2-standard-32 \
        --min-cpu-platform="Intel Cascade Lake" \
        --reservation-affinity=specific \
        --reservation=RESERVATION_URL \
        --zone=us-central1-a
    

    Reemplace RESERVATION_URL con la URL de la reserva. Especifique uno de los siguientes valores:

    • Si creaste la reserva en el mismo proyecto: reservation-02

    • Si la reserva está en un proyecto diferente: projects/ PROJECT_ID /reservations/reservation-02

Ir

Los siguientes ejemplos muestran cómo crear una instancia N2 con 32 vCPU e Intel Cascade Lake como plataforma de CPU mínima, en la zona us-central1-a para consumir una reserva coincidente específica:

  • Para crear la instancia de ejemplo para consumir una reserva específica de un solo proyecto, utilice el siguiente código de ejemplo:

    import (
    	"context"
    	"fmt"
    	"io"
    
    	compute "cloud.google.com/go/compute/apiv1"
    	computepb "cloud.google.com/go/compute/apiv1/computepb"
    	"google.golang.org/protobuf/proto"
    )
    
    // consumeSpecificReservation creates instance, consuming specific reservation
    // Note: respective reservation should have SpecificReservationRequired: true
    func consumeSpecificReservation(w io.Writer, projectID, zone, instanceName, reservationName string) error {
    	// projectID := "your_project_id"
    	// zone := "us-west3-a"
    	// reservationName := "your_reservation_name"
    	// instanceName := "your_instance_name"
    
    	ctx := context.Background()
    	machineType := fmt.Sprintf("zones/%s/machineTypes/%s", zone, "n2-standard-32")
    	sourceImage := "projects/debian-cloud/global/images/family/debian-12"
    
    	instancesClient, err := compute.NewInstancesRESTClient(ctx)
    	if err != nil {
    		return fmt.Errorf("NewInstancesRESTClient: %w", err)
    	}
    	defer instancesClient.Close()
    
    	req := &computepb.InsertInstanceRequest{
    		Project: projectID,
    		Zone:    zone,
    		InstanceResource: &computepb.Instance{
    			Disks: []*computepb.AttachedDisk{
    				{
    					InitializeParams: &computepb.AttachedDiskInitializeParams{
    						DiskSizeGb:  proto.Int64(10),
    						SourceImage: proto.String(sourceImage),
    					},
    					AutoDelete: proto.Bool(true),
    					Boot:       proto.Bool(true),
    					Type:       proto.String(computepb.AttachedDisk_PERSISTENT.String()),
    				},
    			},
    			MachineType:    proto.String(machineType),
    			MinCpuPlatform: proto.String("Intel Cascade Lake"),
    			Name:           proto.String(instanceName),
    			NetworkInterfaces: []*computepb.NetworkInterface{
    				{
    					Name: proto.String("global/networks/default"),
    				},
    			},
    			// specifies particular reservation, which should be consumed
    			ReservationAffinity: &computepb.ReservationAffinity{
    				ConsumeReservationType: proto.String("SPECIFIC_RESERVATION"),
    				Key:                    proto.String("compute.googleapis.com/reservation-name"),
    				Values:                 []string{reservationName},
    			},
    		},
    	}
    
    	op, err := instancesClient.Insert(ctx, req)
    	if err != nil {
    		return fmt.Errorf("unable to create instance: %w", err)
    	}
    
    	if err = op.Wait(ctx); err != nil {
    		return fmt.Errorf("unable to wait for the operation: %w", err)
    	}
    	fmt.Fprintf(w, "Instance created from reservation\n")
    
    	return nil
    }
    
  • Para crear la instancia de ejemplo para consumir una reserva específica compartida, utilice el siguiente ejemplo de código:

    import (
    	"context"
    	"fmt"
    	"io"
    
    	computepb "cloud.google.com/go/compute/apiv1/computepb"
    	"google.golang.org/protobuf/proto"
    )
    
    // consumeSpecificSharedReservation consumes specific shared reservation in particular zone
    func consumeSpecificSharedReservation(w io.Writer, client InstanceClientInterface, projectID, baseProjectId, zone, instanceName, reservationName string) error {
    	// client, err := compute.NewInstancesRESTClient(ctx)
    	// projectID := "your_project_id". Project where reservation is created.
    	// baseProjectId := "shared_project_id". Project where instance will be consumed and created.
    	// zone := "us-west3-a"
    	// reservationName := "your_reservation_name"
    	// instanceName := "your_instance_name"
    
    	ctx := context.Background()
    	machineType := fmt.Sprintf("zones/%s/machineTypes/%s", zone, "n2-standard-32")
    	sourceImage := "projects/debian-cloud/global/images/family/debian-12"
    	sharedReservation := fmt.Sprintf("projects/%s/reservations/%s", baseProjectId, reservationName)
    
    	req := &computepb.InsertInstanceRequest{
    		Project: projectID,
    		Zone:    zone,
    		InstanceResource: &computepb.Instance{
    			Disks: []*computepb.AttachedDisk{
    				{
    					InitializeParams: &computepb.AttachedDiskInitializeParams{
    						DiskSizeGb:  proto.Int64(10),
    						SourceImage: proto.String(sourceImage),
    					},
    					AutoDelete: proto.Bool(true),
    					Boot:       proto.Bool(true),
    					Type:       proto.String(computepb.AttachedDisk_PERSISTENT.String()),
    				},
    			},
    			MachineType:    proto.String(machineType),
    			MinCpuPlatform: proto.String("Intel Cascade Lake"),
    			Name:           proto.String(instanceName),
    			NetworkInterfaces: []*computepb.NetworkInterface{
    				{
    					Name: proto.String("global/networks/default"),
    				},
    			},
    			// specifies particular reservation, which should be consumed
    			ReservationAffinity: &computepb.ReservationAffinity{
    				ConsumeReservationType: proto.String("SPECIFIC_RESERVATION"),
    				Key:                    proto.String("compute.googleapis.com/reservation-name"),
    				Values:                 []string{sharedReservation},
    			},
    		},
    	}
    
    	op, err := client.Insert(ctx, req)
    	if err != nil {
    		return fmt.Errorf("unable to create instance: %w", err)
    	}
    
    	if op != nil {
    		if err = op.Wait(ctx); err != nil {
    			return fmt.Errorf("unable to wait for the operation: %w", err)
    		}
    	}
    	fmt.Fprintf(w, "Instance created from shared reservation\n")
    
    	return nil
    }
    

Java

Los siguientes ejemplos muestran cómo crear una instancia N1 con cuatro vCPU e Intel Skylake como plataforma de CPU mínima, en la zona us-central1-a para consumir una reserva coincidente específica:

  • Para crear una reserva de ejemplo como reserva de un solo proyecto y crear una instancia para consumirla, utilice el siguiente código de ejemplo:

    import static com.google.cloud.compute.v1.ReservationAffinity.ConsumeReservationType.SPECIFIC_RESERVATION;
    
    import com.google.api.gax.longrunning.OperationFuture;
    import com.google.cloud.compute.v1.AttachedDisk;
    import com.google.cloud.compute.v1.AttachedDiskInitializeParams;
    import com.google.cloud.compute.v1.InsertInstanceRequest;
    import com.google.cloud.compute.v1.Instance;
    import com.google.cloud.compute.v1.InstancesClient;
    import com.google.cloud.compute.v1.NetworkInterface;
    import com.google.cloud.compute.v1.Operation;
    import com.google.cloud.compute.v1.ReservationAffinity;
    import java.io.IOException;
    import java.util.concurrent.ExecutionException;
    import java.util.concurrent.TimeUnit;
    import java.util.concurrent.TimeoutException;
    
    public class ConsumeSingleProjectReservation {
      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 where the reservation is located.
        String zone = "us-central1-a";
        // Name of the reservation you want to query.
        String reservationName = "YOUR_RESERVATION_NAME";
        // Name of the VM instance you want to query.
        String instanceName = "YOUR_INSTANCE_NAME";
        // machineType: machine type of the VM being created.
        // *   For a list of machine types, see https://cloud.google.com/compute/docs/machine-types
        String machineTypeName = "n1-standard-4";
        // sourceImage: path to the operating system image to mount.
        // *   For details about images you can mount, see https://cloud.google.com/compute/docs/images
        String sourceImage = "projects/debian-cloud/global/images/family/debian-11";
        // diskSizeGb: storage size of the boot disk to attach to the instance.
        long diskSizeGb = 10L;
        // networkName: network interface to associate with the instance.
        String networkName = "default";
        // Minimum CPU platform of the instances.
        String minCpuPlatform = "Intel Skylake";
    
        createInstanceAsync(projectId, zone, instanceName, reservationName, machineTypeName,
            sourceImage, diskSizeGb, networkName, minCpuPlatform);
      }
    
      // Create a virtual machine targeted with the reserveAffinity field.
      // Ensure that the VM's properties match the reservation's VM properties.
      public static Instance createInstanceAsync(String projectId, String zone, String instanceName,
          String reservationName, String machineTypeName, String sourceImage, long diskSizeGb,
          String networkName, String minCpuPlatform)
          throws IOException, InterruptedException, ExecutionException, TimeoutException {
        String machineType = String.format("zones/%s/machineTypes/%s", zone, machineTypeName);
        // 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 instancesClient = InstancesClient.create()) {
          AttachedDisk disk =
              AttachedDisk.newBuilder()
                  .setBoot(true)
                  .setAutoDelete(true)
                  .setType(AttachedDisk.Type.PERSISTENT.toString())
                  .setDeviceName("disk-1")
                  .setInitializeParams(
                      AttachedDiskInitializeParams.newBuilder()
                          .setSourceImage(sourceImage)
                          .setDiskSizeGb(diskSizeGb)
                          .build())
                  .build();
    
          NetworkInterface networkInterface = NetworkInterface.newBuilder()
              .setName(networkName)
              .build();
    
          ReservationAffinity reservationAffinity =
              ReservationAffinity.newBuilder()
                  .setConsumeReservationType(SPECIFIC_RESERVATION.toString())
                  .setKey("compute.googleapis.com/reservation-name")
                  // Set specific reservation
                  .addValues(reservationName)
                  .build();
    
          Instance instanceResource =
              Instance.newBuilder()
                  .setName(instanceName)
                  .setMachineType(machineType)
                  .addDisks(disk)
                  .addNetworkInterfaces(networkInterface)
                  .setMinCpuPlatform(minCpuPlatform)
                  .setReservationAffinity(reservationAffinity)
                  .build();
    
          InsertInstanceRequest insertInstanceRequest = InsertInstanceRequest.newBuilder()
              .setProject(projectId)
              .setZone(zone)
              .setInstanceResource(instanceResource)
              .build();
    
          OperationFuture<Operation, Operation> operation = instancesClient.insertAsync(
              insertInstanceRequest);
          Operation response = operation.get(3, TimeUnit.MINUTES);
    
          if (response.hasError()) {
            return null;
          }
          return instancesClient.get(projectId, zone, instanceName);
        }
      }
    }
  • Para crear una reserva de ejemplo como reserva compartida y crear una instancia para consumirla, utilice el siguiente código de ejemplo:

    import static com.google.cloud.compute.v1.ReservationAffinity.ConsumeReservationType.SPECIFIC_RESERVATION;
    
    import com.google.api.gax.longrunning.OperationFuture;
    import com.google.cloud.compute.v1.AttachedDisk;
    import com.google.cloud.compute.v1.AttachedDiskInitializeParams;
    import com.google.cloud.compute.v1.InsertInstanceRequest;
    import com.google.cloud.compute.v1.Instance;
    import com.google.cloud.compute.v1.InstancesClient;
    import com.google.cloud.compute.v1.NetworkInterface;
    import com.google.cloud.compute.v1.Operation;
    import com.google.cloud.compute.v1.ReservationAffinity;
    import java.io.IOException;
    import java.util.concurrent.ExecutionException;
    import java.util.concurrent.TimeUnit;
    import java.util.concurrent.TimeoutException;
    
    public class ConsumeSpecificSharedReservation {
      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 the reservation is located.
        String zone = "us-central1-a";
        // Name of the reservation you want to query.
        String reservationName = "YOUR_RESERVATION_NAME";
        // Name of the VM instance you want to query.
        String instanceName = "YOUR_INSTANCE_NAME";
        // machineType: machine type of the VM being created.
        // *   For a list of machine types, see https://cloud.google.com/compute/docs/machine-types
        String machineTypeName = "n1-standard-4";
        // sourceImage: path to the operating system image to mount.
        // *   For details about images you can mount, see https://cloud.google.com/compute/docs/images
        String sourceImage = "projects/debian-cloud/global/images/family/debian-11";
        // diskSizeGb: storage size of the boot disk to attach to the instance.
        long diskSizeGb = 10L;
        // networkName: network interface to associate with the instance.
        String networkName = "default";
        // Minimum CPU platform of the instances.
        String minCpuPlatform = "Intel Skylake";
    
        createInstanceAsync(projectId, zone, instanceName, reservationName, machineTypeName,
            sourceImage, diskSizeGb, networkName, minCpuPlatform);
      }
    
      // Create a virtual machine targeted with the reserveAffinity field.
      // Ensure that the VM's properties match the reservation's VM properties.
      public static Instance createInstanceAsync(String projectId, String zone, String instanceName,
          String reservationName, String machineTypeName, String sourceImage, long diskSizeGb,
          String networkName, String minCpuPlatform)
          throws IOException, InterruptedException, ExecutionException, TimeoutException {
        String machineType = String.format("zones/%s/machineTypes/%s", zone, machineTypeName);
        // To consume this reservation from any consumer projects that this reservation is shared with,
        // you must also specify the owner project of the reservation - the path to the reservation.
        String reservationPath =
            String.format("projects/%s/reservations/%s", projectId, reservationName);
        // 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 instancesClient = InstancesClient.create()) {
          AttachedDisk disk =
              AttachedDisk.newBuilder()
                  .setBoot(true)
                  .setAutoDelete(true)
                  .setType(AttachedDisk.Type.PERSISTENT.toString())
                  .setDeviceName("disk-1")
                  .setInitializeParams(
                      AttachedDiskInitializeParams.newBuilder()
                          .setSourceImage(sourceImage)
                          .setDiskSizeGb(diskSizeGb)
                          .build())
                  .build();
    
          NetworkInterface networkInterface = NetworkInterface.newBuilder()
              .setName(networkName)
              .build();
    
          ReservationAffinity reservationAffinity =
              ReservationAffinity.newBuilder()
                  .setConsumeReservationType(SPECIFIC_RESERVATION.toString())
                  .setKey("compute.googleapis.com/reservation-name")
                  // Set specific reservation
                  .addValues(reservationPath)
                  .build();
    
          Instance instanceResource =
              Instance.newBuilder()
                  .setName(instanceName)
                  .setMachineType(machineType)
                  .addDisks(disk)
                  .addNetworkInterfaces(networkInterface)
                  .setMinCpuPlatform(minCpuPlatform)
                  .setReservationAffinity(reservationAffinity)
                  .build();
    
          InsertInstanceRequest insertInstanceRequest = InsertInstanceRequest.newBuilder()
              .setProject(projectId)
              .setZone(zone)
              .setInstanceResource(instanceResource)
              .build();
    
          OperationFuture<Operation, Operation> operation = instancesClient.insertAsync(
              insertInstanceRequest);
          Operation response = operation.get(3, TimeUnit.MINUTES);
    
          if (response.hasError()) {
            return null;
          }
          return instancesClient.get(projectId, zone, instanceName);
        }
      }
    }

Nodo.js

Los siguientes ejemplos muestran cómo crear una instancia N1 con 4 vCPU e Intel Skylake como plataforma de CPU mínima, en la zona us-central1-a para consumir una reserva coincidente específica:

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

// Instantiate a reservationsClient
const instancesClient = new computeLib.InstancesClient();
// 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 create instance.
const projectId = await instancesClient.getProjectId();
// The zone in which to create instance.
const zone = 'us-central1-a';
// The name of the instance to create.
// const instanceName = 'instance-01';
// The name of the reservation to consume.
// Ensure that the specificReservationRequired field in reservation properties is set to true.
// const reservationName = 'reservation-01';
// Machine type to use for VM.
const machineType = 'n1-standard-4';

// Create instance to consume a specific single-project reservation
async function callCreateInstanceToConsumeSingleProjectReservation() {
  // Describe the size and source image of the boot disk to attach to the instance.
  // Ensure that the VM's properties match the reservation's VM properties,
  // including the zone, machine type (machine family, vCPUs, and memory),
  // minimum CPU platform, GPU amount and type, and local SSD interface and size
  const disk = new compute.Disk({
    boot: true,
    autoDelete: true,
    type: 'PERSISTENT',
    initializeParams: {
      diskSizeGb: '10',
      sourceImage: 'projects/debian-cloud/global/images/family/debian-12',
    },
  });

  //  Define networkInterface
  const networkInterface = new compute.NetworkInterface({
    name: 'global/networks/default',
  });

  // Define reservationAffinity
  const reservationAffinity = new compute.ReservationAffinity({
    consumeReservationType: 'SPECIFIC_RESERVATION',
    key: 'compute.googleapis.com/reservation-name',
    values: [reservationName],
  });

  // Create an instance
  const instance = new compute.Instance({
    name: instanceName,
    machineType: `zones/${zone}/machineTypes/${machineType}`,
    minCpuPlatform: 'Intel Skylake',
    disks: [disk],
    networkInterfaces: [networkInterface],
    reservationAffinity,
  });

  const [response] = await instancesClient.insert({
    project: projectId,
    instanceResource: instance,
    zone,
  });

  let operation = response.latestResponse;

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

  console.log(`Instance ${instanceName} created.`);
}

await callCreateInstanceToConsumeSingleProjectReservation();

Pitón

Los siguientes ejemplos muestran cómo crear una instancia N2 con 32 vCPU e Intel Cascade Lake como plataforma de CPU mínima, en la zona us-central1-a para consumir una reserva coincidente específica:

Para crear la reserva específica de ejemplo y consumirla, haga lo siguiente:

  • Para crear y consumir la reserva de ejemplo como una reserva de proyecto único, utilice el siguiente código de ejemplo:

    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 consume_specific_single_project_reservation(
        project_id: str,
        zone: str,
        reservation_name: str,
        instance_name: str,
        machine_type: str = "n1-standard-1",
        min_cpu_platform: str = "Intel Ivy Bridge",
    ) -> compute_v1.Instance:
        """
        Creates a specific reservation in a single project and launches a VM
        that consumes the newly created reservation.
        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.
            instance_name (str): The name of the instance to create.
            machine_type (str): The machine type for the instance.
            min_cpu_platform (str): The minimum CPU platform for the instance.
        """
        instance_properties = (
            compute_v1.AllocationSpecificSKUAllocationReservedInstanceProperties(
                machine_type=machine_type,
                min_cpu_platform=min_cpu_platform,
            )
        )
    
        reservation = compute_v1.Reservation(
            name=reservation_name,
            specific_reservation=compute_v1.AllocationSpecificSKUReservation(
                count=3,
                instance_properties=instance_properties,
            ),
            # Only VMs that target the reservation by name can consume from this reservation
            specific_reservation_required=True,
        )
    
        # Create a reservation client
        client = compute_v1.ReservationsClient()
        operation = client.insert(
            project=project_id,
            zone=zone,
            reservation_resource=reservation,
        )
        wait_for_extended_operation(operation, "Reservation creation")
    
        instance = compute_v1.Instance()
        instance.name = instance_name
        instance.machine_type = f"zones/{zone}/machineTypes/{machine_type}"
        instance.min_cpu_platform = min_cpu_platform
        instance.zone = zone
    
        # Set the reservation affinity to target the specific reservation
        instance.reservation_affinity = compute_v1.ReservationAffinity(
            consume_reservation_type="SPECIFIC_RESERVATION",  # Type of reservation to consume
            key="compute.googleapis.com/reservation-name",  # Key for the reservation
            values=[reservation_name],  # Reservation name to consume
        )
        # Define the disks for the instance
        instance.disks = [
            compute_v1.AttachedDisk(
                boot=True,  # Indicates that this is a boot disk
                auto_delete=True,  # The disk will be deleted when the instance is deleted
                initialize_params=compute_v1.AttachedDiskInitializeParams(
                    source_image="projects/debian-cloud/global/images/family/debian-11",
                    disk_size_gb=10,
                ),
            )
        ]
        instance.network_interfaces = [
            compute_v1.NetworkInterface(
                network="global/networks/default",  # The network to use
                access_configs=[
                    compute_v1.AccessConfig(
                        name="External NAT",  # Name of the access configuration
                        type="ONE_TO_ONE_NAT",  # Type of access configuration
                    )
                ],
            )
        ]
        # Create a request to insert the instance
        request = compute_v1.InsertInstanceRequest()
        request.zone = zone
        request.project = project_id
        request.instance_resource = instance
    
        vm_client = compute_v1.InstancesClient()
        operation = vm_client.insert(request)
        wait_for_extended_operation(operation, "instance creation")
        print(f"Instance {instance_name} with specific reservation created successfully.")
    
        return vm_client.get(project=project_id, zone=zone, instance=instance_name)
    
    
  • Para crear y consumir la reserva de ejemplo como reserva compartida, utilice el siguiente código de ejemplo:

    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 consume_specific_shared_project_reservation(
        owner_project_id: str,
        shared_project_id: str,
        zone: str,
        reservation_name: str,
        instance_name: str,
        machine_type: str = "n1-standard-1",
        min_cpu_platform: str = "Intel Ivy Bridge",
    ) -> compute_v1.Instance:
        """
        Creates a specific reservation in a single project and launches a VM
        that consumes the newly created reservation.
        Args:
            owner_project_id (str): The ID of the Google Cloud project.
            shared_project_id: The ID of the owner project of the reservation in the same zone.
            zone (str): The zone to create the reservation.
            reservation_name (str): The name of the reservation to create.
            instance_name (str): The name of the instance to create.
            machine_type (str): The machine type for the instance.
            min_cpu_platform (str): The minimum CPU platform for the instance.
        """
        instance_properties = (
            compute_v1.AllocationSpecificSKUAllocationReservedInstanceProperties(
                machine_type=machine_type,
                min_cpu_platform=min_cpu_platform,
            )
        )
    
        reservation = compute_v1.Reservation(
            name=reservation_name,
            specific_reservation=compute_v1.AllocationSpecificSKUReservation(
                count=3,
                instance_properties=instance_properties,
            ),
            # Only VMs that target the reservation by name can consume from this reservation
            specific_reservation_required=True,
            share_settings=compute_v1.ShareSettings(
                share_type="SPECIFIC_PROJECTS",
                project_map={
                    shared_project_id: compute_v1.ShareSettingsProjectConfig(
                        project_id=shared_project_id
                    )
                },
            ),
        )
    
        # Create a reservation client
        client = compute_v1.ReservationsClient()
        operation = client.insert(
            project=owner_project_id,
            zone=zone,
            reservation_resource=reservation,
        )
        wait_for_extended_operation(operation, "Reservation creation")
    
        instance = compute_v1.Instance()
        instance.name = instance_name
        instance.machine_type = f"zones/{zone}/machineTypes/{machine_type}"
        instance.min_cpu_platform = min_cpu_platform
        instance.zone = zone
    
        # Set the reservation affinity to target the specific reservation
        instance.reservation_affinity = compute_v1.ReservationAffinity(
            consume_reservation_type="SPECIFIC_RESERVATION",  # Type of reservation to consume
            key="compute.googleapis.com/reservation-name",
            # To consume this reservation from any consumer projects, specify the owner project of the reservation
            values=[f"projects/{owner_project_id}/reservations/{reservation_name}"],
        )
        # Define the disks for the instance
        instance.disks = [
            compute_v1.AttachedDisk(
                boot=True,  # Indicates that this is a boot disk
                auto_delete=True,  # The disk will be deleted when the instance is deleted
                initialize_params=compute_v1.AttachedDiskInitializeParams(
                    source_image="projects/debian-cloud/global/images/family/debian-11",
                    disk_size_gb=10,
                ),
            )
        ]
        instance.network_interfaces = [
            compute_v1.NetworkInterface(
                network="global/networks/default",  # The network to use
                access_configs=[
                    compute_v1.AccessConfig(
                        name="External NAT",  # Name of the access configuration
                        type="ONE_TO_ONE_NAT",  # Type of access configuration
                    )
                ],
            )
        ]
        # Create a request to insert the instance
        request = compute_v1.InsertInstanceRequest()
        request.zone = zone
        # The instance will be created in the shared project
        request.project = shared_project_id
        request.instance_resource = instance
    
        vm_client = compute_v1.InstancesClient()
        operation = vm_client.insert(request)
        wait_for_extended_operation(operation, "instance creation")
        print(f"Instance {instance_name} from project {owner_project_id} created.")
        # The instance is created in the shared project, so we return it from there.
        return vm_client.get(project=shared_project_id, zone=zone, instance=instance_name)
    
    

DESCANSAR

El siguiente ejemplo muestra cómo crear una reserva específica en la zona us-central1-a para tres instancias N2 con 32 vCPU e Intel Cascade Lake como plataforma de CPU mínima. También muestra cómo crear una instancia única para consumir la reserva.

Para crear la reserva específica de ejemplo y consumirla, haga lo siguiente:

  1. Para crear la reserva de ejemplo, realice una solicitud POST al método instances.insert . En el cuerpo de la solicitud, incluya el campo specificReservationRequired establecido en true :

    POST https://compute.googleapis.com/compute/v1/projects/example-project/zones/us-central1-a/reservations
    
    {
      "name": "reservation-02",
      "specificReservation": {
        "count": "3",
        "instanceProperties": {
          "machineType": "n2-standard-32",
          "minCpuPlatform": "Intel Cascade Lake",
        }
      },
      "specificReservationRequired": true
    }
    
  2. Para crear una instancia que consuma la reserva de ejemplo, realice una solicitud POST al método instances.insert . En el cuerpo de la solicitud, en el campo reservationAffinity , incluya lo siguiente:

    • El campo consumeReservationType establecido en SPECIFIC_RESERVATION .

    • El campo key está configurado en compute.googleapis.com/reservation-name .

    • El campo values se establece en la URL de la reserva.

    La solicitud es similar a la siguiente:

    POST https://compute.googleapis.com/compute/v1/projects/example-project/zones/us-central1-a/instances
    
    {
      "name": "instance-02",
      "machineType": "zones/us-central1-a/machineTypes/n2-standard-32",
      "minCpuPlatform": "Intel Cascade Lake",
      "disks": [
        {
          "boot": true,
          "initializeParams": {
            "sourceImage": "projects/debian-cloud/global/images/family/debian-12"
          }
        }
      ],
      "networkInterfaces": [
        {
          "network": "global/networks/default"
        }
      ],
      "reservationAffinity": {
        "consumeReservationType": "SPECIFIC_RESERVATION",
        "key": "compute.googleapis.com/reservation-name",
        "values": [
          "RESERVATION_URL"
        ]
      }
    }
    

    Reemplace RESERVATION_URL con la URL de la reserva. Especifique uno de los siguientes valores:

    • Si creaste la reserva en el mismo proyecto: reservation-02

    • Si la reserva está en un proyecto diferente: projects/ PROJECT_ID /reservations/reservation-02

Pruebe que las propiedades de la instancia coincidan con una reserva consumida automáticamente

Para probar si las propiedades de una instancia informática coinciden con una reserva consumida automáticamente, haga lo siguiente:

  1. Cree una copia de la reserva como una reserva dirigida específicamente para una sola instancia.

  2. Cree una instancia de prueba para consumir la reserva.

Si puede crear la instancia de prueba, sus propiedades coincidirán con las propiedades de la reserva de prueba. De lo contrario, se producirá un error al crear la instancia.

Después de confirmar que las propiedades de su instancia de prueba y la reserva de prueba coinciden, elimine la reserva y la instancia de prueba .

Verificar consumo de reservas

Para verificar el consumo de reservas, puede realizar una o más de las siguientes acciones:

  • Para ver la cantidad actual de instancias informáticas que consumen sus reservas y cuántas instancias más pueden consumirlas, consulte reservas .

  • Para monitorear los datos de consumo de reservas actualizados cada 30 minutos y recibir alertas cuando las reservas se consumen o no se consumen, supervise el consumo de reservas .

  • Para ver los datos de consumo de reservas actualizados cada 24 horas, realice una de las siguientes acciones:

    • Para ver el consumo de reservas pasadas y previstas para analizar las tendencias de consumo y planificar las necesidades de capacidad futuras, utilice el Planificador de capacidad .

¿Qué sigue?