Editar el tipo de máquina de una instancia de proceso


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

Si el tipo de máquina que tienes no se adapta bien a las cargas de trabajo que ejecutas en tu VM, cambia el tipo de máquina de esa VM. Por ejemplo, puedes iniciar una VM con un tipo de máquina más pequeño durante la configuración, el desarrollo y las pruebas, y cambiar la VM para que use un tipo de máquina más grande cuando estés listo para las cargas de trabajo de producción.

Puedes usar este procedimiento en las siguientes situaciones:

  • Para cambiar a un tipo de máquina similar, pero con un número diferente de vCPUs o de memoria dentro de la misma serie de máquinas, por ejemplo:
    • Puedes cambiar n2-highcpu-4 a n2-standard-4.
    • Puedes cambiar c3d-standard-30 a c3d-highmem-30.
  • Para cambiar el tipo de máquina y usar otra serie de máquinas. Esta función solo está disponible para las máquinas de primera y segunda generación, excepto para las series T2A y A2. Por ejemplo:
    • Puedes cambiar n2-standard-4 a c2-standard-8.
    • Puedes cambiar n1-highmem-4 a n2d-standard-16.

Si quieres cambiar el tipo de máquina de una VM que usa una serie de máquinas de primera o segunda generación (N1, N2, M1, etc.) a un tipo de máquina de una serie de máquinas de tercera generación o posterior (M3, C3, N4, etc.), debes seguir el procedimiento que se describe en el artículo Mover una carga de trabajo a una nueva instancia de proceso.

Puedes cambiar el tipo de máquina sin que afecte a los siguientes recursos:

  • Las claves SSH de la VM
  • Las configuraciones de la VM, como los metadatos de la VM
  • Los datos de los discos persistentes o hiperdiscos conectados, incluidas las aplicaciones instaladas y los datos de las aplicaciones

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

Antes de empezar

  • Consulta cómo detener una VM.
  • Consulta los tipos de máquinas.
  • Si aún no lo has hecho, configura la autenticación. La autenticación verifica tu identidad para acceder a Google Cloud servicios y APIs. Para ejecutar código o ejemplos 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 Java muestras de esta página en un entorno de desarrollo local, instala e inicializa la CLI de gcloud y, a continuación, configura las credenciales predeterminadas de la aplicación con tus credenciales de usuario.

      Instala Google Cloud CLI.

      Si utilizas un proveedor de identidades (IdP) externo, primero debes iniciar sesión en la CLI de gcloud con tu identidad federada.

      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, and you are using an external identity provider (IdP), confirm that you have signed in to the gcloud CLI with your federated identity.

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

    Python

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

      Instala Google Cloud CLI.

      Si utilizas un proveedor de identidades (IdP) externo, primero debes iniciar sesión en la CLI de gcloud con tu identidad federada.

      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, and you are using an external identity provider (IdP), confirm that you have signed in to the gcloud CLI with your federated identity.

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

    REST

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

      Instala Google Cloud CLI.

      Si utilizas un proveedor de identidades (IdP) externo, primero debes iniciar sesión en la CLI de gcloud con tu identidad federada.

    Para obtener más información, consulta el artículo Autenticarse para usar REST de la documentación sobre autenticación de Google Cloud .

Roles obligatorios

Para obtener los permisos que necesitas para cambiar el tipo de máquina de una VM, pide a tu administrador que te conceda los siguientes roles de gestión de identidades y accesos en el proyecto:

Para obtener más información sobre cómo conceder roles, consulta el artículo Gestionar 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 necesitan, despliega la sección Permisos necesarios:

Permisos obligatorios

Para cambiar el tipo de máquina de una VM, se necesitan los siguientes permisos:

  • compute.instances.setMachineType en VM
  • compute.instances.start en VM
  • compute.instances.stop en VM

También puedes obtener estos permisos con roles personalizados u otros roles predefinidos.

Limitaciones

Implicaciones en la facturación

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

Cambiar el tipo de máquina también puede afectar a los descuentos por uso continuado de esa VM. Los descuentos por uso continuado se calculan por separado para las diferentes categorías de la misma región. Si cambias el tipo de máquina de forma que el nuevo tipo de máquina pertenezca a otra categoría, el tiempo de ejecución posterior de la VM se tendrá en cuenta para el descuento por uso continuado de la nueva categoría.

