Maschinentyp einer VM-Instanz bearbeiten


Wenn die VM keine lokale SSD hat und nicht Teil einer verwalteten Instanzgruppe (Managed Instance Group, MIG) ist, können Sie den Maschinentyp der VM nach dem Beenden ändern.

Wenn der vorhandene Maschinentyp nicht für die Arbeitslasten geeignet ist, die Sie auf Ihrer VM ausführen, ändern Sie den Maschinentyp dieser VM. Sie können den Maschinentyp einer VM ändern, um die Anzahl der vCPUs und den Arbeitsspeicher anzupassen, wenn sich die Arbeitslast ändert. Sie können beispielsweise eine VM mit einer kleineren Maschine während der Einrichtung, Entwicklung und Tests starten und die VM so ändern, dass ein größerer Maschinentyp verwendet wird, wenn sie für Produktionsarbeitslasten bereit ist.

Bei VMs ohne lokale SSD, die nicht Teil einer MIG sind, können Sie den Maschinentyp ändern, ohne die folgenden Ressourcen zu beeinträchtigen:

  • SSH-Schlüssel der VM
  • VM-Konfigurationen, z. B. VM-Metadaten
  • Daten des nichtflüchtigen Speichers der VM, einschließlich installierter Anwendungen und Anwendungsdaten

Wenn Sie den Maschinentyp von VMs innerhalb einer MIG ändern müssen, finden Sie weitere Informationen unter VM-Konfigurationsupdates in einer MIG automatisch anwenden.

Hinweise

  • Informieren Sie sich darüber, wie VM beendet wird.
  • Informieren Sie sich über Maschinentypen.
  • Richten Sie die Authentifizierung ein, falls Sie dies noch nicht getan haben. Bei der Authentifizierung wird Ihre Identität für den Zugriff auf Google Cloud-Dienste und APIs überprüft. Zur Ausführung von Code oder Beispielen aus einer lokalen Entwicklungsumgebung können Sie sich wie folgt bei Compute Engine authentifizieren.

    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

    Wenn Sie die Java Beispiele auf dieser Seite in einer lokalen Entwicklungsumgebung verwenden möchten, installieren und initialisieren Sie die gcloud CLI und richten dann die Standardanmeldedaten für Anwendungen mit Ihren Nutzeranmeldedaten ein.

    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.

    Weitere Informationen unter Set up authentication for a local development environment.

    Python

    Wenn Sie die Python Beispiele auf dieser Seite in einer lokalen Entwicklungsumgebung verwenden möchten, installieren und initialisieren Sie die gcloud CLI und richten dann die Standardanmeldedaten für Anwendungen mit Ihren Nutzeranmeldedaten ein.

    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.

    Weitere Informationen unter Set up authentication for a local development environment.

    REST

    Verwenden Sie die von der gcloud CLI bereitgestellten Anmeldedaten, um die REST API-Beispiele auf dieser Seite in einer lokalen Entwicklungsumgebung zu verwenden.

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

      gcloud init

    Weitere Informationen finden Sie unter Für die Verwendung von REST authentifizieren in der Dokumentation zur Google Cloud-Authentifizierung.

Beschränkungen

Auswirkungen auf die Abrechnung

Maschinentypen werden mit unterschiedlichen Tarifen abgerechnet. Informieren Sie sich daher über die preislichen Auswirkungen der Änderung des Maschinentyps. Beispiel: Der Maschinentyp e2-standard-2 kostet mehr als der Maschinentyp e2-micro.

Eine Änderung des Maschinentyps kann sich auch auf den Rabatt für kontinuierliche Nutzung für diese VM auswirken. Rabatte für kontinuierliche Nutzung werden für die unterschiedlichen Kategorien in derselben Region separat berechnet. Wenn Sie Maschinentypen ändern, sodass der neue Maschinentyp einer anderen Kategorie zugeordnet ist, wird die nachfolgende Ausführungszeit der VM-Instanz auf den Rabatt für kontinuierliche Nutzung der neuen Kategorie angerechnet.

Nehmen wir beispielsweise an, Sie haben eine VM mit dem Maschinentyp n2-standard-2 einen halben Monat lang ausgeführt. Anschließend ändern Sie den Maschinentyp in m1-ultramem-40. Nach der Änderung berechnet Compute Engine die Ausführungszeit der VM ab diesem Moment zum Rabatt für die kontinuierliche Nutzung der speicheroptimierten vCPU und Speicherkategorie hinzu.

Auf der Abrechnung sehen Sie einen Rabatt für die kontinuierliche Nutzung des Maschinentyps n2-standard-2 vor dem Wechsel und einen separaten Rabatt für den Typ m1-ultramem-40, wenn die VM mindestens 25 % des restlichen Monats auf m1-ultramem-40 ausgeführt wird.

Best Practices

