Edita el tipo de máquina de una instancia de VM


Si tu VM no tiene un SSD local y no forma parte de un grupo de instancias administrado (MIG), puedes cambiar el tipo de máquina de la VM después de detenerla.

Si el tipo de máquina existente no es adecuado para las cargas de trabajo que ejecutas en la VM, cambia el tipo de máquina de esa VM. Puedes cambiar el tipo de máquina de una instancia para ajustar la cantidad de CPU virtuales y memoria cuando cambia la carga de trabajo. Por ejemplo, puedes iniciar una VM con una máquina más pequeña durante el proceso de configuración, desarrollo y prueba, y cambiar la VM a fin de usar un tipo de máquina más grande cuando estés listo para las cargas de trabajo de producción.

Para las VM que no tienen un SSD local y no forman parte de un MIG, puedes cambiar el tipo de máquina sin afectar los siguientes recursos:

  • Las claves SSH de la VM
  • Los parámetros de configuración de la VM, como los metadatos de VM
  • Los datos de disco persistente de la VM, incluidas las aplicaciones instaladas y los datos de aplicación

Si necesitas cambiar el tipo de máquina de VM dentro de un MIG, consulta Aplica de forma automática las actualizaciones de configuración de VM en un MIG.

Antes de comenzar

  • Obtén más información sobre cómo detener una VM.
  • Obtén información sobre los tipos de máquina.
  • Si aún no lo hiciste, configura la autenticación. La autenticación es el proceso mediante el cual se verifica tu identidad para acceder a los servicios y las API de Google Cloud. Para ejecutar un código o muestras desde un entorno de desarrollo local, puedes autenticarte en Compute Engine de la siguiente manera.

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

    Console

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

    Java

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

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

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

      gcloud auth application-default login

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

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

    Python

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

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

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

      gcloud auth application-default login

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

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

    REST

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

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

      gcloud init

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

Limitaciones

Implicaciones de facturación

Cada tipo de máquina se factura a una tarifa diferente. Por lo tanto, asegúrate de comprender las implicaciones de precios del cambio de tipos de máquina. Por ejemplo, un tipo de máquina e2-standard-2 cuesta más que uno e2-micro.

Cambiar un tipo de máquina también puede influir en los descuentos por uso continuo para esa VM. Los descuentos por uso continuo se calculan por separado para diferentes categorías en la misma región. Si cambias los tipos de máquina a fin de que el tipo de máquina nuevo esté en una categoría diferente, el tiempo de ejecución posterior de la VM de máquina virtual se considera para el descuento por uso continuo de la categoría nueva.

Por ejemplo, supongamos que tienes una VM con el tipo de máquina n2-standard-2 que se ejecuta durante medio mes. Luego, decides cambiar el tipo de máquina a m1-ultramem-40. Una vez que realizas ese cambio, Compute Engine comienza a considerar el tiempo de ejecución de la instancia de VM para el descuento por uso continuo de la categoría de CPU virtual con optimización de memoria y memoria.

En tu factura, verás un descuento por uso continuo aplicado al tipo de máquina n2-standard-2 antes de realizar el cambio y un descuento por uso continuo para m1-ultramem-40, si la VM se sigue ejecutando en m1-ultramem-40 durante al menos el 25% del resto del mes.

Prácticas recomendadas

Estas son algunas de las prácticas recomendadas que ofrecemos para ayudarte a cambiar correctamente el tipo de máquina de VM.

  • Haz copias de seguridad regulares de los datos del disco persistente mediante instantáneas. Considera tomar una instantánea de los datos del disco persistente antes de cambiar el tipo de máquina. Si deseas asegurarte de que el tipo de máquina nuevo sea compatible con los datos de la VM existente, puedes tomar una instantánea del disco persistente y usarla para iniciar una segunda VM con el tipo de máquina nuevo para confirmar que la VM se inicia correctamente.

  • Agrega discos persistentes adicionales al archivo /etc/fstab. Si tienes discos persistentes adicionales adjuntos a tu VM, asegúrate de que se agreguen al archivo /etc/fstab para que se activen de forma automática cuando se reinicie la VM.

  • Crea una reserva antes de cambiar el tipo de máquina. Para evitar errores relacionados con la disponibilidad de recursos, crea Reservas de Compute Engine para los nuevos tipos de máquinas cuando están disponibles para reservarlos dentro de una zona. Las reservas ayudan a garantizar que los recursos estén disponibles cuando los necesites.

