Editar el tipo de máquina de una instancia informática


Si su instancia de máquina virtual (VM) no tiene SSD local adjunto y no forma parte de un grupo de instancias administrado (MIG), puede cambiar el tipo de máquina de su instancia después de detenerla .

Si su tipo de máquina existente no se adapta bien a las cargas de trabajo que ejecuta en su VM, cambie el tipo de máquina de esa VM. Por ejemplo, puede iniciar una máquina virtual con un tipo de máquina más pequeño durante la configuración, el desarrollo y las pruebas, y cambiar la máquina virtual para que utilice un tipo de máquina más grande cuando esté listo para las cargas de trabajo de producción.

Puede utilizar este procedimiento en las siguientes situaciones:

  • Para cambiar a un tipo de máquina similar pero con una cantidad diferente de vCPU o memoria dentro de la misma serie de máquinas, por ejemplo:
    • Puede cambiar n2-highcpu-4 a n2-standard-4 .
    • Puedes cambiar c3d-standard-30 a c3d-highmem-30 .
  • Cambiar el tipo de máquina para utilizar una serie de máquina diferente. Esto solo es compatible con las series de máquinas de primera y segunda generación , excluidas las series de máquinas T2A y A2. Por ejemplo:
    • Puedes cambiar n2-standard-4 a c2-standard-8 .
    • Puede cambiar n1-highmem-4 a n2d-standard-16 .

Si desea cambiar el tipo de máquina de una máquina virtual que utiliza una serie de máquinas de primera o segunda generación (N1, N2, M1, etc.) a un tipo de máquina para una serie de máquinas de tercera generación o posterior (M3, C3, N4, etc.), debe utilizar el procedimiento documentado en Mover su carga de trabajo a una nueva instancia informática .

Puede cambiar el tipo de máquina sin afectar los siguientes recursos:

  • Las claves SSH de la VM
  • Las configuraciones de VM, como los metadatos de VM.
  • Los datos del disco persistente o hiperdisco adjunto, incluidas las aplicaciones instaladas y los datos de las aplicaciones.

Para cambiar el tipo de máquina de las VM dentro de un MIG, consulte Aplicar automáticamente actualizaciones de configuración de VM en un MIG .

Antes de comenzar

  • Comprenda cómo detener una máquina virtual .
  • Comprender los tipos de máquinas .
  • Si aún no lo has hecho, configura la autenticación. La autenticación es el proceso mediante el cual se verifica su identidad para acceder a Google Cloud servicios y API. Para ejecutar código o muestras desde un entorno de desarrollo local, puedes autenticarte en Compute Engine seleccionando una de las siguientes opciones:

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

    Console

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

    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. If you're using an external identity provider (IdP), you must first sign in to the gcloud CLI with your federated identity.

    3. To initialize the gcloud CLI, run the following command:

      gcloud init
    4. 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.

      If an authentication error is returned, confirm that you have configured the gcloud CLI to use Workforce Identity Federation.

    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. If you're using an external identity provider (IdP), you must first sign in to the gcloud CLI with your federated identity.

    3. To initialize the gcloud CLI, run the following command:

      gcloud init
    4. 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.

      If an authentication error is returned, confirm that you have configured the gcloud CLI to use Workforce Identity Federation.

    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.

      After installing the Google Cloud CLI, initialize it by running the following command:

      gcloud init

      If you're using an external identity provider (IdP), you must first sign in to the gcloud CLI with your federated identity.

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

Roles requeridos

Para obtener los permisos que necesita para cambiar el tipo de máquina de una VM, solicite a su administrador que le otorgue las siguientes funciones de IAM en el proyecto:

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 cambiar el tipo de máquina de una VM. Para ver los permisos exactos que se requieren, expanda la sección Permisos requeridos :

Permisos requeridos

Se requieren los siguientes permisos para cambiar el tipo de máquina de una VM:

  • compute.instances.setMachineType en VM
  • compute.instances.start en la máquina virtual
  • compute.instances.stop en VM

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

Limitaciones

Implicaciones de facturación

Cada tipo de máquina se factura a una tarifa diferente, así que asegúrese de comprender las implicaciones de precios al cambiar de tipo de máquina. Por ejemplo, una máquina del tipo e2-standard-2 cuesta más que una del tipo e2-micro .

Cambiar un tipo de máquina también podría afectar los descuentos por uso sostenido para esa VM. Los descuentos por uso sostenido se calculan por separado para diferentes categorías en la misma región. Si cambia los tipos de máquinas para que el nuevo tipo de máquina esté en una categoría diferente, el tiempo de ejecución posterior de la máquina virtual cuenta para el descuento por uso sostenido de la nueva categoría.

