Mengedit jenis mesin instance komputasi


Jika instance virtual machine (VM) Anda tidak memiliki SSD Lokal yang terpasang dan bukan bagian dari grup instance terkelola (MIG), Anda dapat mengubah jenis mesin instance setelah menghentikannya.

Jika jenis mesin yang ada tidak cocok untuk workload yang Anda jalankan pada VM, ubah jenis mesin VM tersebut. Misalnya, Anda dapat memulai VM dengan jenis mesin yang lebih kecil selama penyiapan, pengembangan, dan pengujian, serta mengubah VM untuk menggunakan jenis mesin yang lebih besar saat Anda siap untuk workload produksi.

Anda dapat menggunakan prosedur ini dalam situasi berikut:

  • Untuk mengubah ke jenis mesin yang serupa, tetapi dengan jumlah vCPU atau memori yang berbeda dalam seri mesin yang sama, misalnya:
    • Anda dapat mengubah n2-highcpu-4 menjadi n2-standard-4.
    • Anda dapat mengubah c3d-standard-30 menjadi c3d-highmem-30.
  • Untuk mengubah jenis mesin agar menggunakan seri mesin yang berbeda. Hal ini hanya didukung untuk seri mesin generasi pertama dan kedua, tidak termasuk seri mesin T2A dan A2. Misalnya:
    • Anda dapat mengubah n2-standard-4 menjadi c2-standard-8.
    • Anda dapat mengubah n1-highmem-4 menjadi n2d-standard-16.

Jika ingin mengubah jenis mesin untuk VM yang menggunakan seri mesin generasi pertama atau kedua (N1, N2, M1, dll.) menjadi jenis mesin untuk seri mesin generasi ketiga atau yang lebih baru (M3, C3, N4, dll.), Anda harus menggunakan prosedur yang didokumentasikan di Memindahkan workload ke instance komputasi baru.

Anda dapat mengubah jenis mesin tanpa memengaruhi resource berikut:

  • Kunci SSH VM
  • Konfigurasi VM, seperti metadata VM
  • Data di Persistent Disk atau Hyperdisk yang terpasang, termasuk aplikasi terinstal dan data aplikasi

Untuk mengubah jenis mesin VM dalam MIG, lihat Menerapkan update konfigurasi VM secara otomatis di MIG.

Sebelum memulai

  • Pahami cara menghentikan VM.
  • Pahami jenis mesin.
  • Jika Anda belum melakukannya, siapkan autentikasi. Autentikasi adalah proses verifikasi identitas Anda untuk mengakses layanan dan API Google Cloud. Untuk menjalankan kode atau contoh dari lingkungan pengembangan lokal, Anda dapat mengautentikasi ke Compute Engine dengan memilih salah satu opsi berikut:

    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

    Untuk menggunakan contoh Java di halaman ini dalam lingkungan pengembangan lokal, instal dan lakukan inisialisasi gcloud CLI, lalu siapkan Kredensial Default Aplikasi dengan kredensial pengguna Anda.

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

      gcloud init
    3. Buat kredensial autentikasi lokal untuk Akun Google Anda:

      gcloud auth application-default login

    Untuk informasi selengkapnya, lihat Set up authentication for a local development environment.

    Python

    Untuk menggunakan contoh Python di halaman ini dalam lingkungan pengembangan lokal, instal dan lakukan inisialisasi gcloud CLI, lalu siapkan Kredensial Default Aplikasi dengan kredensial pengguna Anda.

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

      gcloud init
    3. Buat kredensial autentikasi lokal untuk Akun Google Anda:

      gcloud auth application-default login

    Untuk informasi selengkapnya, lihat Set up authentication for a local development environment.

    REST

    Untuk menggunakan contoh REST API di halaman ini dalam lingkungan pengembangan lokal, gunakan kredensial yang Anda berikan ke gcloud CLI.

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

      gcloud init

    Untuk informasi selengkapnya, lihat Melakukan autentikasi untuk menggunakan REST dalam dokumentasi autentikasi Google Cloud.

Peran yang diperlukan

Untuk mendapatkan izin yang diperlukan guna mengubah jenis mesin VM, minta administrator untuk memberi Anda peran IAM berikut pada project:

Untuk mengetahui informasi selengkapnya tentang cara memberikan peran, lihat Mengelola akses ke project, folder, dan organisasi.

Peran yang telah ditetapkan ini berisi izin yang diperlukan untuk mengubah jenis mesin VM. Untuk melihat izin yang benar-benar diperlukan, luaskan bagian Izin yang diperlukan:

Izin yang diperlukan

Izin berikut diperlukan untuk mengubah jenis mesin VM:

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

Anda mungkin juga bisa mendapatkan izin ini dengan peran khusus atau peran bawaan lainnya.