Para crear una reserva, completa los siguientes pasos:

  1. Crea una reserva (o identifica las reservas existentes) con propiedades idénticas a las VMs planificadas. El recuento de VM de la reserva debe ser igual o mayor que la cantidad de VMs que deseas cambiar. De forma opcional, para evitar que otras VMs consuman esta reserva, usa la opción specificReservationRequired.

  2. Verifica que las VMs planificadas puedan consumir la reserva:

    1. Verifica que las VMs deseadas tengan la afinidad de reserva correcta.
    2. Inmediatamente antes de cambiar las VMs, asegúrate de que la reserva tenga suficiente capacidad.

Cambia un tipo de máquina

Solo puedes cambiar el tipo de máquina de una instancia detenida. Una VM se considera detenida solo cuando está en estado TERMINATED. No puedes cambiar el tipo de máquina de una VM en ejecución.

Si quieres actualizar tu tipo de máquina a la última generación, consulta Mueve tu VM a una serie de máquinas de tercera generación antes de continuar.

Permisos necesarios para esta tarea

Para realizar esta tarea, debes tener los siguientes permisos:

  • compute.instances.setMachineType en la VM

Console

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

    Ir a Instancias de VM

  2. En la columna Nombre, haz clic en el nombre de la VM en la que deseas cambiar el tipo de máquina.

  3. En la página de detalles de la instancia de VM, completa los siguientes pasos:

    1. Si la VM se está ejecutando, en el menú en la parte superior de la página, selecciona Detener para detener la VM.
    2. Para editar la VM, haz clic en Editar.
    3. En la sección Configuración de la máquina, selecciona el tipo de máquina que deseas usar o crea un tipo personalizado de máquina.

    4. Para guardar los cambios, haz clic en Guardar.

    5. Reinicia la VM.

gcloud

  1. Detén la VM mediante el comando gcloud compute instances stop:

    gcloud compute instances stop VM_NAME
    

    Reemplaza VM_NAME por la VM que contiene el tipo de máquina que deseas cambiar.

  2. Cambia el tipo de máquina con el comando gcloud compute instances set-machine-type:

    gcloud compute instances set-machine-type VM_NAME \
        --machine-type NEW_MACHINE_TYPE
    

    Reemplaza NEW_MACHINE_TYPE con el nuevo tipo de máquina para la VM. El tipo de máquina puede ser uno de los siguientes:

  3. Inicia la VM con el comando gcloud compute instances start:

    gcloud compute instances start VM_NAME
    

    Reemplaza VM_NAME por el nombre de la VM que cambiaste.

Java

Java

Antes de probar esta muestra, sigue las instrucciones de configuración de Java en la Guía de inicio rápido de Compute Engine: Usa las bibliotecas cliente. Si quieres obtener más información, consulta la documentación de referencia de la API de Java de Compute Engine.

Para autenticarte en Compute Engine, configura las credenciales predeterminadas de la aplicación. Si deseas obtener más información, consulta Configura la autenticación para un entorno de desarrollo local.


import com.google.cloud.compute.v1.Instance;
import com.google.cloud.compute.v1.Instance.Status;
import com.google.cloud.compute.v1.InstancesClient;
import com.google.cloud.compute.v1.InstancesSetMachineTypeRequest;
import com.google.cloud.compute.v1.Operation;
import java.io.IOException;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.TimeoutException;

public class ChangeInstanceMachineType {

