Agregue un SSD local a su VM


Los SSD locales están diseñados para casos de uso de almacenamiento temporal, como cachés o espacio de procesamiento temporal. Debido a que los SSD locales están ubicados en la máquina física donde se ejecuta su VM, solo se pueden crear durante el proceso de creación de la VM. Los SSD locales no se pueden utilizar como dispositivos de arranque.

Para la serie de máquinas de tercera generación , se agrega una cantidad determinada de discos SSD locales a la máquina virtual cuando la crea. La única forma de agregar almacenamiento SSD local a estas máquinas virtuales es:

  • Para C3 y C3D, el almacenamiento SSD local está disponible solo con ciertos tipos de máquinas, como c3-standard-88-lssd .
  • Para las series de máquinas ultra Z3, A3 y A2, cada tipo de máquina viene con almacenamiento SSD local.

Para los tipos de máquinas M3 y de primera y segunda generación, debe especificar discos SSD locales al crear la máquina virtual.

Después de crear un disco SSD local, debe formatear y montar el dispositivo antes de poder usarlo.

Para obtener información sobre la cantidad de almacenamiento SSD local disponible con varios tipos de máquinas y la cantidad de discos SSD locales que puede conectar a una máquina virtual, consulte Elegir una cantidad válida de SSD locales .

Antes de comenzar

Cree una máquina virtual con un SSD local

Puedes crear una máquina virtual con almacenamiento en disco SSD local mediante la consola de Google Cloud , la CLI de gcloud o la API de Compute Engine .

Consola

  1. Vaya a la página Crear una instancia .

    Ir a Crear una instancia

  2. Especifique el nombre, la región y la zona de su VM. Opcionalmente, agregue etiquetas o rótulos.

  3. En la sección Configuración de la máquina , elija la familia de máquinas que contiene su tipo de máquina de destino.

  4. Seleccione una serie de la lista Serie y luego elija el tipo de máquina.

    • Para las series de máquinas C3 y C3D de tercera generación , elija un tipo de máquina que termine en -lssd .
    • Para Z3, A3 y A2 ultra, cada tipo de máquina viene con almacenamiento SSD local.
    • Para M3, o series de máquinas de primera y segunda generación, después de seleccionar el tipo de máquina, haga lo siguiente:
      1. Expanda la sección Opciones avanzadas .
      2. Expanda Discos , haga clic en Agregar SSD local y haga lo siguiente:
        1. En la página Configurar SSD local , elija el tipo de interfaz del disco.
        2. Seleccione la cantidad de discos que desea en la lista Capacidad del disco .
        3. Haga clic en Guardar .
  5. Continúe con el proceso de creación de VM.

  6. Después de crear la máquina virtual con discos SSD locales, debe formatear y montar cada dispositivo antes de poder usar los discos.

nube de gcloud

  • Para las series de máquinas ultra Z3, A3 y A2, para crear una máquina virtual con discos SSD locales conectados, cree una máquina virtual que utilice cualquiera de los tipos de máquinas disponibles para esa serie siguiendo las instrucciones para crear una instancia .

  • Para las series de máquinas C3 o C3D, para crear una máquina virtual con discos SSD locales conectados, siga las instrucciones para crear una instancia , pero especifique un tipo de instancia que incluya discos SSD locales ( -lssd ).

    Por ejemplo, puede crear una máquina virtual C3 con dos particiones SSD locales que utilicen la interfaz de disco NVMe de la siguiente manera:

    gcloud compute instances create example-c3-instance \
       --zone ZONE \
       --machine-type c3-standard-8-lssd \
       --image-project IMAGE_PROJECT \
       --image-family IMAGE_FAMILY
    
  • Para M3 y las series de máquinas de primera y segunda generación, para crear una máquina virtual con discos SSD locales conectados, siga las instrucciones para crear una instancia , pero use el indicador --local-ssd para crear y conectar un disco SSD local. Para crear varios discos SSD locales, agregue más indicadores --local-ssd . Opcionalmente, también puede establecer valores para la interfaz y el nombre del dispositivo para cada indicador --local-ssd .

    Por ejemplo, puede crear una máquina virtual M3 con cuatro discos SSD locales y especificar el tipo de interfaz del disco de la siguiente manera:

    gcloud compute instances create VM_NAME \
       --machine-type m3-ultramem-64 \
       --zone ZONE \
       --local-ssd interface=INTERFACE_TYPE,device-name=DEVICE-NAME \
       --local-ssd interface=INTERFACE_TYPE,device-name=DEVICE-NAME \
       --local-ssd interface=INTERFACE_TYPE,device-name=DEVICE-NAME \
       --local-ssd interface=INTERFACE_TYPE \
       --image-project IMAGE_PROJECT \
       --image-family IMAGE_FAMILY
    

Reemplace lo siguiente:

  • VM_NAME : el nombre de la nueva VM
  • ZONE : la zona en la que se creará la VM. Esta marca es opcional si configuró la propiedad compute/zone de la CLI de gcloud o la variable de entorno CLOUDSDK_COMPUTE_ZONE .
  • INTERFACE_TYPE : el tipo de interfaz de disco que desea utilizar para el dispositivo SSD local. Especifique nvme si crea una máquina virtual M3 o si la imagen de su disco de arranque tiene controladores NVMe optimizados . Especifique scsi para otras imágenes.
  • DEVICE-NAME : Opcional: un nombre que indica el nombre del disco que se usará en el enlace simbólico del sistema operativo invitado (enlace simbólico).
  • IMAGE_FAMILY : una de las familias de imágenes disponibles que desea instalar en el disco de arranque
  • IMAGE_PROJECT : el proyecto de imagen al que pertenece la familia de imágenes

