Crear una reserva compartida


Este documento explica cómo crear reservas compartidas, que son reservas compartidas en varios proyectos, y administrar qué proyectos de su organización pueden consumir las reservas compartidas.

Una reserva compartida puede ser utilizada por el proyecto que aloja la reserva (proyecto propietario) y por los proyectos con los que se comparte la reserva (proyectos de consumidor). Utilice reservas compartidas si su organización tiene varios proyectos que necesitan instancias de máquinas virtuales (VM) con las mismas propiedades reservadas. Al utilizar reservas compartidas, puede mejorar la utilización de sus reservas y reducir la cantidad de reservas que necesita crear y administrar. Para obtener más información sobre las reservas, consulta Reservas de recursos zonales de Compute Engine .

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

  • Para crear una reserva que solo pueda ser utilizada por un único proyecto, consulte Crear una reserva para un único proyecto .

  • Para crear una reserva al comprar un compromiso basado en recursos, consulte Comprar compromisos con reservas adjuntas . Los compromisos proporcionan descuentos, conocidos como descuentos por uso comprometido (CUD), en los costos de recursos bajo demanda a cambio de comprar un nivel mínimo de recursos o gastar una cantidad mínima.

Antes de comenzar

Roles requeridos

Para obtener los permisos que necesita para crear reservas compartidas, solicite a su administrador que le otorgue los siguientes roles de IAM:

Para obtener más información sobre cómo otorgar roles, consulte Administrar el acceso a proyectos, carpetas y organizaciones .

Estos roles predefinidos contienen los permisos necesarios para crear reservas compartidas. Para ver los permisos exactos que se requieren, expanda la sección Permisos requeridos :

Permisos requeridos

Se requieren los siguientes permisos para crear reservas compartidas:

  • compute.reservations.create en el proyecto.
  • Para ver las políticas de la organización: orgpolicy.policy.get en la organización
  • Para editar las políticas de la organización: orgpolicy.policy.set en la organización
  • Para especificar una plantilla de instancia: compute.instanceTemplates.useReadOnly en la plantilla de instancia

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

Mejores prácticas

Al crear reservas compartidas, se recomiendan las siguientes mejores prácticas. Si los sigue, puede ayudar a optimizar la capacidad de administración y utilización de las reservas compartidas en su organización.

  • Haga que el proyecto propietario cree la reserva compartida pero no la consuma.
    • Para distribuir los gastos entre proyectos, se recomienda que solo los proyectos de consumo consuman una reserva compartida. El proyecto del propietario solo debe usarse para crear la reserva compartida.
    • Al crear una reserva compartida, el proyecto propietario debe tener una cuota suficiente para el total de recursos a reservar. Luego, una vez creada la reserva, el proyecto propietario debe tener una cuota para los recursos reservados que desee consumir. Para obtener más información, consulte Requisitos de cuota adicionales para reservas compartidas .
  • Minimice la cantidad de proyectos en su organización a los que permite crear reservas compartidas. Puede controlar esto a través de la restricción de política de organización Proyectos de propietario de reservas compartidas ( compute.sharedReservationsOwnerProjects ).
    • Sólo puedes enumerar las reservas creadas por cada proyecto. Esto significa que las reservas compartidas solo se enumeran en el proyecto propietario (no puede enumerar las reservas compartidas con cada proyecto ni enumerar todas las reservas compartidas en cada organización), por lo que tener solo unos pocos proyectos propietarios hace que sea más fácil monitorear y administrar sus reservas compartidas.
    • Limite el uso compartido de una reserva compartida a unos pocos proyectos solo para administrar la cuota de sus recursos reservados más fácilmente.
    • Para obtener más información, consulte Permitir y restringir la creación y modificación de reservas compartidas en proyectos .
  • Minimice la cantidad de reservas compartidas separadas con propiedades de VM idénticas.
    • Una organización puede tener hasta 100 reservas compartidas para cada combinación única de propiedades de VM . Como resultado, minimizar la cantidad de reservas compartidas con propiedades de VM idénticas que usted crea ayuda a mitigar este límite.
    • Tener menos reservas compartidas mejora la capacidad de gestión.
  • Comparta reservas únicamente entre proyectos con la misma cuenta de facturación de Cloud.
    • Limite cada reserva compartida para que solo se comparta con proyectos de consumidores que tengan la misma cuenta de facturación de Cloud que el proyecto del propietario. Esto le facilita ver si se consumió una reserva y cómo se facturó.
  • Para futuras solicitudes de reserva, revise cuidadosamente el recuento total de VM que solicita.
    • Si está creando una solicitud de reserva futura , asegúrese de solicitar un recuento total de máquinas virtuales que tenga en cuenta todo lo siguiente:
      • Todas las máquinas virtuales reservadas coincidentes que ya existirán en el futuro.
      • Todas las máquinas virtuales no reservadas coincidentes que ya existirán en el futuro.
      • Cualquier reserva a pedido coincidente no utilizada que ya exista en una fecha futura.
      • El aumento en el uso que desea reservar en una fecha futura.

      Por ejemplo, supongamos que necesita 10 máquinas virtuales adicionales en el futuro y ya tendrá los siguientes recursos en el futuro:

      • 40 máquinas virtuales reservadas coincidentes
      • 50 máquinas virtuales no reservadas coincidentes

      o

      • 40 máquinas virtuales reservadas coincidentes
      • 50 reservas bajo demanda coincidentes no utilizadas

      Debido a que su uso actual en una fecha futura ya suma 90 máquinas virtuales y reservas coincidentes, y necesita diez máquinas virtuales adicionales, debe especificar un recuento total de 100 en su solicitud de reserva futura.

      Para obtener más información, consulte Contar y aprovisionar recursos reservados .

Permitir y restringir que los proyectos creen y modifiquen reservas compartidas

De forma predeterminada, ningún proyecto puede crear o modificar reservas compartidas en una organización. Agregue proyectos a la restricción de política de organización Proyectos de propietario de reservas compartidas ( compute.sharedReservationsOwnerProjects ) para permitirles crear y modificar reservas compartidas. Para obtener más información sobre las restricciones de políticas de la organización, consulte Introducción al servicio de políticas de la organización .

Utilice los siguientes pasos para ver y editar la restricción de política de organización de proyectos de propietario de reservas compartidas ( compute.sharedReservationsOwnerProjects ).

Ver la restricción de política de la organización de reservas compartidas

Para ver qué proyectos tienen permiso para crear y modificar reservas compartidas, use la consola de Google Cloud o la CLI de gcloud.

Consola

Siga los pasos para Ver políticas de organización usando la restricción Proyectos de propietario de reservas compartidas .