Im Folgenden finden Sie einige Best Practices, mit denen Sie den VM-Maschinentyp erfolgreich ändern können.

  • Nehmen Sie regelmäßige Sicherungen der Daten in nichtflüchtigen Speichern mithilfe von Snapshots vor. Erstellen Sie einen Snapshot der Daten des nichtflüchtigen Speichers, bevor Sie den Maschinentyp ändern. Wenn Sie sicher sein möchten, dass der neue Maschinentyp die Daten der vorhandenen VM unterstützt, können Sie einen Snapshot des nichtflüchtigen Speichers erstellen und damit eine zweite VM mit dem neuen Maschinentyp starten. Sie können dann sehen, ob die VM erfolgreich gestartet wurde.

  • Fügen Sie der Datei /etc/fstab weitere nichtflüchtige Speicher hinzu. Wenn an Ihre VM weitere nichtflüchtige Speicher angehängt sind, müssen Sie der Datei /etc/fstab hinzufügen, damit sie beim Neustart der VM automatisch bereitgestellt werden.

  • Erstellen Sie eine Reservierung, bevor Sie den Maschinentyp ändern. Um Fehler im Zusammenhang mit der Ressourcenverfügbarkeit zu vermeiden, erstellen Sie Compute Engine-Reservierungen für die neuen Maschinentypen, sobald sie verfügbar sind, um sie in einer Zone zu reservieren. Mit Reservierungen sorgen Sie dafür, dass die Ressourcen verfügbar sind, wenn Sie sie benötigen.

Führen Sie die folgenden Schritte aus, um eine Reservierung zu erstellen:

  1. Erstellen Sie eine Reservierung (oder identifizieren Sie vorhandene Reservierungen) mit identischen Attributen wie die geplanten VMs. Die VM-Anzahl der Reservierung muss gleich oder größer als die Anzahl der VMs sein, die Sie ändern möchten. Optional können Sie verhindern, dass andere VMs diese Reservierung nutzen. Verwenden Sie dazu die Option specificReservationRequired.

  2. Prüfen Sie, ob die geplanten VMs die Reservierung nutzen können:

    1. Prüfen Sie, ob die gewünschten VMs die richtige Reservierungsaffinität haben.
    2. Sorgen Sie unmittelbar vor dem Ändern der VMs dafür, dass die Reservierung über genügend Kapazität verfügt.

Maschinentyp ändern

Eine Änderung des Maschinentyps ist nur bei beendeten VMs möglich. Eine VM gilt nur dann als beendet, wenn sie den Status TERMINATED hat. Der Maschinentyp einer laufenden VM kann nicht geändert werden.

Wenn Sie einen Maschinentyp auf die neueste Generation aktualisieren, lesen Sie die Informationen unter VM auf eine Maschinenserie der dritten Generation verschieben, bevor Sie fortfahren.

Erforderliche Berechtigungen für diese Aufgabe

Zum Ausführen dieser Aufgabe benötigen Sie die folgende Berechtigung:

  • compute.instances.setMachineType auf der VM

Console

  1. Rufen Sie in der Google Cloud Console die Seite VM-Instanzen auf.

    Zu „VM-Instanzen“

  2. Klicken Sie in der Spalte Name auf den Namen der VM, deren Maschinentyp Sie ändern möchten.

  3. Führen Sie auf der Seite VM-Instanzdetails folgende Schritte aus:

    1. Wenn die VM ausgeführt wird, wählen Sie im Menü oben auf der Seite Beenden aus, um die VM zu beenden.
    2. Klicken Sie zum Bearbeiten der VM auf  Bearbeiten.
    3. Wählen Sie im Abschnitt Maschinenkonfiguration den Maschinentyp aus, den Sie verwenden möchten, oder erstellen Sie einen benutzerdefinierten Maschinentyp.

    4. Um die Änderungen zu speichern, klicken Sie auf Speichern.

    5. Starten Sie die VM neu.

gcloud

  1. Beenden Sie die VM mit dem Befehl gcloud compute instances stop.

    gcloud compute instances stop VM_NAME
    

    Ersetzen Sie VM_NAME durch die VM, die den zu ändernden Maschinentyp enthält.

  2. Ändern Sie den Maschinentyp mit dem Befehl gcloud compute instances set-machine-type:

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

    Ersetzen Sie NEW_MACHINE_TYPE durch den neuen Maschinentyp für die VM. Es gibt folgende Maschinentypen:

  3. Starten Sie die VM mit dem Befehl gcloud compute instances start.

    gcloud compute instances start VM_NAME
    

    Ersetzen Sie VM_NAME durch den Namen der geänderten VM.

Java

Java

Bevor Sie dieses Beispiel anwenden, folgen Sie den Schritten zur Einrichtung von Java in der Compute Engine-Kurzanleitung zur Verwendung von Clientbibliotheken. Weitere Informationen finden Sie in der Referenzdokumentation zur Compute Engine Java API.

Richten Sie die Standardanmeldedaten für Anwendungen ein, um sich bei Compute Engine zu authentifizieren. Weitere Informationen finden Sie unter Authentifizierung für eine lokale Entwicklungsumgebung einrichten.


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