Si es necesario, puede conectar SSD locales a una máquina virtual de primera o segunda generación usando una combinación de nvme y scsi para diferentes particiones. El rendimiento del dispositivo nvme depende de la imagen del disco de inicio de su instancia. Las máquinas virtuales de tercera generación solo admiten la interfaz de disco NVMe.

Después de crear una máquina virtual con SSD local, debe formatear y montar cada dispositivo antes de poder usarlo.

Terraformar

Para crear una máquina virtual con discos SSD locales conectados, puede utilizar el recurso google_compute_instance .


# Create a VM with a local SSD for temporary storage use cases

resource "google_compute_instance" "default" {
  name         = "my-vm-instance-with-scratch"
  machine_type = "n2-standard-8"
  zone         = "us-central1-a"

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

  # Local SSD interface type; NVME for image with optimized NVMe drivers or SCSI
  # Local SSD are 375 GiB in size
  scratch_disk {
    interface = "SCSI"
  }

  network_interface {
    network = "default"
    access_config {}
  }
}

Para aprender cómo aplicar o eliminar una configuración de Terraform, consulte Comandos básicos de Terraform .

Para generar el código Terraform, puede utilizar el componente Código equivalente en la consola de Google Cloud.
  1. En la consola de Google Cloud, vaya a la página de instancias de VM .

    Ir a instancias de VM

  2. Haga clic en Crear instancia .
  3. Especifique los parámetros que desee.
  4. En la parte superior o inferior de la página, haga clic en Código equivalente y luego haga clic en la pestaña Terraform para ver el código de Terraform.

Ir

Go

Antes de probar este ejemplo, sigue las instrucciones de configuración Go en el inicio rápido de Compute Engine usando bibliotecas cliente . Para obtener más información, consulta la documentación de referencia de la API Go de Compute Engine .

Para autenticarse en Compute Engine, configure las credenciales predeterminadas de la aplicación. Para obtener más información, consulte Configurar la autenticación para un entorno de desarrollo local .