nube de gcloud

Para ver qué proyectos la restricción compute.sharedReservationsOwnerProjects permite crear y modificar reservas compartidas:

  1. Descarga la política para tu organización como un archivo llamado policy.yaml , usando el comando gcloud resource-manager org-policies describe :

    gcloud resource-manager org-policies describe compute.sharedReservationsOwnerProjects --organization=ORGANIZATION_ID > policy.yaml
    

    Reemplace ORGANIZATION_ID con el ID de organización de su organización.

  2. Utilice un editor de texto para abrir el archivo policy.yaml y ver la restricción compute.sharedReservationsOwnerProjects . Los proyectos a los que se les permite crear y modificar reservas compartidas se enumeran en sus allowedValues :

    ...
    constraint: constraints/compute.sharedReservationsOwnerProjects
    listPolicy:
      allowedValues:
      - projects/PROJECT_NUMBER_1
      - projects/PROJECT_NUMBER_2
      - projects/PROJECT_NUMBER_3
    ...
    

    donde PROJECT_NUMBER_1 , PROJECT_NUMBER_2 y PROJECT_NUMBER_3 son los números de proyecto de los únicos proyectos de su organización que pueden crear reservas compartidas.

  3. Opcional: elimine el archivo policy.yaml .

    • Si está utilizando una terminal Linux o macOS, utilice el siguiente comando:

      rm policy.yaml
      
    • Si está utilizando una terminal de Windows, utilice el siguiente comando:

      del policy.yaml
      

Editar la restricción de política de la organización de reservas compartidas

Para editar qué proyectos pueden crear y modificar reservas compartidas, use la consola de Google Cloud o la CLI de gcloud.

Consola

Siga los pasos para Personalizar políticas para restricciones de lista utilizando la restricción Proyectos de propietario de reservas compartidas .

nube de gcloud

Para editar qué proyectos la restricción compute.sharedReservationsOwnerProjects permite crear y modificar reservas compartidas, utilice uno de los siguientes métodos:

  • Para otorgar permiso a un solo proyecto para crear y modificar reservas compartidas, usa el comando gcloud resource-manager org-policies allow . Puede repetir este comando para cada proyecto al que desee otorgarle este permiso.

    gcloud resource-manager org-policies allow compute.sharedReservationsOwnerProjects projects/PROJECT_NUMBER \
        --organization=ORGANIZATION_ID
    

    Reemplace lo siguiente:

    • PROJECT_NUMBER : el número de proyecto (no el ID del proyecto) de un proyecto en su organización al que desea permitirle crear y modificar reservas compartidas.
    • ORGANIZATION_ID : el ID de la organización de su organización.
  • Para otorgar o revocar permisos para que varios proyectos creen y modifiquen reservas compartidas, reemplace la restricción de política de la organización:

    1. Para descargar la política para tu organización como un archivo llamado policy.yaml , usa el comando gcloud resource-manager org-policies describe :

      gcloud resource-manager org-policies describe compute.sharedReservationsOwnerProjects --organization=ORGANIZATION_ID > policy.yaml
      

      Reemplace ORGANIZATION_ID con el ID de organización de su organización.

    2. Utilice un editor de texto para modificar el archivo policy.yaml de modo que la restricción compute.sharedReservationsOwnerProjects enumere todos los proyectos a los que desea que se les permita crear y modificar reservas compartidas según sus allowedValues .

      • Para cada proyecto al que desee otorgar permiso para crear y modificar reservas compartidas, agregue el proyecto en una nueva línea en allowedValues .
      • Para cada proyecto en el que desee revocar el permiso para crear y modificar reservas compartidas, elimine la línea de ese proyecto.

      Cuando haya terminado, asegúrese de que el archivo policy.yaml sea similar al siguiente:

      ...
      constraint: constraints/compute.sharedReservationsOwnerProjects
      listPolicy:
        allowedValues:
        - projects/PROJECT_NUMBER_1
        - projects/PROJECT_NUMBER_2
        - projects/PROJECT_NUMBER_3
      ...
      

      donde PROJECT_NUMBER_1 , PROJECT_NUMBER_2 y PROJECT_NUMBER_3 son los números de proyecto (no los ID de proyecto) de todos los proyectos de su organización a los que desea que se les permita crear y modificar reservas compartidas.

    3. Guarde el archivo policy.yaml y cierre el editor de texto.

    4. Para actualizar la política de tu organización con tus cambios, usa el comando gcloud resource-manager org-policies set-policy :

      gcloud resource-manager org-policies set-policy --organization=ORGANIZATION_ID policy.yaml
      

      Reemplace ORGANIZATION_ID con el ID de organización de su organización.

    5. Opcional: elimine el archivo policy.yaml .

      • Si está utilizando una terminal Linux o macOS, utilice el siguiente comando:

        rm policy.yaml
        
      • Si está utilizando una terminal de Windows, utilice el siguiente comando:

        del policy.yaml
        

Es posible que tengas que esperar unos minutos para que la edición surta efecto.

Crear una reserva compartida

Esta sección explica cómo crear reservas compartidas. Después de crear una reserva compartida, solo el proyecto propietario puede modificarla, pero los recursos para una reserva compartida pueden ser consumidos por el proyecto propietario o por cualquier proyecto consumidor.

Para consumir una reserva, una VM debe tener propiedades que coincidan exactamente con esa reserva. Para especificar las propiedades de las máquinas virtuales que desea reservar, seleccione una de las siguientes secciones de este documento:

  • Recomendado: especificar una plantilla de instancia

    Esta sección explica cómo utilizar una plantilla de instancia para definir las propiedades de una reserva compartida. Al utilizar una plantilla de instancia, puede definir las propiedades de una reserva y las máquinas virtuales que pueden consumir la reserva en el mismo lugar. Sin embargo, debido a que las plantillas son específicas del proyecto, no puede usar la misma plantilla para crear máquinas virtuales que puedan consumir la reserva fuera del proyecto que creó la reserva. Para los proyectos con los que se comparte la reserva, debe crear plantillas similares en esos proyectos o crear máquinas virtuales especificando propiedades directamente.

  • Especificar una máquina virtual existente

    Esta sección explica cómo utilizar una máquina virtual existente para definir las propiedades de una reserva. Al utilizar las propiedades de una máquina virtual existente, puede consumir la reserva creando máquinas virtuales con propiedades que coincidan con la máquina virtual de referencia.

  • Especificar propiedades directamente

    Esta sección explica cómo definir directamente las propiedades de una reserva compartida. Este método requiere que usted se asegure manualmente de que las propiedades de sus máquinas virtuales y reservas coincidan exactamente (cualquiera).Las propiedades no coincidentes impiden el consumo .