  public static void main(String[] args)
      throws IOException, ExecutionException, InterruptedException, TimeoutException {
    // TODO(developer): Replace these variables before running the sample.
    // Project ID or project number of the Cloud project you want to use.
    String projectId = "your-project-id";
    // Name of the zone your instance belongs to.
    String zone = "zone-name";
    // Name of the VM you want to modify.
    String instanceName = "instance-name";
    // The new machine type you want to use for the VM.
    // For example: "e2-standard-8", "e2-custom-4-2048" or "m1-ultramem-40"
    // More about machine types: https://cloud.google.com/compute/docs/machine-resource
    String newMachineType = "e2-standard-8";
    changeMachineType(projectId, zone, instanceName, newMachineType);
  }

  // Changes the machine type of VM.
  // The VM needs to be in the 'TERMINATED' state for this operation to be successful.
  public static void changeMachineType(String projectId, String zone, String instanceName,
      String newMachineType)
      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()) {

      Instance instance = instancesClient.get(projectId, zone, instanceName);
      if (!instance.getStatus().equals(Status.TERMINATED.name())) {
        throw new Error(String.format(
            "Only machines in TERMINATED state can have their machine type changed. "
                + "%s is in %s state.", instance.getName(), instance.getStatus()));
      }

      InstancesSetMachineTypeRequest machineTypeRequest =
          InstancesSetMachineTypeRequest.newBuilder()
              .setMachineType(String.format("projects/%s/zones/%s/machineTypes/%s",
                  projectId, zone, newMachineType))
              .build();

      Operation response = instancesClient
          .setMachineTypeAsync(projectId, zone, instanceName, machineTypeRequest)
          .get(3, TimeUnit.MINUTES);

      if (response.hasError()) {
        System.out.println("Machine type update failed! " + response);
        return;
      }
      System.out.println("Machine type update - operation status: " + response.getStatus());
    }
  }
}

Python

Python

Antes de probar esta muestra, sigue las instrucciones de configuración de Python en la Guía de inicio rápido de Compute Engine: Usa las bibliotecas cliente. Si quieres obtener más información, consulta la documentación de referencia de la API de Python de Compute Engine.

Para autenticarte en Compute Engine, configura las credenciales predeterminadas de la aplicación. Si deseas obtener más información, consulta Configura la autenticación para un entorno de desarrollo local.

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 change_machine_type(
    project_id: str, zone: str, instance_name: str, new_machine_type: str
) -> None:
    """
    Changes the machine type of VM. The VM needs to be in the 'TERMINATED' state for this operation to be successful.

    Args:
        project_id: project ID or project number of the Cloud project you want to use.
        zone: name of the zone your instance belongs to.
        instance_name: name of the VM you want to modify.
        new_machine_type: the new machine type you want to use for the VM.
            For example: `e2-standard-8`, `e2-custom-4-2048` or `m1-ultramem-40`
            More about machine types: https://cloud.google.com/compute/docs/machine-resource
    """
    client = compute_v1.InstancesClient()
    instance = client.get(project=project_id, zone=zone, instance=instance_name)

    if instance.status != compute_v1.Instance.Status.TERMINATED.name:
        raise RuntimeError(
            f"Only machines in TERMINATED state can have their machine type changed. "
            f"{instance.name} is in {instance.status}({instance.status_message}) state."
        )

    machine_type = compute_v1.InstancesSetMachineTypeRequest()
    machine_type.machine_type = (
        f"projects/{project_id}/zones/{zone}/machineTypes/{new_machine_type}"
    )
    operation = client.set_machine_type(
        project=project_id,
        zone=zone,
        instance=instance_name,
        instances_set_machine_type_request_resource=machine_type,
    )

    wait_for_extended_operation(operation, "changing machine type")