import (
	"context"
	"fmt"
	"io"

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

// createWithLocalSSD creates a new VM instance with Debian 10 operating system and a local SSD attached.
func createWithLocalSSD(w io.Writer, projectID, zone, instanceName string) error {
	// projectID := "your_project_id"
	// zone := "europe-central2-b"
	// instanceName := "your_instance_name"

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

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

	// List of public operating system (OS) images: https://cloud.google.com/compute/docs/images/os-details.
	newestDebianReq := &computepb.GetFromFamilyImageRequest{
		Project: "debian-cloud",
		Family:  "debian-12",
	}
	newestDebian, err := imagesClient.GetFromFamily(ctx, newestDebianReq)
	if err != nil {
		return fmt.Errorf("unable to get image from family: %w", err)
	}

	req := &computepb.InsertInstanceRequest{
		Project: projectID,
		Zone:    zone,
		InstanceResource: &computepb.Instance{
			Name: proto.String(instanceName),
			Disks: []*computepb.AttachedDisk{
				{
					InitializeParams: &computepb.AttachedDiskInitializeParams{
						DiskSizeGb:  proto.Int64(10),
						SourceImage: newestDebian.SelfLink,
						DiskType:    proto.String(fmt.Sprintf("zones/%s/diskTypes/pd-standard", zone)),
					},
					AutoDelete: proto.Bool(true),
					Boot:       proto.Bool(true),
					Type:       proto.String(computepb.AttachedDisk_PERSISTENT.String()),
				},
				{
					InitializeParams: &computepb.AttachedDiskInitializeParams{
						DiskType: proto.String(fmt.Sprintf("zones/%s/diskTypes/local-ssd", zone)),
					},
					AutoDelete: proto.Bool(true),
					Type:       proto.String(computepb.AttachedDisk_SCRATCH.String()),
				},
			},
			MachineType: proto.String(fmt.Sprintf("zones/%s/machineTypes/n1-standard-1", zone)),
			NetworkInterfaces: []*computepb.NetworkInterface{
				{
					Name: proto.String("global/networks/default"),
				},
			},
		},
	}

	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\n")

	return nil
}

Java

Java

Antes de probar este ejemplo, sigue las instrucciones de configuración Java en el inicio rápido de Compute Engine usando bibliotecas cliente . Para obtener más información, consulta la documentación de referencia de la API Java de Compute Engine .

Para autenticarse en Compute Engine, configure las credenciales predeterminadas de la aplicación. Para obtener más información, consulte Configurar la autenticación para un entorno de desarrollo local .


import com.google.cloud.compute.v1.AttachedDisk;
import com.google.cloud.compute.v1.AttachedDiskInitializeParams;
import com.google.cloud.compute.v1.Image;
import com.google.cloud.compute.v1.ImagesClient;
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 java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.TimeoutException;

public class CreateWithLocalSsd {

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

    createWithLocalSsd(projectId, zone, instanceName);
  }

  // Create a new VM instance with Debian 11 operating system and SSD local disk.
  public static void createWithLocalSsd(String projectId, String zone, String instanceName)
      throws IOException, ExecutionException, InterruptedException, TimeoutException {

    int diskSizeGb = 10;
    boolean boot = true;
    boolean autoDelete = true;
    String diskType = String.format("zones/%s/diskTypes/pd-standard", zone);
    // Get the latest debian image.
    Image newestDebian = getImageFromFamily("debian-cloud", "debian-11");
    List<AttachedDisk> disks = new ArrayList<>();

    // Create the disks to be included in the instance.
    disks.add(
        createDiskFromImage(diskType, diskSizeGb, boot, newestDebian.getSelfLink(), autoDelete));
    disks.add(createLocalSsdDisk(zone));

    // Create the instance.
    Instance instance = createInstance(projectId, zone, instanceName, disks);

    if (instance != null) {
      System.out.printf("Instance created with local SSD: %s", instance.getName());
    }

  }

  // Retrieve the newest image that is part of a given family in a project.
  // Args:
  //    projectId: project ID or project number of the Cloud project you want to get image from.
  //    family: name of the image family you want to get image from.
  private static Image getImageFromFamily(String projectId, String family) throws IOException {
    // Initialize client that will be used to send requests. This client only needs to be created
    // once, and can be reused for multiple requests. After completing all of your requests, call
    // the `imagesClient.close()` method on the client to safely
    // clean up any remaining background resources.
    try (ImagesClient imagesClient = ImagesClient.create()) {
      // List of public operating system (OS) images: https://cloud.google.com/compute/docs/images/os-details
      return imagesClient.getFromFamily(projectId, family);
    }
  }

  // Create an AttachedDisk object to be used in VM instance creation. Uses an image as the
  // source for the new disk.
  //
  // Args:
  //    diskType: the type of disk you want to create. This value uses the following format:
  //        "zones/{zone}/diskTypes/(pd-standard|pd-ssd|pd-balanced|pd-extreme)".
  //        For example: "zones/us-west3-b/diskTypes/pd-ssd"
  //
  //    diskSizeGb: size of the new disk in gigabytes.
  //
  //    boot: boolean flag indicating whether this disk should be used as a
  //    boot disk of an instance.
  //
  //    sourceImage: source image to use when creating this disk.
  //    You must have read access to this disk. This can be one of the publicly available images
  //    or an image from one of your projects.
  //    This value uses the following format: "projects/{project_name}/global/images/{image_name}"
  //
  //    autoDelete: boolean flag indicating whether this disk should be deleted
  //    with the VM that uses it.
  private static AttachedDisk createDiskFromImage(String diskType, int diskSizeGb, boolean boot,
      String sourceImage, boolean autoDelete) {

    AttachedDiskInitializeParams attachedDiskInitializeParams =
        AttachedDiskInitializeParams.newBuilder()
            .setSourceImage(sourceImage)
            .setDiskSizeGb(diskSizeGb)
            .setDiskType(diskType)
            .build();

    AttachedDisk bootDisk = AttachedDisk.newBuilder()
        .setInitializeParams(attachedDiskInitializeParams)
        // Remember to set auto_delete to True if you want the disk to be deleted when you delete
        // your VM instance.
        .setAutoDelete(autoDelete)
        .setBoot(boot)
        .build();

    return bootDisk;
  }

  // Create an AttachedDisk object to be used in VM instance creation. The created disk contains
  // no data and requires formatting before it can be used.
  // Args:
  //    zone: The zone in which the local SSD drive will be attached.
  private static AttachedDisk createLocalSsdDisk(String zone) {

    AttachedDiskInitializeParams attachedDiskInitializeParams =
        AttachedDiskInitializeParams.newBuilder()
            .setDiskType(String.format("zones/%s/diskTypes/local-ssd", zone))
            .build();

    AttachedDisk disk = AttachedDisk.newBuilder()
        .setType(AttachedDisk.Type.SCRATCH.name())
        .setInitializeParams(attachedDiskInitializeParams)
        .setAutoDelete(true)
        .build();

    return disk;
  }

  // Send an instance creation request to the Compute Engine API and wait for it to complete.
  // Args:
  //    projectId: project ID or project number of the Cloud project you want to use.
  //    zone: name of the zone to create the instance in. For example: "us-west3-b"
  //    instanceName: name of the new virtual machine (VM) instance.
  //    disks: a list of compute.v1.AttachedDisk objects describing the disks
  //           you want to attach to your new instance.
  private static Instance createInstance(String projectId, String zone, String instanceName,
      List<AttachedDisk> disks)
      throws IOException, ExecutionException, InterruptedException, TimeoutException {
    // Initialize client that will be used to send requests. This client only needs to be created
    // once, and can be reused for multiple requests. After completing all of your requests, call
    // the `instancesClient.close()` method on the client to safely
    // clean up any remaining background resources.
    try (InstancesClient instancesClient = InstancesClient.create()) {

      // machineType: machine type of the VM being created. This value uses the
      // following format: "zones/{zone}/machineTypes/{type_name}".
      // For example: "zones/europe-west3-c/machineTypes/f1-micro"
      String typeName = "n1-standard-1";
      String machineType = String.format("zones/%s/machineTypes/%s", zone, typeName);

      // networkLink: name of the network you want the new instance to use.
      // For example: "global/networks/default" represents the network
      // named "default", which is created automatically for each project.
      String networkLink = "global/networks/default";

      // Collect information into the Instance object.
      Instance instance = Instance.newBuilder()
          .setName(instanceName)
          .setMachineType(machineType)
          .addNetworkInterfaces(NetworkInterface.newBuilder().setName(networkLink).build())
          .addAllDisks(disks)
          .build();

      Operation response = instancesClient.insertAsync(projectId, zone, instance)
          .get(3, TimeUnit.MINUTES);

      if (response.hasError()) {
        throw new Error("Instance creation failed ! ! " + response);
      }
      System.out.println("Operation Status: " + response.getStatus());
      return instancesClient.get(projectId, zone, instanceName);
    }

  }

}

Pitón

Python

Antes de probar este ejemplo, sigue las instrucciones de configuración Python en el inicio rápido de Compute Engine usando bibliotecas cliente . Para obtener más información, consulta la documentación de referencia de la API Python de Compute Engine .