Batasan

  • Jika instance komputasi Anda memiliki satu atau beberapa SSD Lokal, Anda tidak dapat mengubah jenis mesin instance.
  • Jika instance komputasi Anda menggunakan alamat IP eksternal sementara, alamat IP mungkin berubah saat Anda mengubah jenis mesin instance. Untuk mempertahankan alamat IP, promosikan alamat IP tersebut menjadi alamat IP eksternal statis sebelum Anda mengubah jenis mesin.
  • Perubahan jenis mesin instance komputasi tidak tersedia untuk beberapa konfigurasi:
    • Anda tidak dapat mengubah jenis mesin untuk instance bare metal.
    • Jika ingin mengubah jenis mesin dari seri mesin generasi pertama atau kedua menjadi jenis mesin untuk seri mesin generasi ketiga atau yang lebih baru, Anda tidak dapat menggunakan prosedur ini. Sebagai gantinya, ikuti petunjuk di Memindahkan workload ke instance komputasi baru.
    • Jika ingin mengubah jenis mesin menjadi jenis mesin Arm, Anda tidak dapat menggunakan prosedur ini. Sebagai gantinya, ikuti petunjuk di Memindahkan workload ke instance komputasi baru.
    • Anda dapat menggunakan langkah-langkah dalam dokumen ini untuk mengubah jenis mesin untuk jenis mesin yang dioptimalkan akselerator G2. Untuk jenis mesin lain yang dioptimalkan akselerator, tinjau Mengubah VM yang dioptimalkan akselerator.

Implikasi penagihan

Setiap jenis mesin ditagih dengan tarif yang berbeda, jadi pastikan Anda memahami implikasi harga dari perubahan jenis mesin. Misalnya, jenis mesin e2-standard-2 harganya lebih mahal daripada jenis mesin e2-micro.

Mengubah jenis mesin juga dapat memengaruhi diskon penggunaan berkelanjutan untuk VM tersebut. Diskon untuk penggunaan berkelanjutan dihitung secara terpisah untuk berbagai kategori di wilayah yang sama. Jika Anda mengubah jenis mesin sehingga jenis mesin baru tersebut berada di kategori yang berbeda, waktu operasi VM berikutnya akan dihitung dalam diskon untuk penggunaan berkelanjutan dari kategori yang baru.

Misalnya, Anda memiliki VM dengan jenis mesin n2-standard-2 yang berjalan selama setengah bulan. Kemudian, Anda memutuskan untuk mengubah jenis mesin menjadi m1-ultramem-40. Setelah Anda melakukan perubahan tersebut, Compute Engine akan mulai menghitung waktu berjalan VM terhadap diskon untuk penggunaan berkelanjutan dari kategori memori dan vCPU yang dioptimalkan untuk memori.

Dalam tagihan, Anda akan melihat diskon untuk penggunaan berkelanjutan yang diterapkan ke jenis mesin n2-standard-2 sebelum Anda membuat perubahan jenis mesin, dan diskon untuk penggunaan berkelanjutan yang terpisah untuk m1-ultramem-40, jika VM Anda tetap berjalan di m1-ultramem-40 setidaknya selama 25% dari sisa bulan ini.

Memindahkan ke jenis mesin yang lebih kecil

Jika Anda beralih dari jenis mesin dengan lebih banyak resource ke jenis mesin dengan resource yang lebih sedikit, seperti berpindah dari jenis mesin e2-standard-8 ke e2-standard-2, Anda dapat mengalami masalah resource hardware atau keterbatasan performa karena jenis mesin yang lebih kecil kurang canggih dibandingkan jenis mesin yang lebih besar. Pastikan jenis mesin baru Anda dapat mendukung aplikasi atau layanan apa pun yang berjalan di VM saat ini, atau pastikan Anda mengupdate layanan dan aplikasi agar berjalan pada jenis mesin yang lebih kecil.

Tinjau rekomendasi penyesuaian ukuran sebelum mengubah jenis mesin. Untuk mengetahui informasi tentang rekomendasi ukuran Compute Engine, lihat Menerapkan rekomendasi jenis mesin untuk instance VM.

Praktik terbaik

Berikut adalah beberapa praktik terbaik untuk membantu Anda agar berhasil mengubah jenis mesin VM.

  • Buat cadangan data Persistent Disk secara rutin menggunakan snapshot. Sebaiknya ambil snapshot data Persistent Disk Anda sebelum mengubah jenis mesin. Jika ingin memastikan jenis mesin baru dapat mendukung data pada VM yang ada, Anda dapat mengambil snapshot Persistent Disk dan menggunakannya untuk memulai VM kedua dengan jenis mesin baru untuk mengonfirmasi bahwa VM berhasil dimulai.

  • Tambahkan disk tambahan ke file /etc/fstab. Jika Anda memiliki disk tambahan yang terpasang ke VM, pastikan disk tersebut ditambahkan ke file /etc/fstab sehingga disk tersebut otomatis dipasang saat VM dimulai ulang.

  • Buat reservasi sebelum mengubah jenis mesin. Untuk menghindari error terkait ketersediaan resource, buat reservasi Compute Engine untuk jenis mesin baru ketika baru tersedia untuk memesannya dalam suatu zona. Reservasi membantu memastikan bahwa resource tersedia saat Anda memerlukannya.

