Modifica il tipo di macchina di un'istanza VM

Se la tua VM non ha un SSD locale e non fa parte di un gruppo di istanze gestite, puoi modificare il tipo di macchina della VM dopo averla stopping.

Se il tipo di macchina esistente non è adatto ai carichi di lavoro eseguiti sulla VM, cambia il tipo di macchina della VM. Puoi cambiare il tipo di macchina di una VM per regolare il numero di vCPU e memoria in base alle variazioni del carico di lavoro. Ad esempio, puoi avviare una VM con una macchina più piccola durante la configurazione, lo sviluppo e il test e cambiare la VM in modo da utilizzare un tipo di macchina più grande quando è tutto pronto per i carichi di lavoro di produzione.

Per le VM che non hanno un SSD locale e che non fanno parte di un gruppo di istanze gestite, puoi cambiare il tipo di macchina senza influire sulle seguenti risorse:

  • Le chiavi SSH della VM
  • Le configurazioni delle VM, ad esempio i metadati
  • I dati del disco permanente della VM, tra cui le applicazioni installate e i dati delle applicazioni

Se devi modificare il tipo di macchina delle VM in un gruppo di istanze gestite, consulta Applicare automaticamente gli aggiornamenti della configurazione delle VM in un gruppo di istanze gestite.

Prima di iniziare

  • Scopri come arrestare una VM.
  • Comprendi i tipi di macchine.
  • Se non l'hai ancora fatto, configura l'autenticazione. L'autenticazione è il processo mediante il quale viene verificata l'identità per l'accesso ai servizi e alle API Google Cloud. Per eseguire codice o esempi da un ambiente di sviluppo locale, puoi autenticarti in Compute Engine nel seguente modo.

    Seleziona la scheda relativa a come prevedi di utilizzare gli esempi in questa pagina:

    Console

    Quando utilizzi la console Google Cloud per accedere ai servizi e alle API di Google Cloud, non devi configurare l'autenticazione.

    Java

    Per utilizzare gli esempi Java in questa pagina da un ambiente di sviluppo locale, installa e inizializza gcloud CLI, quindi configura Credenziali predefinite dell'applicazione con le tue credenziali utente.

    1. Installa Google Cloud CLI.
    2. Per initialize gcloud CLI, esegui questo comando:

      gcloud init
    3. Crea credenziali di autenticazione locali per il tuo Account Google:

      gcloud auth application-default login

    Per ulteriori informazioni, consulta Configura l'autenticazione per un ambiente di sviluppo locale.

    Python

    Per utilizzare gli esempi Python in questa pagina da un ambiente di sviluppo locale, installa e inizializza gcloud CLI, quindi configura Credenziali predefinite dell'applicazione con le tue credenziali utente.

    1. Installa Google Cloud CLI.
    2. Per initialize gcloud CLI, esegui questo comando:

      gcloud init
    3. Crea credenziali di autenticazione locali per il tuo Account Google:

      gcloud auth application-default login

    Per ulteriori informazioni, consulta Configura l'autenticazione per un ambiente di sviluppo locale.

    REST

    Per utilizzare gli esempi di API REST in questa pagina in un ambiente di sviluppo locale, devi utilizzare le credenziali che fornisci a gcloud CLI.

      Installa Google Cloud CLI, quindi initialize eseguendo questo comando:

      gcloud init

Limitazioni

Implicazioni per la fatturazione

Ogni tipo di macchina viene fatturato a una tariffa diversa, quindi assicurati di comprendere le implicazioni in materia di pricing derivanti dalla modifica dei tipi di macchine. Ad esempio, un tipo di macchina e2-standard-2 costa più di un tipo di macchina e2-micro.

La modifica di un tipo di macchina potrebbe influire anche sugli sconti per utilizzo sostenuto per quella VM. Gli sconti per utilizzo sostenuto vengono calcolati separatamente per categorie diverse nella stessa regione. Se modifichi i tipi di macchina in modo che il nuovo tipo di macchina rientri in una categoria diversa, il tempo di esecuzione successivo della VM viene conteggiato ai fini dello sconto per utilizzo sostenuto della nuova categoria.

Ad esempio, supponiamo di avere una VM con un tipo di macchina n2-standard-2 in esecuzione per metà mese. Decidi quindi di modificare il tipo di macchina in m1-ultramem-40. Una volta apportata questa modifica, Compute Engine inizia a conteggiare il tempo di esecuzione della VM per determinare lo sconto per utilizzo sostenuto della categoria di vCPU e memoria ottimizzate per la memoria.