Para autenticarse en Compute Engine, configure las credenciales predeterminadas de la aplicación. Para obtener más información, consulte Configurar la autenticación para un entorno de desarrollo local .

from __future__ import annotations

import re
import sys
from typing import Any
import warnings

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


def get_image_from_family(project: str, family: str) -> compute_v1.Image:
    """
    Retrieve the newest image that is part of a given family in a project.

    Args:
        project: project ID or project number of the Cloud project you want to get image from.
        family: name of the image family you want to get image from.

    Returns:
        An Image object.
    """
    image_client = compute_v1.ImagesClient()
    # List of public operating system (OS) images: https://cloud.google.com/compute/docs/images/os-details
    newest_image = image_client.get_from_family(project=project, family=family)
    return newest_image


def disk_from_image(
    disk_type: str,
    disk_size_gb: int,
    boot: bool,
    source_image: str,
    auto_delete: bool = True,
) -> compute_v1.AttachedDisk:
    """
    Create an AttachedDisk object to be used in VM instance creation. Uses an image as the
    source for the new disk.

    Args:
         disk_type: the type of disk you want to create. This value uses the following format:
            "zones/{zone}/diskTypes/(pd-standard|pd-ssd|pd-balanced|pd-extreme)".
            For example: "zones/us-west3-b/diskTypes/pd-ssd"
        disk_size_gb: size of the new disk in gigabytes
        boot: boolean flag indicating whether this disk should be used as a boot disk of an instance
        source_image: source image to use when creating this disk. You must have read access to this disk. This can be one
            of the publicly available images or an image from one of your projects.
            This value uses the following format: "projects/{project_name}/global/images/{image_name}"
        auto_delete: boolean flag indicating whether this disk should be deleted with the VM that uses it

    Returns:
        AttachedDisk object configured to be created using the specified image.
    """
    boot_disk = compute_v1.AttachedDisk()
    initialize_params = compute_v1.AttachedDiskInitializeParams()
    initialize_params.source_image = source_image
    initialize_params.disk_size_gb = disk_size_gb
    initialize_params.disk_type = disk_type
    boot_disk.initialize_params = initialize_params
    # Remember to set auto_delete to True if you want the disk to be deleted when you delete
    # your VM instance.
    boot_disk.auto_delete = auto_delete
    boot_disk.boot = boot
    return boot_disk


def local_ssd_disk(zone: str) -> compute_v1.AttachedDisk():
    """
    Create an AttachedDisk object to be used in VM instance creation. The created disk contains
    no data and requires formatting before it can be used.

    Args:
        zone: The zone in which the local SSD drive will be attached.

    Returns:
        AttachedDisk object configured as a local SSD disk.
    """
    disk = compute_v1.AttachedDisk()
    disk.type_ = compute_v1.AttachedDisk.Type.SCRATCH.name
    initialize_params = compute_v1.AttachedDiskInitializeParams()
    initialize_params.disk_type = f"zones/{zone}/diskTypes/local-ssd"
    disk.initialize_params = initialize_params
    disk.auto_delete = True
    return disk


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_instance(
    project_id: str,
    zone: str,
    instance_name: str,
    disks: list[compute_v1.AttachedDisk],
    machine_type: str = "n1-standard-1",
    network_link: str = "global/networks/default",
    subnetwork_link: str = None,
    internal_ip: str = None,
    external_access: bool = False,
    external_ipv4: str = None,
    accelerators: list[compute_v1.AcceleratorConfig] = None,
    preemptible: bool = False,
    spot: bool = False,
    instance_termination_action: str = "STOP",
    custom_hostname: str = None,
    delete_protection: bool = False,
) -> compute_v1.Instance:
    """
    Send an instance creation request to the Compute Engine API and wait for it to complete.

    Args:
        project_id: project ID or project number of the Cloud project you want to use.
        zone: name of the zone to create the instance in. For example: "us-west3-b"
        instance_name: name of the new virtual machine (VM) instance.
        disks: a list of compute_v1.AttachedDisk objects describing the disks
            you want to attach to your new instance.
        machine_type: machine type of the VM being created. This value uses the
            following format: "zones/{zone}/machineTypes/{type_name}".
            For example: "zones/europe-west3-c/machineTypes/f1-micro"
        network_link: name of the network you want the new instance to use.
            For example: "global/networks/default" represents the network
            named "default", which is created automatically for each project.
        subnetwork_link: name of the subnetwork you want the new instance to use.
            This value uses the following format:
            "regions/{region}/subnetworks/{subnetwork_name}"
        internal_ip: internal IP address you want to assign to the new instance.
            By default, a free address from the pool of available internal IP addresses of
            used subnet will be used.
        external_access: boolean flag indicating if the instance should have an external IPv4
            address assigned.
        external_ipv4: external IPv4 address to be assigned to this instance. If you specify
            an external IP address, it must live in the same region as the zone of the instance.
            This setting requires `external_access` to be set to True to work.
        accelerators: a list of AcceleratorConfig objects describing the accelerators that will
            be attached to the new instance.
        preemptible: boolean value indicating if the new instance should be preemptible
            or not. Preemptible VMs have been deprecated and you should now use Spot VMs.
        spot: boolean value indicating if the new instance should be a Spot VM or not.
        instance_termination_action: What action should be taken once a Spot VM is terminated.
            Possible values: "STOP", "DELETE"
        custom_hostname: Custom hostname of the new VM instance.
            Custom hostnames must conform to RFC 1035 requirements for valid hostnames.
        delete_protection: boolean value indicating if the new virtual machine should be
            protected against deletion or not.
    Returns:
        Instance object.
    """
    instance_client = compute_v1.InstancesClient()

    # Use the network interface provided in the network_link argument.
    network_interface = compute_v1.NetworkInterface()
    network_interface.network = network_link
    if subnetwork_link:
        network_interface.subnetwork = subnetwork_link

    if internal_ip:
        network_interface.network_i_p = internal_ip

    if external_access:
        access = compute_v1.AccessConfig()
        access.type_ = compute_v1.AccessConfig.Type.ONE_TO_ONE_NAT.name
        access.name = "External NAT"
        access.network_tier = access.NetworkTier.PREMIUM.name
        if external_ipv4:
            access.nat_i_p = external_ipv4
        network_interface.access_configs = [access]

    # Collect information into the Instance object.
    instance = compute_v1.Instance()
    instance.network_interfaces = [network_interface]
    instance.name = instance_name
    instance.disks = disks
    if re.match(r"^zones/[a-z\d\-]+/machineTypes/[a-z\d\-]+$", machine_type):
        instance.machine_type = machine_type
    else:
        instance.machine_type = f"zones/{zone}/machineTypes/{machine_type}"

    instance.scheduling = compute_v1.Scheduling()
    if accelerators:
        instance.guest_accelerators = accelerators
        instance.scheduling.on_host_maintenance = (
            compute_v1.Scheduling.OnHostMaintenance.TERMINATE.name
        )

    if preemptible:
        # Set the preemptible setting
        warnings.warn(
            "Preemptible VMs are being replaced by Spot VMs.", DeprecationWarning
        )
        instance.scheduling = compute_v1.Scheduling()
        instance.scheduling.preemptible = True

    if spot:
        # Set the Spot VM setting
        instance.scheduling.provisioning_model = (
            compute_v1.Scheduling.ProvisioningModel.SPOT.name
        )
        instance.scheduling.instance_termination_action = instance_termination_action

    if custom_hostname is not None:
        # Set the custom hostname for the instance
        instance.hostname = custom_hostname

    if delete_protection:
        # Set the delete protection bit
        instance.deletion_protection = True

    # Prepare the request to insert an instance.
    request = compute_v1.InsertInstanceRequest()
    request.zone = zone
    request.project = project_id
    request.instance_resource = instance

    # Wait for the create operation to complete.
    print(f"Creating the {instance_name} instance in {zone}...")

    operation = instance_client.insert(request=request)

    wait_for_extended_operation(operation, "instance creation")

    print(f"Instance {instance_name} created.")
    return instance_client.get(project=project_id, zone=zone, instance=instance_name)