Por ejemplo, supongamos que tiene una máquina virtual con el tipo de máquina n2-standard-2 ejecutándose durante medio mes. Luego decide cambiar el tipo de máquina a m1-ultramem-40 . Una vez que realiza ese cambio, Compute Engine comienza a contar el tiempo de ejecución de la VM para el descuento por uso sostenido de la vCPU con memoria optimizada y la categoría de memoria.

En su factura, verá un descuento por uso sostenido aplicado al tipo de máquina n2-standard-2 antes de realizar el cambio de tipo de máquina, y un descuento por uso sostenido separado para m1-ultramem-40 , si su máquina virtual sigue funcionando en m1-ultramem-40 durante al menos un 25 % del resto del mes.

Pasar a un tipo de máquina más pequeña

Si pasa de un tipo de máquina con más recursos a un tipo de máquina con menos recursos, como pasar de un tipo de máquina e2-standard-8 a una e2-standard-2 , podría encontrarse con problemas de recursos de hardware o limitaciones de rendimiento porque los tipos de máquinas más pequeñas son menos potentes que los tipos de máquinas más grandes. Asegúrese de que su nuevo tipo de máquina sea capaz de admitir cualquier aplicación o servicio que se esté ejecutando en su máquina virtual actual, o que actualice sus servicios y aplicaciones para que se ejecuten en los tipos de máquinas más pequeñas.

Revise las recomendaciones de ajuste de tamaño antes de cambiar el tipo de máquina. Para obtener información sobre las recomendaciones de tamaño de Compute Engine, consulte Aplicar recomendaciones de tipo de máquina para instancias de VM .

Mejores prácticas

A continuación se presentan algunas prácticas recomendadas que le ayudarán a cambiar con éxito el tipo de máquina VM.

  • Realice copias de seguridad periódicas de los datos de su disco persistente mediante instantáneas . Considere tomar una instantánea de los datos de su disco persistente antes de cambiar el tipo de máquina. Si desea asegurarse de que el nuevo tipo de máquina pueda admitir los datos de la máquina virtual existente, puede tomar una instantánea del disco persistente y usarla para iniciar una segunda máquina virtual con el nuevo tipo de máquina para confirmar que la máquina virtual se inicia correctamente.

  • Agregue discos adicionales al archivo /etc/fstab . Si tiene discos adicionales conectados a su VM, asegúrese de que estén agregados al archivo /etc/fstab para que se monten automáticamente cuando se reinicie la VM.

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

Para crear una reserva, complete los siguientes pasos:

  1. Cree una reserva (o identifique reservas existentes) con propiedades idénticas a las máquinas virtuales planificadas. El recuento de VM de la reserva debe ser igual o mayor que el número de VM que desea cambiar. Opcionalmente, para evitar que otras máquinas virtuales consuman esta reserva, utilice la specificReservationRequired .

  2. Verifique que las VM planificadas podrán consumir la reserva:

    1. Verifique que las máquinas virtuales tengan la afinidad de reserva correcta .
    2. Inmediatamente antes de cambiar las máquinas virtuales, asegúrese de que la reserva tenga suficiente capacidad .

Cambiar un tipo de máquina

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

Si está actualizando su tipo de máquina a la última generación, revise Evaluar las opciones de migración de VM antes de continuar.

Consola

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

    Ir a instancias de VM

  2. En la columna Nombre , haga clic en el nombre de la máquina virtual cuyo tipo de máquina desea cambiar.

  3. Desde la página de detalles de la instancia de VM , complete los siguientes pasos:

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

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

    5. Reinicie la máquina virtual.

nube de gcloud

  1. Detenga la máquina virtual mediante el comando gcloud compute instances stop :

    gcloud compute instances stop VM_NAME
    

    Reemplace VM_NAME con la VM que contiene el tipo de máquina a cambiar.

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

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

    Reemplace 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. Inicie la máquina virtual mediante el comando gcloud compute instances start :

    gcloud compute instances start VM_NAME
    

    Reemplace VM_NAME con el nombre de la VM que cambió.

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.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());
    }
  }
}

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

DESCANSAR

  1. Detenga la VM utilizando el método instances.stop :

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

    Reemplace 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 a cambiar

  2. Cambie el tipo de máquina utilizando 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, proporcione el machineType actualizado:

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

    Reemplace lo siguiente:

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

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

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

  3. Inicie la VM utilizando el método instances.start :

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

    Reemplace lo siguiente:

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

¿Qué sigue?