Nella fattura vedresti uno sconto per utilizzo sostenuto applicato al tipo di macchina n2-standard-2 prima della modifica del tipo di macchina e uno sconto per utilizzo sostenuto separato per m1-ultramem-40, se la tua VM rimane in esecuzione su m1-ultramem-40 per almeno il 25% del resto del mese.

best practice

Ecco alcune best practice per aiutarti a cambiare il tipo di macchina VM.

  • Esegui backup regolari dei dati del disco permanente utilizzando gli snapshot. Valuta la possibilità di acquisire uno snapshot dei dati del disco permanente prima di cambiare il tipo di macchina. Se vuoi assicurarti che il nuovo tipo di macchina sia in grado di supportare i dati sulla VM esistente, puoi acquisire uno snapshot del disco permanente e utilizzarlo per avviare una seconda VM con il nuovo tipo di macchina in modo da confermare che la VM si avvii correttamente.

  • Aggiungi altri dischi permanenti al file /etc/fstab. Se alla VM sono collegati altri dischi permanenti, assicurati che vengano aggiunti al file /etc/fstab in modo che vengano montati automaticamente al riavvio della VM.

  • Crea una prenotazione prima di modificare il tipo di macchina. Per evitare errori relativi alla disponibilità delle risorse, crea prenotazioni Compute Engine per i nuovi tipi di macchine quando sono disponibili per prenotarli all'interno di una zona. Le prenotazioni contribuiscono a garantire che le risorse siano disponibili quando ne hai bisogno.

Per creare una prenotazione, completa i seguenti passaggi:

  1. Crea una prenotazione (o identifica le prenotazioni esistenti) con proprietà identiche alle VM pianificate. Il numero di VM della prenotazione deve essere uguale o superiore al numero di VM che vuoi modificare. Facoltativamente, per impedire ad altre VM di utilizzare questa prenotazione, utilizza l'opzione specificReservationRequired.

  2. Verifica che le VM pianificate possano utilizzare la prenotazione:

    1. Verifica che le VM desiderate abbiano l'affinità di prenotazione corretta.
    2. Immediatamente prima di modificare le VM, assicurati che la prenotazione abbia una capacità sufficiente.

Cambiare un tipo di macchina

Puoi modificare solo il tipo di macchina di una VM arrestata. Una VM viene considerata arrestata solo quando si trova nello stato TERMINATED. Non puoi modificare il tipo di macchina di una VM in esecuzione.

Se stai eseguendo l'upgrade del tipo di macchina all'ultima generazione, consulta Spostare la VM in una nuova serie di macchine prima di procedere.

Autorizzazioni richieste per questa attività

Per eseguire questa attività, devi disporre delle seguenti autorizzazioni:

  • compute.instances.setMachineType sulla VM

Console

  1. Nella console Google Cloud, vai alla pagina Istanze VM.

    Vai a Istanze VM

  2. Nella colonna Nome, fai clic sul nome della VM per cui vuoi modificare il tipo di macchina.

  3. Nella pagina Dettagli istanza VM, completa i seguenti passaggi:

    1. Se la VM è in esecuzione, seleziona Arresta nel menu nella parte superiore della pagina per arrestare la VM.
    2. Per modificare la VM, fai clic su Modifica.
    3. Nella sezione Configurazione macchina, seleziona il tipo di macchina che vuoi utilizzare oppure crea un tipo di macchina personalizzata.

    4. Per salvare le modifiche, fai clic su Salva.

    5. Riavvia la VM.

gcloud

  1. Arresta la VM utilizzando il comando gcloud compute instances stop:

    gcloud compute instances stop VM_NAME
    

    Sostituisci VM_NAME con la VM contenente il tipo di macchina da modificare.

  2. Cambia il tipo di macchina utilizzando il comando gcloud compute instances set-machine-type:

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

    Sostituisci NEW_MACHINE_TYPE con il nuovo tipo di macchina per la VM. Il tipo di macchina può essere uno dei seguenti:

  3. Avvia la VM utilizzando il comando gcloud compute instances start:

    gcloud compute instances start VM_NAME
    

    Sostituisci VM_NAME con il nome della VM che hai modificato.

Java

Java

Prima di provare questo esempio, segui le istruzioni di configurazione di Java disponibili nella guida rapida di Compute Engine sull'utilizzo delle librerie client. Per ulteriori informazioni, consulta la documentazione di riferimento dell'API Java di Compute Engine.

Per eseguire l'autenticazione in Compute Engine, configura Credenziali predefinite dell'applicazione. Per maggiori informazioni, consulta Configurare l'autenticazione per un ambiente di sviluppo locale.


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