def create_with_ssd(
    project_id: str, zone: str, instance_name: str
) -> compute_v1.Instance:
    """
    Create a new VM instance with Debian 10 operating system and SSD local disk.

    Args:
        project_id: project ID or project number of the Cloud project you want to use.
        zone: name of the zone to create the instance in. For example: "us-west3-b"
        instance_name: name of the new virtual machine (VM) instance.

    Returns:
        Instance object.
    """
    newest_debian = get_image_from_family(project="debian-cloud", family="debian-12")
    disk_type = f"zones/{zone}/diskTypes/pd-standard"
    disks = [
        disk_from_image(disk_type, 10, True, newest_debian.self_link, True),
        local_ssd_disk(zone),
    ]
    instance = create_instance(project_id, zone, instance_name, disks)
    return instance

DESCANSAR

Utilice el instances.insert method para crear una máquina virtual a partir de una familia de imágenes o de una versión específica de una imagen del sistema operativo.

  • Para las series de máquinas ultra Z3, A3 y A2, para crear una máquina virtual con discos SSD locales conectados, cree una máquina virtual que utilice cualquiera de los tipos de máquinas disponibles para esa serie.
  • Para las series de máquinas C3 o C3D, para crear una máquina virtual con discos SSD locales conectados, especifique un tipo de instancia que incluya discos SSD locales ( -lssd ).

    Aquí hay una carga útil de solicitud de muestra que crea una máquina virtual C3 con un disco de arranque de Ubuntu y dos discos SSD locales:

    {
     "machineType":"zones/us-central1-c/machineTypes/c3-standard-8-lssd",
     "name":"c3-with-local-ssd",
     "disks":[
        {
           "type":"PERSISTENT",
           "initializeParams":{
              "sourceImage":"projects/ubuntu-os-cloud/global/images/family/ubuntu-2204-lts"
           },
           "boot":true
        }
     ],
     "networkInterfaces":[
        {
           "network":"global/networks/default"
    }
     ]
    }
    
  • Para M3 y las series de máquinas de primera y segunda generación, para crear una máquina virtual con discos SSD locales conectados, puede agregar dispositivos SSD locales durante la creación de la máquina virtual mediante la propiedad initializeParams . También debe proporcionar las siguientes propiedades:

    • diskType : Establecer en SSD local
    • autoDelete : Establecer en verdadero
    • type : Establecer en SCRATCH

    Las siguientes propiedades no se pueden utilizar con dispositivos SSD locales:

    • diskName
    • propiedad sourceImage
    • diskSizeGb

    A continuación se muestra una carga útil de solicitud de muestra que crea una máquina virtual M3 con un disco de arranque y cuatro discos SSD locales:

    {
     "machineType":"zones/us-central1-f/machineTypes/m3-ultramem-64",
     "name":"local-ssd-instance",
     "disks":[
        {
         "type":"PERSISTENT",
         "initializeParams":{
            "sourceImage":"projects/ubuntu-os-cloud/global/images/family/ubuntu-2204-lts"
         },
         "boot":true
        },
        {
           "type":"SCRATCH",
           "initializeParams":{
              "diskType":"zones/us-central1-f/diskTypes/local-ssd"
           },
           "autoDelete":true,
           "interface": "NVME"
        },
        {
           "type":"SCRATCH",
           "initializeParams":{
              "diskType":"zones/us-central1-f/diskTypes/local-ssd"
           },
           "autoDelete":true,
           "interface": "NVME"
        },
        {
           "type":"SCRATCH",
           "initializeParams":{
              "diskType":"zones/us-central1-f/diskTypes/local-ssd"
           },
           "autoDelete":true,
           "interface": "NVME"
        },
        {
           "type":"SCRATCH",
           "initializeParams":{
              "diskType":"zones/us-central1-f/diskTypes/local-ssd"
           },
           "autoDelete":true,
           "interface": "NVME"
        },
     ],
     "networkInterfaces":[
        {
           "network":"global/networks/default"
        }
     ]
    }
    