REST

  1. Detén la VM mediante el método instances.stop:

    POST https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/zones/ZONE/instances/VM_NAME/stop
    

    Reemplaza lo siguiente:

    • PROJECT_ID: El ID del proyecto

    • ZONE: la zona que contiene la VM

    • VM_NAME: la VM que contiene el tipo de máquina que se debe cambiar

  2. Para cambiar el tipo de máquina, usa el método instances.setMachineType:

    POST https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/zones/ZONE/instances/VM_NAME/setMachineType
    

    En el cuerpo de la solicitud, proporciona el machineType actualizado:

    {
        machineType: "zones/MACHINE_TYPE_ZONE/machineTypes/NEW_MACHINE_TYPE"
    }
    

    Reemplaza lo siguiente:

    • MACHINE_TYPE_ZONE: la zona que contiene el tipo de máquina

    • NEW_MACHINE_TYPE: el tipo de máquina nuevo para la VM

      El tipo de máquina puede ser uno de los siguientes:

  3. Detén la VM mediante el método instances.start:

    POST https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/zones/ZONE/instances/VM_NAME/start
    

    Reemplaza lo siguiente:

    • PROJECT_ID: El ID del proyecto
    • ZONE: la zona que contiene la VM
    • VM_NAME: El nombre de la VM que cambiaste.

Pasa a un tipo de máquina más pequeño

Si pasas de un tipo de máquina con más recursos a uno con menos recursos, como pasar de un tipo de máquina e2-standard-8 a uno e2-standard-2, podrías tener problemas de recursos de hardware o limitaciones de rendimiento dado que los tipos de máquina más pequeños son menos eficaces que los tipos de máquina más grandes. Asegúrate de que el tipo de máquina nuevo sea compatible con cualquier aplicación o servicio que se esté ejecutando en la VM, o de actualizar los servicios y las aplicaciones para que se ejecuten en los tipos de máquina más pequeños.

Revisa las recomendaciones de redimensionamiento antes de cambiar el tipo de máquina. Para obtener información sobre las recomendaciones de tamaño de Compute Engine, consulta Aplica recomendaciones de tipo de máquina para instancias de VM.

Mueve tu VM a una serie de máquinas de tercera generación

Cuando se cumplan los requisitos, puedes modificar la VM para usar un tipo de máquina en una serie de máquinas de generación nueva si cambias el tipo de máquina, por ejemplo, de m1-ultramem-160 a m3-ultramem-128.

Es posible que los tipos de máquinas de tercera generación y los tipos de máquinas Arm T2A no admitan las mismas interfaces y funciones que tu tipo de máquina actual. Antes de comenzar el proceso de migración, revisa los requisitos y las consideraciones en Prepárate para migrar a una VM nueva.

Para cambiar el tipo de máquina de tu instancia de VM a un tipo de máquina de tercera generación, puedes usar uno de los siguientes enfoques.

Crea una instancia de VM nueva y mueve tu carga de trabajo

En este procedimiento, crearás una instancia de VM nueva y, luego, moverás tu carga de trabajo a la VM nueva.

Para obtener detalles sobre cómo completar este procedimiento, consulta Mueve tu carga de trabajo de una VM existente a una VM nueva.

Cambia el tipo de máquina a uno nuevo

En este procedimiento, debes verificar que la instancia de VM actual se pueda actualizar para usar el tipo de máquina nuevo y, luego, cambiarlo.

  1. Verifica que tu instancia de VM actual use una versión del sistema operativo compatible con el nuevo tipo de máquina. Si la versión no es compatible, sigue las instrucciones en Mueve la carga de trabajo de una VM existente a una nueva.

  2. Si deseas cambiar el tipo de máquina para tu VM a un tipo de máquina T2A, sigue las instrucciones en Mueve tu carga de trabajo de una VM existente a una nueva.

  3. Si tu VM actual tiene un SSD local conectado, sigue las instrucciones en Mueve tu carga de trabajo de una VM existente a una nueva.

  4. Verifica que tus aplicaciones y programas puedan admitir una red diferente o una interfaz de almacenamiento, como gVNIC o NVMe.

  5. Revisa las prácticas recomendadas para cambiar el tipo de máquina de una VM.

  6. Sigue el procedimiento que se describe en Cambia un tipo de máquina.

¿Qué sigue?