Por ejemplo, supongamos que tienes una VM con el tipo de máquina n2-standard-2 que se ejecuta durante medio mes. Después, decides cambiar el tipo de máquina a m1-ultramem-40. Una vez que hagas ese cambio, Compute Engine empezará a contar el tiempo de ejecución de la VM para el descuento por uso continuado de la categoría de vCPUs y memoria optimizadas para memoria.

En tu factura, verás un descuento por uso continuado aplicado al tipo de máquina n2-standard-2 que tenías antes de cambiarlo y otro descuento por uso continuado para m1-ultramem-40, si tu VM sigue ejecutándose en m1-ultramem-40 durante al menos el 25% del resto del mes.

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

Si pasas de un tipo de máquina con más recursos a otro con menos, por ejemplo, de un tipo de máquina e2-standard-8 a un tipo de máquina e2-standard-2, podrías tener problemas con los recursos de hardware o limitaciones de rendimiento, ya que los tipos de máquinas más pequeños son menos potentes que los más grandes. Asegúrate de que el nuevo tipo de máquina pueda admitir las aplicaciones o los servicios que se ejecutan en tu máquina virtual actual, o bien actualiza tus servicios y aplicaciones para que se ejecuten en los tipos de máquina más pequeños.

Consulta 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, consulta el artículo Aplicar recomendaciones de tipo de máquina a instancias de VM.

Prácticas recomendadas

A continuación, se indican algunas prácticas recomendadas para cambiar el tipo de máquina virtual correctamente.

  • Crea copias de seguridad periódicas de los datos de tu disco persistente mediante capturas. Te recomendamos que hagas una instantánea de tus datos de Persistent Disk antes de cambiar el tipo de máquina. Si quieres asegurarte de que el nuevo tipo de máquina pueda admitir los datos de la VM actual, puedes hacer una captura del disco persistente y usarla para iniciar una segunda VM con el nuevo tipo de máquina y confirmar que la VM se inicia correctamente.

  • Añade discos adicionales al archivo /etc/fstab. Si tienes discos adicionales conectados a tu VM, asegúrate de que se añadan al archivo /etc/fstab para que se monten automáticamente 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 y así poder reservarlos en una zona. Las reservas te ayudan a asegurarte de que los recursos estén disponibles cuando los necesites.

Para crear una reserva, sigue estos pasos:

  1. Crea una reserva (o identifica las reservas que ya tengas) con las mismas propiedades que las VMs que tienes previsto crear. El número de VMs de la reserva debe ser igual o superior al número de VMs que quieras cambiar. Si quieres evitar que otras VMs consuman esta reserva, usa la opción specificReservationRequired.

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

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

Cambiar un tipo de máquina

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

Si vas a actualizar el tipo de máquina a la última generación, consulta el artículo Evaluar las opciones de migración de máquinas virtuales antes de continuar.

Consola

  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 cuyo tipo de máquina quieras cambiar.

  3. En la página Detalles de la instancia de VM, sigue estos pasos:

    1. Si la VM está en ejecución, haz clic en Detener para detenerla. Si no aparece la opción Detener, haz clic en Más acciones > Detener.
    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 quieras usar o crea un tipo de máquina personalizado.

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

    5. Reinicia la VM.

gcloud

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

    gcloud compute instances stop VM_NAME
    

    Sustituye VM_NAME por la VM que contenga el tipo de máquina que quieras cambiar.

  2. Para cambiar el tipo de máquina, usa el comando gcloud compute instances set-machine-type:

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

    Sustituye NEW_MACHINE_TYPE por el nuevo tipo de máquina de 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
    

    Sustituye VM_NAME por el nombre de la VM que has cambiado.

Java

Java

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

Para autenticarte en Compute Engine, configura las credenciales predeterminadas de la aplicación. Para obtener más información, consulta el artículo Configurar la autenticación en 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 este ejemplo, sigue las Python instrucciones de configuración de la guía de inicio rápido de Compute Engine con bibliotecas de cliente. Para obtener más información, consulta la documentación de referencia de la API Python de Compute Engine.

Para autenticarte en Compute Engine, configura las credenciales predeterminadas de la aplicación. Para obtener más información, consulta el artículo Configurar la autenticación en 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. Para detener la VM, usa el método instances.stop:

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

    Haz los cambios siguientes:

    • 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 va a cambiar

  2. Cambia el tipo de máquina con 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"
    }
    

    Haz los cambios siguientes:

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

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

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

  3. Inicia la VM con el método instances.start:

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

    Haz los cambios siguientes:

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

Siguientes pasos