Después de crear un disco SSD local, debe formatear y montar cada dispositivo antes de poder usarlo.

Para obtener más información sobre cómo crear una instancia usando REST, consulta la API de Compute Engine .

Formatear y montar un dispositivo SSD local

Puede formatear y montar cada disco SSD local individualmente o puede combinar varios discos SSD locales en un único volumen lógico.

Formatee y monte particiones SSD locales individuales

La forma más sencilla de conectar SSD locales a su instancia es formatear y montar cada dispositivo con una única partición. Alternativamente, puede combinar varias particiones en un único volumen lógico .

Instancias de Linux

Formatee y monte el nuevo SSD local en su instancia de Linux. Puede utilizar cualquier formato de partición y configuración que necesite. Para este ejemplo, cree una única partición ext4 .

  1. Vaya a la página de instancias de VM.

    Ir a instancias de VM

  2. Haga clic en el botón SSH junto a la instancia que tiene el nuevo SSD local adjunto. El navegador abre una conexión de terminal a la instancia.

  3. En la terminal, use el comando find para identificar el SSD local que desea montar.

    $ find /dev/ | grep google-local-nvme-ssd
    

    Los SSD locales en modo SCSI tienen nombres estándar como google-local-ssd-0 . Los SSD locales en modo NVMe tienen nombres como google-local-nvme-ssd-0 , como se muestra en el siguiente resultado:

     $ find /dev/ | grep google-local-nvme-ssd
    
     /dev/disk/by-id/google-local-nvme-ssd-0
    
  4. Formatee el SSD local con un sistema de archivos ext4. Este comando elimina todos los datos existentes del SSD local.

    $ sudo mkfs.ext4 -F /dev/disk/by-id/[SSD_NAME]
    

    Reemplace [SSD_NAME] con el ID del SSD local que desea formatear. Por ejemplo, especifique google-local-nvme-ssd-0 para formatear el primer SSD local NVMe en la instancia.

  5. Utilice el comando mkdir para crear un directorio donde pueda montar el dispositivo.

    $ sudo mkdir -p /mnt/disks/[MNT_DIR]
    

    Reemplace [MNT_DIR] con la ruta del directorio donde desea montar su disco SSD local.

  6. Monte el SSD local en la VM.

    $ sudo mount /dev/disk/by-id/[SSD_NAME] /mnt/disks/[MNT_DIR]
    

    Reemplace lo siguiente:

    • [SSD_NAME] : el ID del SSD local que desea montar.
    • [MNT_DIR] : el directorio donde desea montar su SSD local.
  7. Configure el acceso de lectura y escritura al dispositivo. Para este ejemplo, otorgue acceso de escritura al dispositivo para todos los usuarios.

    $ sudo chmod a+w /mnt/disks/[MNT_DIR]
    

    Reemplace [MNT_DIR] con el directorio donde montó su SSD local.

Opcionalmente, puede agregar el SSD local al archivo /etc/fstab para que el dispositivo se vuelva a montar automáticamente cuando se reinicie la instancia. Esta entrada no conserva datos en su SSD local si la instancia se detiene. Consulte Persistencia de datos SSD local para obtener detalles completos.

Cuando especifique la entrada del archivo /etc/fstab , asegúrese de incluir la opción nofail para que la instancia pueda continuar arrancando incluso si el SSD local no está presente. Por ejemplo, si toma una instantánea del disco de arranque y crea una nueva instancia sin ningún disco SSD local conectado, la instancia puede continuar con el proceso de inicio y no pausarse indefinidamente.

  1. Cree la entrada /etc/fstab . Utilice el comando blkid para buscar el UUID del sistema de archivos en el dispositivo y edite el archivo /etc/fstab para incluir ese UUID con las opciones de montaje. Puede completar este paso con un solo comando.

    Por ejemplo, para un SSD local en modo NVMe, use el siguiente comando:

    $ echo UUID=`sudo blkid -s UUID -o value /dev/disk/by-id/google-local-nvme-ssd-0` /mnt/disks/[MNT_DIR] ext4 discard,defaults,nofail 0 2 | sudo tee -a /etc/fstab
    

    Para un SSD local en un modo que no sea NVMe, como SCSI, utilice el siguiente comando:

    $ echo UUID=`sudo blkid -s UUID -o value /dev/disk/by-id/google-local-ssd-0` /mnt/disks/[MNT_DIR] ext4 discard,defaults,nofail 0 2 | sudo tee -a /etc/fstab
    

    Reemplace [MNT_DIR] con el directorio donde montó su SSD local.

  2. Utilice el comando cat para verificar que sus entradas en /etc/fstab sean correctas:

    $ cat /etc/fstab
    

Si crea una instantánea desde el disco de arranque de esta instancia y la usa para crear una instancia separada que no tiene SSD locales, edite el archivo /etc/fstab y elimine la entrada para este SSD local. Incluso con la opción nofail implementada, mantenga el archivo /etc/fstab sincronizado con las particiones adjuntas a su instancia y elimine estas entradas antes de crear la instantánea del disco de arranque.