Prima di provare questo esempio, segui le istruzioni di configurazione di Python disponibili nella guida rapida di Compute Engine sull'utilizzo delle librerie client. Per ulteriori informazioni, consulta la documentazione di riferimento dell'API Python di Compute Engine.

Per eseguire l'autenticazione in Compute Engine, configura Credenziali predefinite dell'applicazione. Per maggiori informazioni, consulta Configurare l'autenticazione per un ambiente di sviluppo locale.

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. Arresta la VM utilizzando il metodo instances.stop:

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

    Sostituisci quanto segue:

    • PROJECT_ID: l'ID progetto

    • ZONE: la zona contenente la VM

    • VM_NAME: la VM contenente il tipo di macchina da modificare

  2. Cambia il tipo di macchina utilizzando il metodo instances.setMachineType:

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

    Nel corpo della richiesta, fornisci il machineType aggiornato:

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

    Sostituisci quanto segue:

    • MACHINE_TYPE_ZONE: la zona contenente il tipo di macchina

    • NEW_MACHINE_TYPE: il nuovo tipo di macchina per la VM

      Il tipo di macchina può essere uno dei seguenti:

  3. Avvia la VM utilizzando il metodo instances.start:

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

    Sostituisci quanto segue:

    • PROJECT_ID: l'ID progetto
    • ZONE: la zona contenente la VM
    • VM_NAME: il nome della VM che hai modificato

Passa a un tipo di macchina più piccolo

Se passi da un tipo di macchina con più risorse a un tipo di macchina con meno risorse, ad esempio passando da un tipo di macchina e2-standard-8 a una e2-standard-2, potresti riscontrare problemi di risorse hardware o limitazioni delle prestazioni perché i tipi di macchina più piccoli sono meno potenti di quelli più grandi. Assicurati che il nuovo tipo di macchina sia in grado di supportare qualsiasi applicazione o servizio attualmente in esecuzione sulla VM oppure aggiorna i servizi e le applicazioni in modo che vengano eseguiti sui tipi di macchina più piccoli.

Esamina i consigli relativi al dimensionamento ottimale prima di cambiare il tipo di macchina. Per informazioni sui suggerimenti per il dimensionamento di Compute Engine, vedi Applicazione dei suggerimenti tipo di macchina per le istanze VM.

Sposta la tua VM in una nuova serie di macchine

Una volta soddisfatti i requisiti, puoi modificare la VM in modo da utilizzare un tipo di macchina in una serie di macchine di nuova generazione cambiando il tipo di macchina, ad esempio da m1-ultramem-160 a m3-ultramem-128.

I tipi di macchine di nuova generazione e i tipi di macchine ARM potrebbero non supportare le stesse funzionalità e interfacce del tipo di macchina attuale. Prima di iniziare il processo di migrazione, rivedi i requisiti e le considerazioni in Prepararsi per il passaggio a una nuova VM.

Per cambiare il tipo di macchina per l'istanza VM con uno di nuova generazione, puoi utilizzare uno dei seguenti approcci.

Crea una nuova istanza VM e sposta il carico di lavoro

In questa procedura, creerai una nuova istanza VM, quindi sposti il carico di lavoro alla nuova VM.

Per maggiori dettagli su come completare questa procedura, vedi Spostare il carico di lavoro da una VM esistente a una nuova VM.

Modifica il tipo di macchina impostandolo su un nuovo tipo

In questa procedura, verificherai che l'istanza VM attuale possa essere aggiornata in modo da utilizzare il nuovo tipo di macchina, quindi modificherai il tipo di macchina.

  1. Verifica che l'istanza VM attuale utilizzi una versione del sistema operativo supportata dal nuovo tipo di macchina. Se la versione non è supportata, segui le istruzioni in Spostare il carico di lavoro da una VM esistente a una nuova VM.

  2. Se vuoi cambiare il tipo di macchina per la tua VM in un tipo di macchina ARM, segui le istruzioni riportate in Spostare il carico di lavoro da una VM esistente a una nuova VM.

  3. Se alla VM attuale è collegata un'unità SSD locale, segui le istruzioni in Spostare il carico di lavoro da una VM esistente a una nuova VM.

  4. Verifica che le tue applicazioni e i tuoi programmi possano supportare una rete o un'interfaccia di archiviazione diversa, ad esempio gVNIC o NVMe.

  5. Consulta le best practice per la modifica del tipo di macchina di una VM.

  6. Segui la procedura descritta in Cambiare un tipo di macchina.

Passaggi successivi