De forma predeterminada, cualquier máquina virtual con propiedades que coincidan puede consumir automáticamente una reserva. Si desea controlar el consumo de reservas, realice una o más de las siguientes acciones:

Especificar una plantilla de instancia

Antes de crear una reserva especificando una plantilla de instancia, asegúrese de lo siguiente:

  • Una plantilla de instancia contiene configuraciones específicas del proyecto, por lo que solo puedes acceder y usar una plantilla de instancia dentro del mismo proyecto. Si crea una reserva compartida especificando una plantilla de instancia, no podrá usar la misma plantilla para crear máquinas virtuales que puedan consumir la reserva fuera del proyecto que creó la reserva.

  • Cree su reserva en la misma región y zona que los recursos dentro de la plantilla de instancia. Cualquier recurso regional o zonal especificado en una plantilla de instancia, como un tipo de máquina o un volumen de disco persistente, restringe el uso de la plantilla a las ubicaciones donde existen esos recursos. Por ejemplo, si su plantilla de instancia especifica un volumen de disco persistente existente en la zona us-central1-a , entonces solo podrá crear su reserva en la misma zona. Para comprobar si una plantilla existente especifica algún recurso que vincule la plantilla a una región o zona específica, vea los detalles de la plantilla de instancia y busque referencias a recursos regionales o zonales dentro de ella.

Para crear una reserva compartida especificando una plantilla de instancia, seleccione una de las siguientes opciones:

Consola

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

    Ir a Reservas

    Aparece la página de Reservas .

  2. Haga clic Crear reserva .

    Aparece la página Crear una reserva .

  3. Para Nombre , ingrese un nombre para su reserva.

  4. Para Región y Zona , seleccione dónde desea reservar recursos.

  5. En la sección Tipo de recurso compartido , haga lo siguiente:

    1. Para especificar una reserva compartida, seleccione Compartida .

    2. Haga clic en Agregar proyectos y luego seleccione los proyectos de la organización del proyecto actual con los que desea compartir la reserva. Puede seleccionar hasta 100 proyectos de consumo.

  6. Opcional: para permitir que una reserva de máquinas virtuales GPU sea consumida por trabajos de entrenamiento personalizados o trabajos de predicción en Vertex AI, en la sección Servicios de Google Cloud , seleccione Compartir reserva .

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

    • Para permitir que las instancias de VM coincidentes usen automáticamente esta reserva, seleccione Usar reserva automáticamente si aún no está seleccionada.

    • Para consumir los recursos de esta reserva solo al crear máquinas virtuales coincidentes que se dirijan específicamente a esta reserva por nombre, seleccione Seleccionar reserva específica .

  8. En Número de instancias de VM , ingrese la cantidad de VM que desea reservar.

  9. En la sección Configuración de la máquina , seleccione Usar plantilla de instancia y luego seleccione la plantilla de instancia de su elección. Si selecciona una plantilla de instancia regional, solo podrá reservar recursos dentro de la misma región que la región de la plantilla.

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

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

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

nube de gcloud

Para crear una reserva compartida, usa el comando gcloud compute reservations create con las marcas --share-setting=projects y --share-with .

Para crear una reserva compartida especificando una plantilla de instancia y sin incluir ningún indicador opcional, ejecute el siguiente comando:

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

Reemplace lo siguiente:

  • RESERVATION_NAME : el nombre de la reserva a crear.

  • PROJECT_ID : el ID del proyecto donde desea reservar recursos y donde existe la plantilla de instancia.

  • CONSUMER_PROJECT_IDS : una lista separada por comas de ID de proyectos que pueden consumir esta reserva; por ejemplo, project-1,project-2 . Puede incluir hasta 100 proyectos de consumo. Estos proyectos deben estar en la misma organización que el proyecto propietario. No incluya el proyecto del propietario. Por defecto ya está permitido consumir la reserva.

  • LOCATION : la ubicación de la plantilla de instancia. Especifique uno de los siguientes valores:

    • Para una plantilla de instancia global: global .

    • Para una plantilla de instancia regional: regions/ REGION . Reemplace REGION con la región donde se encuentra la plantilla de instancia. Si especifica una plantilla de instancia regional, solo podrá reservar máquinas virtuales dentro de la misma región que la región de la plantilla.

  • INSTANCE_TEMPLATE_NAME : el nombre de una plantilla de instancia existente. Si la plantilla de instancia especifica un tipo de máquina A3 Mega, A3 High o A3 Edge, debe incluir la marca --require-specific-reservation . Esto indica que solo las máquinas virtuales que apuntan específicamente a la reserva pueden consumirla. Para obtener más información, consulte Consumir máquinas virtuales de una reserva específica .

  • NUMBER_OF_VMS : la cantidad de máquinas virtuales que se reservarán.

  • ZONE : la zona en la que reservar recursos.

Por ejemplo, para crear una reserva especificando una plantilla de instancia global en la zona us-central1-a , compartir la reserva con los proyectos project-1 y project-2 y reservar diez máquinas virtuales, cada una de las cuales usa un tipo de máquina predefinido N2 con 4 vCPU, ejecute el siguiente comando:

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

Opcionalmente, puede realizar una o más de las siguientes acciones:

  • Para especificar que solo las máquinas virtuales que apuntan específicamente a esta reserva puedan consumirla, incluya la marca --require-specific-reservation .

    gcloud compute reservations create RESERVATION_NAME \
        --require-specific-reservation \
        --share-setting=projects \
        --share-with=CONSUMER_PROJECT_IDS \
        --source-instance-template=projects/PROJECT_ID/LOCATION/instanceTemplates/INSTANCE_TEMPLATE_NAME \
        --vm-count=NUMBER_OF_VMS \
        --zone=ZONE
    
  • Para permitir que una reserva de máquinas virtuales GPU sea consumida por trabajos de entrenamiento personalizados o trabajos de predicción en Vertex AI, incluya el indicador --reservation-sharing-policy establecido en ALLOW_ALL .

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

    • Para eliminar 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 \
          --share-setting=projects \
          --share-with=CONSUMER_PROJECT_IDS \
          --source-instance-template=projects/PROJECT_ID/LOCATION/instanceTemplates/INSTANCE_TEMPLATE_NAME \
          --vm-count=NUMBER_OF_VMS \
          --zone=ZONE
      

      Reemplace DELETE_AT_TIME con una fecha y hora formateadas como marca de tiempo RFC 3339 , que debe ser la siguiente:

      YYYY-MM-DDTHH:MM:SSOFFSET
      

      Reemplace lo siguiente:

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

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

      • OFFSET : la zona horaria formateada como un desplazamiento de la hora universal coordinada (UTC) . Por ejemplo, para utilizar la hora estándar del Pacífico (PST), especifique -08:00 . Como alternativa, para no utilizar ningún desplazamiento, especifique Z .

    • Para eliminar 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 \
          --share-setting=projects \
          --share-with=CONSUMER_PROJECT_IDS \
          --source-instance-template=projects/PROJECT_ID/LOCATION/instanceTemplates/INSTANCE_TEMPLATE_NAME \
          --vm-count=NUMBER_OF_VMS \
          --zone=ZONE
      

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