Instancias de Windows

Utilice la herramienta de administración de discos de Windows para formatear y montar un SSD local en una instancia de Windows.

  1. Conéctese a la instancia a través de RDP. Para este ejemplo, vaya a la página de instancias de VM y haga clic en el botón RDP junto a la instancia que tiene los SSD locales conectados. Después de ingresar su nombre de usuario y contraseña, se abre una ventana con la interfaz de escritorio de su servidor.

  2. Haga clic derecho en el botón Inicio de Windows y seleccione Administración de discos .

    Seleccionar la herramienta Administrador de discos de Windows en el menú contextual en el botón Inicio de Windows.

  3. Si no ha inicializado el SSD local antes, la herramienta le pedirá que seleccione un esquema de partición para las nuevas particiones. Seleccione GPT y haga clic en Aceptar .

    Seleccionar un esquema de partición en la ventana de inicialización del disco.

  4. Después de que se inicialice el SSD local, haga clic derecho en el espacio en disco no asignado y seleccione Nuevo volumen simple .

    Creando un nuevo volumen simple desde el disco adjunto.

  5. Siga las instrucciones del Asistente para nuevo volumen simple para configurar el nuevo volumen. Puede utilizar cualquier formato de partición que desee, pero para este ejemplo seleccione NTFS . Además, marque Realizar un formato rápido para acelerar el proceso de formateo.

    Seleccionar el tipo de formato de partición en el Asistente para nuevo volumen simple.

  6. Después de completar el asistente y el volumen termine de formatearse, verifique el nuevo SSD local para asegurarse de que tenga un estado Healthy .

    Al ver la lista de discos reconocidos por Windows, verifique que el SSD local tenga un estado saludable.

¡Eso es todo! Ahora puede escribir archivos en el SSD local.

Formatee y monte varias particiones SSD locales en un único volumen lógico

A diferencia de los SSD persistentes , los SSD locales tienen una capacidad fija de 375 GB para cada dispositivo que conecte a la instancia. Si desea combinar varias particiones SSD locales en un único volumen lógico, debe definir usted mismo la administración de volúmenes en estas particiones.

Instancias de Linux

Utilice mdadm para crear una matriz RAID 0. Este ejemplo formatea la matriz con un único sistema de archivos ext4 , pero puede aplicar cualquier sistema de archivos que prefiera.

  1. Vaya a la página de instancias de VM.

    Ir a instancias de VM

  2. Haga clic en el botón SSH junto a la instancia que tiene el nuevo SSD local adjunto. El navegador abre una conexión de terminal a la instancia.

  3. En la terminal, instale la herramienta mdadm . El proceso de instalación de mdadm incluye un mensaje de usuario que detiene los scripts, así que ejecute este proceso manualmente.

    Debian y Ubuntu:

    $ sudo apt update && sudo apt install mdadm --no-install-recommends
    

    CentOS y RHEL:

    $ sudo yum install mdadm -y
    

    SLES y openSUSE:

    $ sudo zypper install -y mdadm
    

  4. Utilice el comando find para identificar todos los SSD locales que desea montar juntos.

    Para este ejemplo, la instancia tiene ocho particiones SSD locales en modo NVMe:

    $  find /dev/ | grep google-local-nvme-ssd
    
     /dev/disk/by-id/google-local-nvme-ssd-7
     /dev/disk/by-id/google-local-nvme-ssd-6
     /dev/disk/by-id/google-local-nvme-ssd-5
     /dev/disk/by-id/google-local-nvme-ssd-4
     /dev/disk/by-id/google-local-nvme-ssd-3
     /dev/disk/by-id/google-local-nvme-ssd-2
     /dev/disk/by-id/google-local-nvme-ssd-1
     /dev/disk/by-id/google-local-nvme-ssd-0
    

    find no garantiza un pedido. Está bien si los dispositivos aparecen en un orden diferente, siempre y cuando el número de líneas de salida coincida con el número esperado de particiones SSD. Los SSD locales en modo SCSI tienen nombres estándar como google-local-ssd . Los SSD locales en modo NVMe tienen nombres como google-local-nvme-ssd .

  5. Utilice mdadm para combinar varios dispositivos SSD locales en una única matriz denominada /dev/md0 . Este ejemplo combina ocho dispositivos SSD locales en modo NVMe. Para dispositivos SSD locales en modo SCSI, especifique los nombres que obtuvo del comando find :

    $ sudo mdadm --create /dev/md0 --level=0 --raid-devices=8 \
     /dev/disk/by-id/google-local-nvme-ssd-0 \
     /dev/disk/by-id/google-local-nvme-ssd-1 \
     /dev/disk/by-id/google-local-nvme-ssd-2 \
     /dev/disk/by-id/google-local-nvme-ssd-3 \
     /dev/disk/by-id/google-local-nvme-ssd-4 \
     /dev/disk/by-id/google-local-nvme-ssd-5 \
     /dev/disk/by-id/google-local-nvme-ssd-6 \
     /dev/disk/by-id/google-local-nvme-ssd-7
    
    mdadm: Defaulting to version 1.2 metadata
    mdadm: array /dev/md0 started.
    
    

    Puede confirmar los detalles de la matriz con mdadm --detail . Agregar el indicador --prefer=by-id enumerará los dispositivos que utilizan las rutas /dev/disk/by-id .

     sudo mdadm --detail --prefer=by-id /dev/md0
     

    El resultado debería ser similar al siguiente para cada dispositivo de la matriz.

     ...
     Number   Major   Minor   RaidDevice State
        0      259      0         0      active sync   /dev/disk/by-id/google-local-nvme-ssd-0
     ...
     

  6. Formatee la matriz /dev/md0 completa con un sistema de archivos ext4.

    $ sudo mkfs.ext4 -F /dev/md0
    
  7. Cree un directorio donde pueda montar /dev/md0 . Para este ejemplo, cree el directorio /mnt/disks/ssd-array :

    $ sudo mkdir -p /mnt/disks/[MNT_DIR]
    

    Reemplace [MNT_DIR] con el directorio donde desea montar su matriz SSD local.

  8. Monte la matriz /dev/md0 en el directorio /mnt/disks/ssd-array :

    $ sudo mount /dev/md0 /mnt/disks/[MNT_DIR]
    

    Reemplace [MNT_DIR] con el directorio donde desea montar su matriz SSD local.

  9. Configure el acceso de lectura y escritura al dispositivo. Para este ejemplo, otorgue acceso de escritura al dispositivo para todos los usuarios.

    $ sudo chmod a+w /mnt/disks/[MNT_DIR]
    

    Reemplace [MNT_DIR] con el directorio donde montó su matriz SSD local.