Bevor Sie dieses Beispiel anwenden, folgen Sie den Schritten zur Einrichtung von Python in der Compute Engine-Kurzanleitung zur Verwendung von Clientbibliotheken. Weitere Informationen finden Sie in der Referenzdokumentation zur Compute Engine Python API.

Richten Sie die Standardanmeldedaten für Anwendungen ein, um sich bei Compute Engine zu authentifizieren. Weitere Informationen finden Sie unter Authentifizierung für eine lokale Entwicklungsumgebung einrichten.

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. Beenden Sie die VM mithilfe der Methode instances.stop:

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

    Dabei gilt:

    • PROJECT_ID: die Projekt-ID

    • ZONE ist die Zone mit der VM.

    • VM_NAME ist die VM mit dem zu ändernden Maschinentyp.

  2. Ändern Sie den Maschinentyp mit der Methode instances.setMachineType:

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

    Geben Sie im Anfragetext den aktualisierten machineType an:

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

    Dabei gilt:

    • MACHINE_TYPE_ZONE ist die Zone mit dem Maschinentyp.

    • NEW_MACHINE_TYPE ist der neue Maschinentyp für die VM.

      Es gibt folgende Maschinentypen:

  3. Starten Sie die VM mithilfe der Methode instances.start:

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

    Dabei gilt:

    • PROJECT_ID: die Projekt-ID
    • ZONE ist die Zone mit der VM.
    • VM_NAME: Name der geänderten VM

Zu einem kleineren Maschinentyp wechseln

Wenn Sie von einem Maschinentyp mit mehr Ressourcen wie e2-standard-8 zu einem Maschinentyp mit weniger Ressourcen wie e2-standard-2 wechseln, kann es zu Problemen mit den Hardwareressourcen oder zu Leistungseinschränkungen kommen, da kleinere Maschinentypen weniger leistungsstark sind als große. Achten Sie daher darauf, dass der neue Maschinentyp die derzeit auf der VM ausgeführten Anwendungen oder Dienste unterstützen kann oder aktualisieren Sie die Dienste und Anwendungen so, dass sie auf dem kleineren Maschinentyp laufen können.

Lesen Sie die Empfehlungen zur Größenanpassung, bevor Sie den Maschinentyp ändern. Informationen zu Größenempfehlungen für Compute Engine finden Sie unter Empfehlungen für Maschinentypen für VM-Instanzen anwenden.

VM auf eine Maschinenserie der dritten Generation verschieben

Wenn die Anforderungen erfüllt sind, können Sie Ihre VM so ändern, dass ein Maschinentyp in einer Maschinenserie einer neuen Generation verwendet wird. Dazu ändern Sie den Maschinentyp, z. B. von m1-ultramem-160 in m3-ultramem-128.

Maschinentypen der dritten Generation und ARM-T2A-Maschinentypen unterstützen möglicherweise nicht dieselben Features und Schnittstellen wie Ihr aktueller Maschinentyp. Lesen Sie vor Beginn des Migrationsprozesses die Anforderungen und Überlegungen unter Migration zu einer neuen VM vorbereiten.

Zum Ändern des Maschinentyps für Ihre VM-Instanz in einen Maschinentyp der dritten Generation können Sie einen der folgenden Ansätze verwenden.

Neue VM-Instanz erstellen und Arbeitslast verschieben

In diesem Verfahren erstellen Sie eine neue VM-Instanz und verschieben Ihre Arbeitslast dann auf die neue VM.

Weitere Informationen zum Ausführen dieses Vorgangs finden Sie unter Arbeitslast von einer vorhandenen VM zu einer neuen VM verschieben.

Den Maschinentyp in einen neuen Maschinentyp ändern

In diesem Verfahren prüfen Sie, ob Ihre aktuelle VM-Instanz auf den neuen Maschinentyp aktualisiert werden kann, und ändern dann den Maschinentyp.

  1. Prüfen Sie, ob Ihre aktuelle VM-Instanz eine Betriebssystemversion verwendet, die vom neuen Maschinentyp unterstützt wird. Wenn die Version nicht unterstützt wird, folgen Sie der Anleitung unter Arbeitslast von einer vorhandenen VM auf eine neue VM verschieben.

  2. Wenn Sie den Maschinentyp für Ihre VM in einen T2A-Maschinentyp ändern möchten, folgen Sie der Anleitung unter Arbeitslast von einer vorhandenen VM auf eine neue VM verschieben.

  3. Wenn Ihre aktuelle VM eine lokale SSD angehängt hat, folgen Sie der Anleitung unter Arbeitslast von einer vorhandenen VM auf eine neue VM verschieben.

  4. Prüfen Sie, ob Ihre Anwendungen und Programme eine andere Netzwerk- oder Speicherschnittstelle wie gVNIC oder NVMe unterstützen.

  5. Lesen Sie die Best Practices zum Ändern des Maschinentyps einer VM.

  6. Folgen Sie der Anleitung unter Maschinentyp ändern.

Nächste Schritte