Untuk melakukan reservasi, selesaikan langkah-langkah berikut:

  1. Buat reservasi (atau identifikasi reservasi yang ada) dengan properti yang identik dengan VM terencana. Jumlah VM reservasi harus sama dengan atau lebih besar dari jumlah VM yang ingin Anda ubah. Secara opsional, untuk mencegah VM lain menggunakan reservasi ini, gunakan opsi specificReservationRequired.

  2. Pastikan VM yang direncanakan akan dapat menggunakan reservasi:

    1. Verifikasi bahwa VM memiliki afinitas reservasi yang benar.
    2. Segera sebelum mengubah VM, pastikan reservasi memiliki kapasitas yang cukup.

Mengubah jenis mesin

Anda hanya dapat mengubah jenis mesin VM yang dihentikan. VM dianggap berhenti hanya jika VM dalam status TERMINATED. Anda tidak dapat mengubah jenis mesin VM yang berjalan.

Jika Anda mengupgrade jenis mesin ke generasi terbaru, baca artikel Mengevaluasi opsi migrasi VM sebelum melanjutkan.

Konsol

  1. Di konsol Google Cloud, buka halaman Instance VM.

    Buka instance VM

  2. Di kolom Name, klik nama VM yang ingin Anda ubah jenis mesinnya.

  3. Dari halaman VM instance details, selesaikan langkah-langkah berikut:

    1. Jika VM berjalan, pada menu di bagian atas halaman, pilih Stop untuk menghentikan VM.
    2. Untuk mengedit VM, klik Edit.
    3. Di bagian Machine configuration, pilih jenis mesin yang ingin Anda gunakan, atau buat jenis mesin kustom.

    4. Untuk menyimpan perubahan, klik Save.

    5. Mulai ulang VM.

gcloud

  1. Hentikan VM dengan menggunakan perintah gcloud compute instances stop:

    gcloud compute instances stop VM_NAME
    

    Ganti VM_NAME dengan VM yang berisi jenis mesin yang akan diubah.

  2. Ubah jenis mesin menggunakan perintah gcloud compute instances set-machine-type:

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

    Ganti NEW_MACHINE_TYPE dengan jenis mesin baru untuk VM. Jenis mesin dapat berupa salah satu dari berikut:

  3. Mulai VM menggunakan perintah gcloud compute instances start:

    gcloud compute instances start VM_NAME
    

    Ganti VM_NAME dengan nama VM yang Anda ubah.

Java

Java

Sebelum mencoba contoh ini, ikuti petunjuk penyiapan Java di panduan memulai Compute Engine menggunakan library klien. Untuk informasi selengkapnya, lihat dokumentasi referensi API Java Compute Engine.

Untuk melakukan autentikasi ke Compute Engine, siapkan Kredensial Default Aplikasi. Untuk mengetahui informasi selengkapnya, baca Menyiapkan autentikasi untuk lingkungan pengembangan lokal.


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

Sebelum mencoba contoh ini, ikuti petunjuk penyiapan Python di panduan memulai Compute Engine menggunakan library klien. Untuk informasi selengkapnya, lihat dokumentasi referensi API Python Compute Engine.

Untuk melakukan autentikasi ke Compute Engine, siapkan Kredensial Default Aplikasi. Untuk mengetahui informasi selengkapnya, baca Menyiapkan autentikasi untuk lingkungan pengembangan lokal.

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. Hentikan VM dengan menggunakan metode instances.stop:

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

    Ganti kode berikut:

    • PROJECT_ID: ID project

    • ZONE: zona yang berisi VM

    • VM_NAME: VM yang berisi jenis mesin yang akan diubah

  2. Ubah jenis mesin menggunakan metode instances.setMachineType:

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

    Dalam isi permintaan, berikan machineType yang telah diperbarui:

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

    Ganti kode berikut:

    • MACHINE_TYPE_ZONE: zona yang berisi jenis mesin

    • NEW_MACHINE_TYPE: jenis mesin baru untuk VM

      Jenis mesin dapat berupa salah satu dari berikut:

  3. Mulai VM menggunakan metode instances.start:

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

    Ganti kode berikut:

    • PROJECT_ID: ID project
    • ZONE: zona yang berisi VM
    • VM_NAME: nama VM yang Anda ubah

Langkah selanjutnya