Ir

import (
	"context"
	"fmt"
	"io"

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

// Creates shared reservation from given template in particular zone
func createSharedReservation(w io.Writer, client ClientInterface, projectID, baseProjectId, zone, reservationName, sourceTemplate string) error {
	// client, err := compute.NewReservationsRESTClient(ctx)
	// projectID := "your_project_id". Destination of sharing.
	// baseProjectId := "your_project_id2". Project where the reservation will be created.
	// zone := "us-west3-a"
	// reservationName := "your_reservation_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()

	shareSettings := map[string]*computepb.ShareSettingsProjectConfig{
		projectID: {ProjectId: proto.String(projectID)},
	}

	req := &computepb.InsertReservationRequest{
		Project: baseProjectId,
		ReservationResource: &computepb.Reservation{
			Name: proto.String(reservationName),
			Zone: proto.String(zone),
			SpecificReservation: &computepb.AllocationSpecificSKUReservation{
				Count:                  proto.Int64(2),
				SourceInstanceTemplate: proto.String(sourceTemplate),
			},
			ShareSettings: &computepb.ShareSettings{
				ProjectMap: shareSettings,
				ShareType:  proto.String("SPECIFIC_PROJECTS"),
			},
		},
		Zone: zone,
	}

	op, err := client.Insert(ctx, req)
	if err != nil {
		return fmt.Errorf("unable to create reservation: %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, "Reservation created\n")

	return nil
}

Java

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

public class CreateSharedReservation {

  public static void main(String[] args)
      throws IOException, ExecutionException, InterruptedException, TimeoutException {
    // TODO(developer): Replace these variables before running the sample.
    // The ID of the project where you want to reserve resources
    // and where the instance template exists.
    // By default, no projects are allowed to create or modify shared reservations
    // in an organization. Add projects to the Shared Reservations Owner Projects
    // (compute.sharedReservationsOwnerProjects) organization policy constraint
    // to allow them to create and modify shared reservations.
    // For more information visit this page:
    // https://cloud.google.com/compute/docs/instances/reservations-shared#shared_reservation_constraint
    String projectId = "YOUR_PROJECT_ID";
    // Zone in which to reserve resources.
    String zone = "us-central1-a";
    // Name of the reservation to be created.
    String reservationName = "YOUR_RESERVATION_NAME";
    // The URI of the global instance template to be used for creating the reservation.
    String instanceTemplateUri = String.format(
        "projects/%s/global/instanceTemplates/%s", projectId, "YOUR_INSTANCE_TEMPLATE_NAME");
    // Number of instances for which capacity needs to be reserved.
    int vmCount = 3;

    createSharedReservation(projectId, zone, reservationName, instanceTemplateUri, vmCount);
  }

  // Creates a shared reservation with the given name in the given zone.
  public static Status createSharedReservation(
          String projectId, String zone,
          String reservationName, String instanceTemplateUri, int vmCount)
          throws ExecutionException, InterruptedException, TimeoutException, IOException {

    // Initialize client that will be used to send requests. This client only needs to be created
    // once, and can be reused for multiple requests.
    try (ReservationsClient reservationsClient = ReservationsClient.create()) {
      ShareSettings shareSettings = ShareSettings.newBuilder()
              .setShareType(String.valueOf(ShareSettings.ShareType.SPECIFIC_PROJECTS))
              // The IDs of projects that can consume this reservation. You can include up to
              // 100 consumer projects. These projects must be in the same organization as
              // the owner project. Don't include the owner project.
              // By default, it is already allowed to consume the reservation.
              .putProjectMap("CONSUMER_PROJECT_1", ShareSettingsProjectConfig.newBuilder().build())
              .putProjectMap("CONSUMER_PROJECT_2", ShareSettingsProjectConfig.newBuilder().build())
              .build();

      Reservation reservationResource =
              Reservation.newBuilder()
                      .setName(reservationName)
                      .setZone(zone)
                      .setSpecificReservationRequired(true)
                      .setShareSettings(shareSettings)
                      .setSpecificReservation(
                              AllocationSpecificSKUReservation.newBuilder()
                                      .setCount(vmCount)
                                      .setSourceInstanceTemplate(instanceTemplateUri)
                                      .build())
                      .build();

      InsertReservationRequest request =
              InsertReservationRequest.newBuilder()
                      .setProject(projectId)
                      .setZone(zone)
                      .setReservationResource(reservationResource)
                      .build();

      Operation response = reservationsClient.insertAsync(request)
              .get(3, TimeUnit.MINUTES);

      if (response.hasError()) {
        throw new Error("Reservation creation failed!!" + response);
      }
      return response.getStatus();
    }
  }
}

Nodo.js

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

/**
 * TODO(developer): Uncomment reservationsClient and zoneOperationsClient before running the sample.
 */
// Instantiate a reservationsClient
// reservationsClient = new computeLib.ReservationsClient();
// Instantiate a zoneOperationsClient
// zoneOperationsClient = new computeLib.ZoneOperationsClient();

/**
 * TODO(developer): Update 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.
const reservationName = 'reservation-01';
// The number of VMs to reserve.
const vmsNumber = 3;
// The name of an existing instance template.
const instanceTemplateName = 'global-instance-template-name';
// The location of the instance template.
const location = 'global';

async function callCreateComputeSharedReservation() {
  // 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 share settings. Share reservation with one customer project.
  const shareSettings = new compute.ShareSettings({
    shareType: 'SPECIFIC_PROJECTS',
    projectMap: {
      // The IDs of projects that can consume this reservation. You can include up to 100 consumer projects.
      // These projects must be in the same organization as the owner project.
      // Don't include the owner project. By default, it is already allowed to consume the reservation.
      consumer_project_id: {
        projectId: 'consumer_project_id',
      },
    },
  });

  // Create a reservation.
  const reservation = new compute.Reservation({
    name: reservationName,
    specificReservation,
    specificReservationRequired: true,
    shareSettings,
  });

  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.`);
  return response;
}

return await callCreateComputeSharedReservation();

Pitón

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_shared_reservation(
    project_id: str,
    zone: str = "us-central1-a",
    reservation_name="your-reservation-name",
    shared_project_id: str = "shared-project-id",
) -> 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.
        shared_project_id (str): The ID of the project that the reservation is shared with.
    Returns:
        Reservation object that represents the new reservation.
    """

    instance_properties = compute_v1.AllocationSpecificSKUAllocationReservedInstanceProperties(
        machine_type="n1-standard-1",
        # Optional. Specifies amount of local ssd to reserve with each instance.
        local_ssds=[
            compute_v1.AllocationSpecificSKUAllocationAllocatedInstancePropertiesReservedDisk(
                disk_size_gb=375, interface="NVME"
            ),
        ],
    )

    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,
        ),
        share_settings=compute_v1.ShareSettings(
            share_type="SPECIFIC_PROJECTS",
            project_map={
                shared_project_id: compute_v1.ShareSettingsProjectConfig(
                    project_id=shared_project_id
                )
            },
        ),
    )

    # 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
    )
    shared_project = next(iter(reservation.share_settings.project_map.values()))

    print("Name: ", reservation.name)
    print("STATUS: ", reservation.status)
    print("SHARED PROJECT: ", shared_project)
    # Example response:
    # Name:  your-reservation-name
    # STATUS:  READY
    # SHARED PROJECT:  project_id: "123456789012"

    return reservation

DESCANSAR

Para crear una reserva compartida, realice una solicitud POST al método reservations.insert . En el cuerpo de la solicitud, incluya lo siguiente:

  • El campo projectMap .

  • El campo shareType establecido en SPECIFIC_PROJECTS .

Por ejemplo, para crear una reserva compartida especificando una plantilla de instancia sin incluir ningún campo opcional y compartir la reserva con dos proyectos de consumidores, realice la siguiente solicitud POST :

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

{
  "name": "RESERVATION_NAME",
  "shareSettings": {
    "shareType": "SPECIFIC_PROJECTS",
    "projectMap": {
      "CONSUMER_PROJECT_ID_1": {
        "projectId": "CONSUMER_PROJECT_ID_1"
      },
      "CONSUMER_PROJECT_ID_2": {
        "projectId": "CONSUMER_PROJECT_ID_2"
      }
    }
  },
  "specificReservation": {
    "count": "NUMBER_OF_VMS",
    "sourceInstanceTemplate": "projects/PROJECT_ID/LOCATION/instanceTemplates/INSTANCE_TEMPLATE_NAME"
  }
}

Reemplace lo siguiente:

  • PROJECT_ID : el ID del proyecto donde desea reservar recursos y donde existe la plantilla de instancia.

  • ZONE : la zona en la que reservar recursos.

  • RESERVATION_NAME : el nombre de la reserva a crear.

  • CONSUMER_PROJECT_ID_1 y CONSUMER_PROJECT_ID_2 : los ID de los proyectos que pueden consumir esta reserva. Puede incluir hasta 100 proyectos de consumo. Estos proyectos deben estar en la misma organización que el proyecto propietario. No incluya el proyecto del propietario. Por defecto ya está permitido consumir la reserva.

  • NUMBER_OF_VMS : la cantidad de máquinas virtuales que se reservarán.

  • LOCATION : la ubicación de la plantilla de instancia. Especifique uno de los siguientes valores:

    • Para una plantilla de instancia global: global .

    • Para una plantilla de instancia regional: regions/ REGION . Reemplace REGION con la región donde se encuentra la plantilla de instancia. Si especifica una plantilla de instancia regional, solo podrá reservar máquinas virtuales dentro de la misma región que la región de la plantilla.

  • INSTANCE_TEMPLATE_NAME : el nombre de una plantilla de instancia existente. Si la plantilla de instancia especifica un tipo de máquina A3 Mega, A3 High o A3 Edge, debe incluir el campo specificReservationRequired en el cuerpo de la solicitud y establecer el campo en true . Esto indica que solo las máquinas virtuales que apuntan específicamente a esta reserva pueden consumirla. Para obtener más información, consulte Consumir máquinas virtuales de una reserva específica .

Por ejemplo, para crear una reserva para diez máquinas virtuales en la zona us-central1-a especificando una plantilla de instancia global y compartir la reserva con los proyectos project-1 y project-2 , realice la siguiente solicitud POST :

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

{
  "name": "my-reservation",
  "shareSettings": {
    "shareType": "SPECIFIC_PROJECTS",
    "projectMap": {
      "project-1": {
        "projectId": "project-1"
      },
      "project-2": {
        "projectId": "project-2"
      }
    }
  },
  "specificReservation": {
    "count": "10",
    "sourceInstanceTemplate": "projects/example-project/global/instanceTemplates/example-instance-template"
  }
}

Opcionalmente, puede realizar una o más de las siguientes acciones:

  • Para especificar que solo las máquinas virtuales que apuntan específicamente a esta reserva puedan consumirla, incluya el specificReservationRequired en el cuerpo de la solicitud y establezca el campo en true .

    Por ejemplo, para crear una reserva específica especificando una plantilla de instancia y compartir la reserva con dos proyectos de consumidores, realice una solicitud de la siguiente manera:

    POST https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/zones/ZONE/reservations
    
    {
      "name": "RESERVATION_NAME",
      "shareSettings": {
        "shareType": "SPECIFIC_PROJECTS",
        "projectMap": {
          "CONSUMER_PROJECT_ID_1": {
            "projectId": "CONSUMER_PROJECT_ID_1"
          },
          "CONSUMER_PROJECT_ID_2": {
            "projectId": "CONSUMER_PROJECT_ID_2"
          }
        }
      },
      "specificReservation": {
        "count": "NUMBER_OF_VMS",
        "sourceInstanceTemplate": "projects/PROJECT_ID/LOCATION/instanceTemplates/INSTANCE_TEMPLATE_NAME"
      },
      "specificReservationRequired": true
    }
    
  • Para permitir que una reserva de máquinas virtuales GPU sea consumida por trabajos de entrenamiento personalizados o trabajos de predicción en Vertex AI, incluya el campo serviceShareType y configúrelo en ALLOW_ALL .

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

    • Para eliminar la reserva en una fecha y hora específica, realice una solicitud POST al método beta.reservations.insert . En el cuerpo de la solicitud, incluya el campo deleteAtTime .

      Por ejemplo, para crear una reserva especificando una plantilla de instancia, eliminar automáticamente la reserva en una fecha y hora específicas y compartir la reserva con dos proyectos de consumidores, realice una solicitud de la siguiente manera:

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

      Reemplace DELETE_AT_TIME con una fecha y hora formateadas como marca de tiempo RFC 3339 , que debe ser la siguiente:

      YYYY-MM-DDTHH:MM:SSOFFSET
      

      Reemplace lo siguiente:

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

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

      • OFFSET : la zona horaria formateada como un desplazamiento de la hora universal coordinada (UTC) . Por ejemplo, para utilizar la hora estándar del Pacífico (PST), especifique -08:00 . Como alternativa, para no utilizar ningún desplazamiento, especifique Z .

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

      Por ejemplo, para crear una reserva especificando una plantilla de instancia, eliminar automáticamente la reserva después de una duración específica y compartir la reserva con dos proyectos de consumidores, realice una solicitud de la siguiente manera:

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

      Reemplace DELETE_AFTER_DURATION con una duración en segundos. Por ejemplo, especifique 86400 durante 86.400 segundos (1 día).

Especificar una máquina virtual existente

Solo puede crear una reserva compartida basada en una máquina virtual existente en el mismo proyecto y zona que la máquina virtual.

Después de crear la reserva, puede consumirla creando máquinas virtuales con propiedades que coincidan con la máquina virtual de referencia. Puede hacerlo realizando una de las siguientes acciones:

  • Cree y utilice una plantilla de instancia de la siguiente manera:

    1. Cree una plantilla de instancia basada en la VM de referencia sin anular las propiedades de la VM de referencia.

    2. Cree máquinas virtuales utilizando la plantilla recién creada realizando una o ambas de las siguientes acciones:

  • Cree una máquina virtual con propiedades que coincidan exactamente con la máquina virtual de referencia de la siguiente manera:

Para crear una reserva compartida que utilice las propiedades de una máquina virtual existente, haga lo siguiente:

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

    Ir a Reservas

  2. En la pestaña Reservas bajo demanda (predeterminada), haga clic en Crear reserva .

    Se abre la página Crear una reserva .

  3. Para Nombre , ingrese un nombre para su reserva.

  4. Para Región y Zona , seleccione dónde desea reservar recursos.

  5. En la sección Tipo de recurso compartido , haga lo siguiente:

    1. Para especificar una reserva compartida, seleccione Compartida .

    2. Haga clic en Agregar proyectos y luego seleccione los proyectos de la organización del proyecto actual con los que desea compartir la reserva. Puede seleccionar hasta 100 proyectos de consumo.

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

    • Para permitir que las máquinas virtuales coincidentes consuman automáticamente esta reserva, seleccione Usar reserva automáticamente si aún no está seleccionada.

    • Para consumir los recursos de esta reserva solo al crear máquinas virtuales coincidentes que se dirijan específicamente a esta reserva por nombre, seleccione Seleccionar reserva específica .

  7. En Número de instancias de VM , ingrese la cantidad de VM que desea reservar.

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

    1. Seleccione Usar VM existente .

    2. Para VM existente , seleccione la VM cuyas propiedades desea usar para crear la reserva.

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

  10. Para crear la reserva, haga clic en Crear .

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

Especificar propiedades directamente

Para crear una reserva compartida especificando propiedades directamente, seleccione una de las siguientes opciones:

Consola

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

    Ir a Reservas

  2. En la pestaña Reservas bajo demanda (predeterminada), haga clic en Crear reserva .

  3. Haga clic Crear reserva .

    Aparece la página Crear una reserva .

  4. Para Nombre , ingrese un nombre para su reserva.

  5. Para Región y Zona , seleccione dónde desea reservar recursos.

  6. En la sección Tipo de recurso compartido , haga lo siguiente:

    1. Para especificar una reserva compartida, seleccione Compartida .

    2. Haga clic en Agregar proyectos y luego seleccione los proyectos de la organización del proyecto actual con los que desea compartir la reserva. Puede seleccionar hasta 100 proyectos de consumo.

  7. Opcional: para permitir que una reserva de máquinas virtuales GPU sea consumida por trabajos de entrenamiento personalizados o trabajos de predicción en Vertex AI, en la sección Servicios de Google Cloud , seleccione Compartir reserva .

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

    • Para permitir que las máquinas virtuales coincidentes consuman automáticamente esta reserva, seleccione Usar reserva automáticamente (predeterminado).

    • Para consumir los recursos de esta reserva solo al crear máquinas virtuales coincidentes que se dirijan específicamente a esta reserva por nombre, seleccione Seleccionar reserva específica .

  9. En Número de instancias de VM , ingrese la cantidad de VM que desea reservar.

  10. En la sección Configuración de la máquina , seleccione Especificar tipo de máquina y luego especifique lo siguiente:

    1. Para Familia de máquinas , Serie y Tipo de máquina , seleccione 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 GPU a máquinas virtuales N1, haga lo siguiente:

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

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

      3. Opcional: para conectar GPU a máquinas virtuales N1, haga clic en Agregar GPU . Luego, para Tipo de GPU y Número de GPU , seleccione el tipo y la cantidad de GPU que desea conectar a cada VM N1.

    3. Opcional: Para conectar discos SSD locales a un tipo de máquina que no incluye discos SSD locales de forma predeterminada , haga lo siguiente:

      1. Para Número de discos , seleccione la cantidad de discos SSD locales que desea conectar.

      2. Para Tipo de interfaz , seleccione la interfaz del disco para los discos SSD locales.

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

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

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

nube de gcloud

Para crear una reserva compartida, usa el comando gcloud compute reservations create con las marcas --share-setting=projects y --share-with .

Para crear una reserva compartida especificando propiedades directamente y sin incluir ninguna marca opcional, ejecute el siguiente comando:

gcloud compute reservations create RESERVATION_NAME \
    --machine-type=MACHINE_TYPE \
    --share-setting=projects \
    --share-with=CONSUMER_PROJECT_IDS \
    --vm-count=NUMBER_OF_VMS \
    --zone=ZONE

Reemplace lo siguiente:

  • RESERVATION_NAME : el nombre de la reserva a crear.

  • MACHINE_TYPE : un tipo de máquina a utilizar para cada VM. Si especifica un tipo de máquina A3 Mega, A3 High o A3 Edge, debe incluir la marca --require-specific-reservation . Esto indica que solo las máquinas virtuales que apuntan específicamente a la reserva pueden consumirla. Para obtener más información, consulte Consumir máquinas virtuales de una reserva específica .

  • CONSUMER_PROJECT_IDS : una lista separada por comas de ID de proyectos que pueden consumir esta reserva; por ejemplo, project-1,project-2 . Puede incluir hasta 100 proyectos de consumo. Estos proyectos deben estar en la misma organización que el Proyecto del Propietario. No incluya el proyecto del propietario. Por defecto, ya se le permite consumir la reserva.

  • NUMBER_OF_VMS : el número de máquinas virtuales para reservar.

  • ZONE : la zona para reservar recursos.

Por ejemplo, para crear una reserva en la Zona us-central1-a para diez VM que usan un tipo de máquina N2 predefinido con 4 VCPUS, y comparta la reserva con Project project-1 y project-2 , ejecute el siguiente comando:

gcloud compute reservations create my-reservation \
    --machine-type=n2-standard-4 \
    --share-setting=projects \
    --share-with=project-1,project-2 \
    --vm-count=10 \
    --zone=us-central1-a

Opcionalmente, puede hacer uno o más de los siguientes:

  • Para adjuntar GPU a sus máquinas virtuales N1 reservadas, incluya la bandera --accelerator .

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

    Reemplace lo siguiente:

  • Para adjuntar discos SSD locales a un tipo de máquina que no incluya discos SSD locales de forma predeterminada , incluya el indicador --local-ssd . Solo puede adjuntar discos SSD locales de 375 GB.

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

    Reemplace lo siguiente:

    • NUMBER_OF_LOCAL_SSD_DISKS : el número de discos SSD locales para adjuntar.

    • INTERFACE_TYPE : el tipo de interfaz de disco que desea que use cada disco SSD local y que admita su tipo de máquina especificada . Especifique uno de los siguientes valores:

      • Para la interfaz de disco NVME: nvme

      • Para la interfaz de disco SCSI: scsi

  • Para que las máquinas virtuales reservadas usen una plataforma mínima de CPU específica en lugar de la plataforma CPU predeterminada de la zona, incluya el indicador --min-cpu-platform .

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

    Reemplace MIN_CPU_PLATFORM con una plataforma mínima de CPU. Para asegurarse de que una plataforma CPU esté disponible en la zona donde está reservando recursos, vea las plataformas de CPU disponibles por zona .

  • Para especificar que solo las máquinas virtuales que se dirigen específicamente a esta reserva pueden consumirla, incluya el indicador --require-specific-reservation .

    gcloud compute reservations create RESERVATION_NAME \
        --machine-type=MACHINE_TYPE \
        --require-specific-reservation \
        --share-setting=projects \
        --share-with=CONSUMER_PROJECT_IDS \
        --vm-count=NUMBER_OF_VMS \
        --zone=ZONE
    
  • Para permitir que una reserva de máquinas virtuales de GPU sea consumida por trabajos de capacitación personalizados o trabajos de predicción en Vertex AI, incluya la bandera --reservation-sharing-policy establecida en ALLOW_ALL .

    gcloud compute reservations create RESERVATION_NAME \
        --machine-type=MACHINE_TYPE \
        --reservation-sharing-policy=ALLOW_ALL \
        --share-setting=projects \
        --share-with=CONSUMER_PROJECT_IDS \
        --vm-count=NUMBER_OF_VMS \
        --zone=ZONE
    
  • Para habilitar la calculadora del motor para eliminar automáticamente la reserva , seleccione uno de los siguientes métodos:

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

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

      Reemplace DELETE_AT_TIME con una fecha y hora formateada como una marca de tiempo RFC 3339 , que debe ser la siguiente:

      YYYY-MM-DDTHH:MM:SSOFFSET
      

      Reemplace lo siguiente:

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

      • HH:MM:SS : un tiempo formateado como una hora de 2 dígitos usando una hora de 24 horas, minutos de 2 dígitos y segundos de 2 dígitos, separados por colons ( : .

      • OFFSET : la zona horaria formateada como un desplazamiento de tiempo universal coordinado (UTC) . Por ejemplo, para usar el tiempo estándar del Pacífico (PST), especifique -08:00 . Alternativamente, para no usar compensación, especifique Z .

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

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

      Reemplace DELETE_AFTER_DURATION con una duración en días, horas, minutos o segundos. Por ejemplo, especifique 30m durante 30 minutos, o 1d2h3m4s durante 1 día, 2 horas, 3 minutos y 4 segundos.

Terraformar

Para crear una reserva, use el recurso google_compute_reservation Terraform . Para especificar una reserva compartida, defina el bloque share_settings :

  • Establezca el campo share_type en SPECIFIC_PROJECTS .
  • En el bloque project_map , especifique los ID de proyecto de los proyectos con los que desea compartir esta reserva.

Para obtener más información sobre cómo usar Terraform, consulte Uso de Terraform con Google Cloud .

DESCANSAR

Para crear una reserva compartida, haga una solicitud POST al método reservations.insert . Insert. En el cuerpo de solicitud, incluya lo siguiente:

  • El campo projectMap .

  • El campo shareType se establece en SPECIFIC_PROJECTS .

Por ejemplo, para crear una reserva compartida sin incluir campos opcionales y compartir la reserva con dos proyectos de consumo, haga la siguiente solicitud POST :

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

{
  "name": "RESERVATION_NAME",
  "shareSettings": {
    "shareType": "SPECIFIC_PROJECTS",
    "projectMap": {
      "CONSUMER_PROJECT_ID_1": {
        "projectId": "CONSUMER_PROJECT_ID_1"
      },
      "CONSUMER_PROJECT_ID_2": {
        "projectId": "CONSUMER_PROJECT_ID_2"
      }
    }
  },
  "specificReservation": {
    "count": "NUMBER_OF_VMS",
    "instanceProperties": {
      "machineType": "MACHINE_TYPE"
    }
  }
}

Reemplace lo siguiente:

  • PROJECT_ID : la identificación del proyecto donde desea reservar recursos.

  • ZONE : la zona para reservar recursos.

  • RESERVATION_NAME : el nombre de la reserva para crear.

  • CONSUMER_PROJECT_ID_1 y CONSUMER_PROJECT_ID_2 : los ID de proyectos que pueden consumir esta reserva. Puede incluir hasta 100 proyectos de consumo. Estos proyectos deben estar en la misma organización que el Proyecto del Propietario. No incluya el proyecto del propietario. Por defecto, ya se le permite consumir la reserva.

  • NUMBER_OF_VMS : el número de máquinas virtuales para reservar.

  • MACHINE_TYPE : un tipo de máquina para usar para cada VM. Si especifica un tipo de máquina A3 MEGA, A3 High o A3 Edge, entonces debe incluir el campo specificReservationRequired en el cuerpo de solicitudes y establecer el campo en true . Esto indica que solo las máquinas virtuales que se dirigen específicamente a la reserva pueden consumirla.

Por ejemplo, para crear una reserva especificando una plantilla de instancia global en la zona us-central1-a , comparta la reserva con project-1 y project-2 , y reserva diez VMS que usan un tipo de máquina N2 predefinido con 4 VCPU, realice la siguiente solicitud POST :

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

{
  "name": "my-reservation",
  "shareSettings": {
    "shareType": "SPECIFIC_PROJECTS",
    "projectMap": {
      "project-1": {
        "projectId": "project-1"
      },
      "project-2": {
        "projectId": "project-2"
      }
    }
  },
  "specificReservation": {
    "count": "10",
    "instanceProperties": {
      "machineType": "n2-standard-4",
    }
  }
}

Opcionalmente, puede hacer uno o más de los siguientes:

  • Para adjuntar GPU a sus VMS reservadas, incluya el campo de guestAccelerators en el cuerpo de solicitud.

    Por ejemplo, para crear una reserva compartida con dos proyectos de consumo y adjuntar GPU a cualquier VMS reservada, haga una solicitud de la siguiente manera:

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

    Reemplace lo siguiente:

  • Para adjuntar discos SSD locales a un tipo de máquina que no incluya discos SSD locales de forma predeterminada , incluya el campo localSsds en el cuerpo de solicitud. Solo puede adjuntar discos SSD locales de 375 GB.

    Por ejemplo, para adjuntar dos discos SSD locales al tipo de máquina que desea reservar mientras especifica dos proyectos de consumidores, haga una solicitud de la siguiente manera:

    POST https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/zones/ZONE/reservations
    
    {
      "name": "RESERVATION_NAME",
      "shareSettings": {
        "shareType": "SPECIFIC_PROJECTS",
        "projectMap": {
          "CONSUMER_PROJECT_ID_1": {
            "projectId": "CONSUMER_PROJECT_ID_1"
          },
          "CONSUMER_PROJECT_ID_2": {
            "projectId": "CONSUMER_PROJECT_ID_2"
          }
        }
      },
      "specificReservation": {
        "count": "NUMBER_OF_VMS",
        "instanceProperties": {
          "localSsds": [
            {
              "diskSizeGb": "375",
              "interface": "INTERFACE_TYPE"
            },
            {
              "diskSizeGb": "375",
              "interface": "INTERFACE_TYPE"
            }
          ],
          "machineType": "MACHINE_TYPE"
        }
      }
    }
    

    Reemplace INTERFACE_TYPE con el tipo de interfaz de disco que desea que use cada disco SSD local y que admita su tipo de máquina especificada . Especifique uno de los siguientes valores:

    • Para la interfaz de disco NVME: NVME

    • Para la interfaz de disco SCSI: SCSI

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

    Por ejemplo, para crear una reserva compartida mientras especifica una plataforma mínima de CPU y dos proyectos de consumo, realice una solicitud de la siguiente manera:

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

    Reemplace MIN_CPU_PLATFORM con una plataforma mínima de CPU. Para asegurarse de que una plataforma CPU esté disponible en la zona donde está reservando recursos, vea las plataformas de CPU disponibles por zona .

  • Para especificar que solo las máquinas virtuales que se dirigen específicamente a esta reserva pueden consumirla, incluya el campo specificReservationRequired en el cuerpo de solicitudes y establecer el campo en true .

    Por ejemplo, para crear una reserva específica y compartirla con dos proyectos de consumo, haga una solicitud de la siguiente manera:

    POST https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/zones/ZONE/reservations
    
    {
      "name": "RESERVATION_NAME",
      "shareSettings": {
        "shareType": "SPECIFIC_PROJECTS",
        "projectMap": {
          "CONSUMER_PROJECT_ID_1": {
            "projectId": "CONSUMER_PROJECT_ID_1"
          },
          "CONSUMER_PROJECT_ID_2": {
            "projectId": "CONSUMER_PROJECT_ID_2"
          }
        }
      },
      "specificReservation": {
        "count": "NUMBER_OF_VMS",
        "instanceProperties": {
          "machineType": "MACHINE_TYPE"
        }
      },
      "specificReservationRequired": true
    }
    
  • Para permitir que una reserva de máquinas virtuales de GPU sea consumida por trabajos de capacitación personalizados o trabajos de predicción en Vertex AI, incluya el campo serviceShareType y configúrelo en ALLOW_ALL .

    POST https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/zones/ZONE/reservations
    
    {
      "name": "RESERVATION_NAME",
      "reservationSharingPolicy": {
        "serviceShareType": "ALLOW_ALL"
      },
      "shareSettings": {
        "shareType": "SPECIFIC_PROJECTS",
        "projectMap": {
          "CONSUMER_PROJECT_ID_1": {
            "projectId": "CONSUMER_PROJECT_ID_1"
          },
          "CONSUMER_PROJECT_ID_2": {
            "projectId": "CONSUMER_PROJECT_ID_2"
          }
        }
      },
      "specificReservation": {
        "count": "NUMBER_OF_VMS",
        "instanceProperties": {
          "machineType": "MACHINE_TYPE"
        }
      }
    }
    
  • Para habilitar la calculadora del motor para eliminar automáticamente la reserva , seleccione uno de los siguientes métodos:

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

      Por ejemplo, para crear una reserva mientras especifica una fecha y hora para eliminar una reserva y compartir la reserva con dos proyectos de consumo, haga una solicitud de la siguiente manera:

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

      Reemplace DELETE_AT_TIME con una fecha y hora formateada como una marca de tiempo RFC 3339 , que debe ser la siguiente:

      YYYY-MM-DDTHH:MM:SSOFFSET
      

      Reemplace lo siguiente:

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

      • HH:MM:SS : un tiempo formateado como una hora de 2 dígitos usando una hora de 24 horas, minutos de 2 dígitos y segundos de 2 dígitos, separados por colons ( : .

      • OFFSET : la zona horaria formateada como un desplazamiento de tiempo universal coordinado (UTC) . Por ejemplo, para usar el tiempo estándar del Pacífico (PST), especifique -08:00 . Alternativamente, para no usar compensación, especifique Z .

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

      Por ejemplo, para crear una reserva que calcule el motor elimine después de una duración específica y comparta la reserva con dos proyectos de consumo, haga una solicitud de la siguiente manera:

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

      Reemplace DELETE_AFTER_DURATION con una duración en segundos. Por ejemplo, especifique 86400 por 86,400 segundos (1 día).

Solución de problemas

Aprenda a solucionar problemas de la creación de reservas .

¿Qué sigue?