Opcionalmente, puede agregar el SSD local al archivo /etc/fstab para que el dispositivo se vuelva a montar automáticamente cuando se reinicie la instancia. Esta entrada no conserva datos en su SSD local si la instancia se detiene. Consulte Persistencia de datos SSD local para obtener más detalles.

Cuando especifique la entrada del archivo /etc/fstab , asegúrese de incluir la opción nofail para que la instancia pueda continuar arrancando incluso si el SSD local no está presente. Por ejemplo, si toma una instantánea del disco de arranque y crea una nueva instancia sin ningún SSD local conectado, la instancia puede continuar con el proceso de inicio y no pausarse indefinidamente.

  1. Cree la entrada /etc/fstab . Utilice el comando blkid para buscar el UUID del sistema de archivos en el dispositivo y edite el archivo /etc/fstab para incluir ese UUID con las opciones de montaje. Especifique la opción nofail para permitir que el sistema se inicie incluso si el SSD local no está disponible. Puede completar este paso con un solo comando. Por ejemplo:

    $ echo UUID=`sudo blkid -s UUID -o value /dev/md0` /mnt/disks/[MNT_DIR] ext4 discard,defaults,nofail 0 2 | sudo tee -a /etc/fstab
    

    Reemplace [MNT_DIR] con el directorio donde montó su matriz SSD local.

  2. Si usa un nombre de dispositivo como /dev/md0 en el archivo /etc/fstab en lugar del UUID, debe editar el archivo /etc/mdadm/mdadm.conf para asegurarse de que la matriz se vuelva a ensamblar automáticamente en el arranque. Para hacer esto, complete los siguientes dos pasos:

    1. Asegúrese de que la matriz de discos se escanee y se vuelva a ensamblar automáticamente durante el arranque.
      $ sudo mdadm --detail --scan | sudo tee -a /etc/mdadm/mdadm.conf
      
    2. Actualice initramfs para que la matriz esté disponible durante el proceso de inicio temprano.
      $ sudo update-initramfs -u
      
  3. Utilice el comando cat para verificar que sus entradas en /etc/fstab sean correctas:

    $ cat /etc/fstab
    

Si crea una instantánea desde el disco de arranque de esta instancia y la usa para crear una instancia separada que no tiene SSD locales, edite el archivo /etc/fstab y elimine la entrada para esta matriz de SSD local. Incluso con la opción nofail implementada, mantenga el archivo /etc/fstab sincronizado con las particiones adjuntas a su instancia y elimine estas entradas antes de crear la instantánea del disco de arranque.

Instancias de Windows

Utilice la herramienta de administración de discos de Windows para formatear y montar una serie de SSD locales en una instancia de Windows.

  1. Conéctese a la instancia a través de RDP. Para este ejemplo, vaya a la página de instancias de VM y haga clic en el botón RDP junto a la instancia que tiene los SSD locales conectados. Después de ingresar su nombre de usuario y contraseña, se abre una ventana con la interfaz de escritorio de su servidor.

  2. Haga clic derecho en el botón Inicio de Windows y seleccione Administración de discos .

    Seleccionar la herramienta Administrador de discos de Windows en el menú contextual en el botón Inicio de Windows.

  3. Si no ha inicializado los SSD locales antes, la herramienta le solicita que seleccione un esquema de partición para las nuevas particiones. Seleccione GPT y haga clic en Aceptar .

    Seleccionar un esquema de partición en la ventana de inicialización del disco.

  4. Después de que se inicialice el SSD local, haga clic con el botón derecho en el espacio en disco no asignado y seleccione Nuevo volumen seccionado .

    Creando un nuevo volumen seccionado a partir del disco adjunto.

  5. Seleccione las particiones SSD locales que desea incluir en la matriz seccionada. Para este ejemplo, seleccione todas las particiones para combinarlas en un único dispositivo SSD local.

    Seleccionar las particiones SSD locales para incluir en la matriz.

  6. Siga las instrucciones del Asistente para nuevo volumen seccionado para configurar el nuevo volumen. Puede utilizar cualquier formato de partición que desee, pero para este ejemplo seleccione NTFS . Además, marque Realizar un formato rápido para acelerar el proceso de formateo.

    Seleccionar el tipo de formato de partición en el Asistente para nuevo volumen seccionado.

  7. Después de completar el asistente y el volumen termine de formatearse, verifique el nuevo SSD local para asegurarse de que tenga un estado Healthy .

    Al ver la lista de discos reconocidos por Windows, verifique que el SSD local tenga un estado saludable.

Ahora puede escribir archivos en el SSD local.

¿Qué sigue?