Membuat dan menggunakan Spot VM

Halaman ini menjelaskan cara membuat dan mengelola Spot VM, termasuk hal berikut:

  • Cara membuat, memulai, dan mengidentifikasi Spot VM
  • Cara mendeteksi, menangani, dan menguji preemption Spot VM
  • Praktik terbaik untuk Spot VM

Spot VM adalah instance virtual machine (VM) yang menggunakan model penyediaan spot. Spot VM tersedia dengan diskon hingga 60% dari harga on-demand VM standar. Untuk mengetahui informasi selengkapnya, lihat halaman harga. Namun, Compute Engine dapat mengklaim kembali resource dengan melakukan preempt terhadap Spot VM kapan saja. Spot VM hanya direkomendasikan untuk workload fault-tolerant yang dapat menangani preemption VM.

Sebelum memulai

  • Baca tentang Spot VM, terutama batasannya.
  • Pastikan Anda memiliki kuota yang cukup untuk resource yang ingin Anda minta. Untuk mengetahui informasi selengkapnya, lihat Kuota alokasi.
  • Siapkan autentikasi jika Anda belum melakukannya. Autentikasi memverifikasi identitas Anda untuk mengakses layanan Google Cloud dan API. Untuk menjalankan kode atau sampel dari lingkungan pengembangan lokal, Anda dapat melakukan autentikasi ke Compute Engine dengan memilih salah satu opsi berikut:

    Pilih tab untuk melihat bagaimana Anda berencana menggunakan contoh di halaman ini:

    Konsol

    Saat menggunakan konsol Google Cloud untuk mengakses layanan Google Cloud dan API, Anda tidak perlu menyiapkan autentikasi.

    gcloud

    1. Instal Google Cloud CLI. Setelah penginstalan, inisialisasi Google Cloud CLI dengan menjalankan perintah berikut:

      gcloud init

      Jika Anda menggunakan penyedia identitas (IdP) eksternal, Anda harus login ke gcloud CLI dengan identitas gabungan Anda terlebih dahulu.

  • Tetapkan region dan zona default.
  • Terraform

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

    1. Instal Google Cloud CLI.

    2. Jika Anda menggunakan penyedia identitas (IdP) eksternal, Anda harus login ke gcloud CLI dengan identitas gabungan Anda terlebih dahulu.

    3. Jika Anda menggunakan shell lokal, buat kredensial autentikasi lokal untuk akun pengguna Anda:

      gcloud auth application-default login

      Anda tidak perlu melakukan langkah ini jika menggunakan Cloud Shell.

      Jika error autentikasi ditampilkan, dan Anda menggunakan penyedia identitas (IdP) eksternal, konfirmasi bahwa Anda telah login ke gcloud CLI dengan identitas gabungan Anda.

    Untuk mengetahui informasi selengkapnya, lihat Menyiapkan autentikasi untuk lingkungan pengembangan lokal.

    REST

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

      Instal Google Cloud CLI.

      Jika Anda menggunakan penyedia identitas (IdP) eksternal, Anda harus login ke gcloud CLI dengan identitas gabungan Anda terlebih dahulu.

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

Peran yang diperlukan

Untuk mendapatkan izin yang diperlukan untuk membuat Spot VM, minta administrator untuk memberi Anda peran IAM Compute Instance Admin (v1) (roles/compute.instanceAdmin.v1) di project. Untuk mengetahui informasi selengkapnya tentang cara memberikan peran, lihat Mengelola akses ke project, folder, dan organisasi.

Peran bawaan ini berisi izin yang diperlukan untuk membuat Spot VM. Untuk melihat izin yang benar-benar diperlukan, perluas bagian Izin yang diperlukan:

Izin yang diperlukan

Izin berikut diperlukan untuk membuat Spot VM:

  • compute.instances.create di project
  • Untuk menggunakan image kustom guna membuat VM: compute.images.useReadOnly pada image
  • Untuk menggunakan snapshot guna membuat VM: compute.snapshots.useReadOnly pada snapshot
  • Untuk menggunakan template instance guna membuat VM: compute.instanceTemplates.useReadOnly pada template instance
  • Untuk menentukan subnet bagi VM Anda: compute.subnetworks.use di project atau di subnet yang dipilih
  • Untuk menentukan alamat IP statis untuk VM: compute.addresses.use pada project
  • Untuk menetapkan alamat IP eksternal ke VM saat menggunakan jaringan VPC: compute.subnetworks.useExternalIp di project atau di subnet yang dipilih
  • Untuk menetapkan jaringan lama ke VM: compute.networks.use pada project
  • Untuk menetapkan alamat IP eksternal ke VM saat menggunakan jaringan lama: compute.networks.useExternalIp di project
  • Untuk menetapkan metadata instance VM bagi VM: compute.instances.setMetadata di project
  • Untuk menyetel tag untuk VM: compute.instances.setTags di VM
  • Untuk menetapkan label bagi VM: compute.instances.setLabels di VM
  • Untuk menetapkan akun layanan yang akan digunakan VM: compute.instances.setServiceAccount di VM
  • Untuk membuat disk baru untuk VM: compute.disks.create pada project
  • Untuk memasang disk yang ada dalam mode hanya baca atau baca-tulis: compute.disks.use pada disk
  • Untuk memasang disk yang ada dalam mode hanya baca: compute.disks.useReadOnly pada disk

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

Bersiap untuk membuat Spot VM

Sebelum membuat Spot VM untuk workload, selesaikan langkah-langkah berikut:

  1. Konfigurasi workload Anda untuk mengelola preempti. Secara khusus, sebaiknya Anda menyiapkan skrip untuk menangani preemption yang berjalan sebagai bagian dari beban kerja atau berupa file yang dapat Anda tambahkan dalam metadata VM untuk dijalankan selama penonaktifan. Untuk mengetahui petunjuknya, lihat Mengelola preemption Spot VM.

  2. Sebaiknya Anda melihat data untuk Spot VM guna membantu Anda memilih jenis mesin dan lokasi. Dengan memilih jenis mesin dan lokasi dengan ketersediaan resource yang lebih tinggi, Anda dapat membantu meningkatkan peluang untuk menghindari error ketersediaan resource dan memiliki waktu aktif yang lebih lama sebelum penghentian sementara.

  3. Pilih metode untuk membuat Spot VM. Sebaiknya Anda memilih metode sebagai berikut:

    Untuk mengetahui informasi selengkapnya tentang rekomendasi untuk membuat Spot VM, lihat praktik terbaik.

Membuat Spot VM

Setelah bersiap untuk membuat Spot VM, Anda dapat membuat Spot VM menggunakan salah satu metode berikut.

Konsol

  1. Di konsol Google Cloud , buka halaman Create an instance.

    Buka halaman Buat instance

  2. Di panel Machine configuration, yang terbuka secara default, selesaikan langkah-langkah berikut:

    1. Di bagian Model penyediaan, pilih Spot dari daftar Model penyediaan VM. Bagian Setelan lanjutan model penyediaan VM akan meluas.
    2. Dalam daftar Durasi pemberitahuan penghentian sementara, pilih opsi berdasarkan cara Anda ingin menangani penghentian sementara.

      • Jika Anda memilih 120 detik, pastikan Anda menangani preemption dalam beban kerja Anda sebelum membuat Spot VM. Misalnya, verifikasi bahwa workload Anda mencakup skrip untuk menyimpan progres Anda yang menunggu untuk dijalankan hingga preempti terdeteksi.

      • Jika Anda memilih 0 detik (default), pastikan Anda menangani preemption menggunakan skrip penonaktifan. Sebelum membuat Spot VM, buat file yang berisi skrip shutdown yang menyimpan progres Anda saat shutdown disebabkan oleh preemption. Lampirkan skrip penonaktifan ini seperti yang dijelaskan pada langkah berikutnya.

    3. Opsional: Untuk memilih tindakan penghentian yang terjadi saat Compute Engine melakukan preempt terhadap VM, dalam daftar Saat penghentian VM, pilih salah satu opsi berikut:

      • Untuk menghentikan VM selama preemption, pilih Hentikan (default).
      • Untuk menghapus VM selama preemption, pilih Hapus.
  3. Untuk menambahkan skrip penonaktifan, selesaikan langkah-langkah berikut. Jika Anda memilih 0 detik (default) untuk Durasi notifikasi pengambilalihan, maka langkah ini diperlukan untuk menangani pengambilalihan. Jika tidak, jika Anda memilih 120 detik, langkah ini bersifat opsional.

    1. Di menu navigasi, klik Advanced.
    2. Di bagian Metadata, klik Tambahkan item.
    3. Di kolom Key, masukkan shutdown-script untuk kunci metadata.
    4. Di kolom Value, tambahkan konten skrip shutdown yang menangani preempti. Untuk contoh skrip penonaktifan, lihat Contoh penanganan penghentian sementara dalam dokumen ini.
  4. Opsional: Tentukan opsi konfigurasi lainnya. Untuk mengetahui informasi selengkapnya, lihat Opsi konfigurasi selama pembuatan instance.

  5. Untuk membuat dan memulai VM, klik Create.

gcloud

Untuk membuat VM menggunakan gcloud CLI, gunakan perintah gcloud compute instances create. Setiap kali Anda membuat VM, sebaiknya tentukan jenis mesin, lokasi, dan image OS.

Untuk membuat Spot VM, sertakan flag --provisioning-model=SPOT. Untuk menentukan durasi pemberitahuan pengambilan paksa, sertakan flag --preemption-notice-duration dan, jika perlu, skrip penonaktifan. Secara opsional, Anda dapat menentukan tindakan penghentian untuk Spot VM dengan menyertakan juga flag --instance-termination-action.

gcloud compute instances create VM_NAME \
    --machine-type=MACHINE_TYPE \
    --zone=ZONE \
    --image-family=IMAGE_FAMILY \
    --image-project=IMAGE_PROJECT \
    --provisioning-model=SPOT \
    --instance-termination-action=TERMINATION_ACTION \
    --preemption-notice-duration=PREEMPTION_NOTICE_DURATION \
    --metadata shutdown-script=SHUTDOWN_SCRIPT

Ganti kode berikut:

  • VM_NAME: nama VM baru.

  • MACHINE_TYPE: jenis mesin bawaan atau kustom untuk VM baru.

  • ZONE: zona tempat VM dibuat. Zona tersebut juga harus mendukung jenis mesin yang akan digunakan untuk VM baru.

  • IMAGE_FAMILY: kelompok image. Tindakan ini menentukan OS image terbaru yang masih digunakan. Misalnya, jika Anda menentukan debian-13, versi terbaru dalam kelompok image Debian 13 akan digunakan. Untuk mengetahui informasi selengkapnya tentang cara menggunakan kelompok image, lihat Praktik terbaik kelompok image.

  • IMAGE_PROJECT: project yang berisi image. Misalnya, jika Anda menentukan debian-13 sebagai kelompok image, tentukan debian-cloud sebagai project image.

  • TERMINATION_ACTION: Opsional: tentukan tindakan penghentian yang akan dilakukan saat Compute Engine melakukan preempt terhadap VM, baik STOP (perilaku default) atau DELETE.

  • PREEMPTION_NOTICE_DURATION: apakah akan mengaktifkan durasi pemberitahuan pengambilalihan. Untuk gcloud CLI, nilainya harus berupa 120s atau 0s.

    • Jika Anda menentukan 120s, tangani preempti dalam workload Anda. (Secara opsional, Anda juga dapat menentukan skrip penonaktifan.)

    • Jika Anda menentukan 0s (default), tangani preemption dalam skrip penonaktifan.

  • SHUTDOWN_SCRIPT: skrip shutdown.

    • Jika Anda menyetel PREEMPTION_NOTICE_DURATION ke 0s (default), maka untuk menangani penghentian sementara, Anda harus menentukan skrip penonaktifan. Untuk mengetahui informasi selengkapnya tentang cara memformat dan menentukan skrip shutdown, lihat Menjalankan skrip shutdown.

    • Jika tidak, jika Anda tidak ingin menentukan skrip penonaktifan, Anda dapat menghapus tanda --metadata shutdown-script.

Terraform

Anda dapat menggunakan resource Terraform untuk membuat Spot VM menggunakan blok scheduling seperti yang ditunjukkan dalam contoh berikut.

Untuk menambahkan skrip shutdown guna menangani penghentian sementara, tambahkan juga blok metadata seperti yang ditunjukkan di Menjalankan skrip shutdown. Untuk contoh skrip shutdown, lihat Menangani penghentian sementara dalam dokumen ini.


resource "google_compute_instance" "spot_vm_instance" {
  name         = "spot-instance-name"
  machine_type = "f1-micro"
  zone         = "us-central1-c"

  boot_disk {
    initialize_params {
      image = "debian-cloud/debian-13"
    }
  }

  scheduling {
    preemptible                 = true
    automatic_restart           = false
    provisioning_model          = "SPOT"
    instance_termination_action = "STOP"
  }

  network_interface {
    # A default network is created for all GCP projects
    network = "default"
    access_config {
    }
  }
}

Untuk mempelajari cara menerapkan atau menghapus konfigurasi Terraform, lihat Perintah dasar Terraform.

REST

Untuk membuat VM menggunakan Compute Engine API, gunakan metode instances.insert. Setiap kali Anda membuat VM, sebaiknya tentukan jenis mesin, lokasi, dan image OS.

Untuk membuat Spot VM, Anda harus menyertakan kolom "provisioningModel": "SPOT". Untuk menentukan durasi pemberitahuan penghentian sementara, sertakan kolom preemptionNoticeDuration. Anda juga dapat menentukan tindakan penghentian untuk Spot VM dengan menyertakan kolom instanceTerminationAction.

POST https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/zones/ZONE/instances
{
 "machineType": "zones/ZONE/machineTypes/MACHINE_TYPE",
 "name": "VM_NAME",
 "disks": [
   {
     "initializeParams": {
       "sourceImage": "projects/IMAGE_PROJECT/global/images/IMAGE"
     },
     "boot": true
   }
 ],
 "scheduling":
 {
     "provisioningModel": "SPOT",
     "instanceTerminationAction": "TERMINATION_ACTION",
     "preemptionNoticeDuration": { "seconds": PREEMPTION_NOTICE_DURATION }
 },
"metadata": {
    "items": [
      {
        "key": "shutdown-script",
        "value": "SHUTDOWN_SCRIPT"
      }
    ]
  }
}

Ganti kode berikut:

  • PROJECT_ID: project ID dari project tempat VM dibuat.
  • ZONE: zona tempat VM dibuat. Zona tersebut juga harus mendukung jenis mesin yang akan digunakan untuk VM baru.
  • MACHINE_TYPE: jenis mesin bawaan atau kustom untuk VM baru.
  • VM_NAME: nama VM baru.
  • IMAGE_PROJECT: project yang berisi image. Misalnya, jika Anda menentukan family/debian-13 sebagai kelompok image, tentukan debian-cloud sebagai project image.
  • IMAGE: tentukan salah satu dari berikut ini:

    • Versi tertentu dari image publik. Misalnya, image tertentu adalah "sourceImage": "projects/debian-cloud/global/images/debian-13-trixie-v20260908" dengan debian-cloud berupa IMAGE_PROJECT.
    • Kelompok image. Ini akan membuat VM dari OS image terbaru yang masih digunakan. Misalnya, jika Anda menentukan "sourceImage": "projects/debian-cloud/global/images/family/debian-13" dengan debian-cloud berupa IMAGE_PROJECT, Compute Engine akan membuat VM dari versi terbaru OS image di kelompok image Debian 13.
  • TERMINATION_ACTION: Opsional: tentukan tindakan penghentian yang akan dilakukan saat Compute Engine melakukan preempt terhadap VM, baik STOP (perilaku default) atau DELETE.

  • PREEMPTION_NOTICE_DURATION: apakah akan mengaktifkan durasi pemberitahuan pengambilalihan. Untuk REST, nilainya harus berupa 120 atau 0.

    • Jika Anda menentukan 120, tangani preempti dalam workload Anda. (Secara opsional, Anda juga dapat menentukan skrip penonaktifan.)

    • Jika Anda menentukan 0 (default), tangani preemption dalam skrip penonaktifan.

  • SHUTDOWN_SCRIPT: skrip shutdown.

    • Jika Anda menyetel PREEMPTION_NOTICE_DURATION ke 0 (default), maka untuk menangani penghentian sementara, Anda harus menentukan skrip penonaktifan. Untuk mengetahui informasi selengkapnya tentang cara memformat dan menentukan skrip shutdown, lihat Menjalankan skrip shutdown. Untuk contoh skrip penonaktifan, lihat Contoh penanganan penghentian sementara dalam dokumen ini.

    • Jika tidak, jika Anda tidak ingin menentukan skrip penonaktifan, Anda dapat menghapus kolom dan sub-kolom metadata.

Untuk mengetahui informasi selengkapnya tentang opsi yang dapat Anda tentukan saat membuat VM, lihat Opsi konfigurasi selama pembuatan instance.

Memulai Spot VM

Seperti VM lainnya, Spot VM dimulai saat pembuatan. Demikian pula, jika Spot VM dihentikan, Anda dapat memulai ulang VM untuk melanjutkan status RUNNING. Anda dapat menghentikan dan memulai ulang Spot VM yang di-preempt sebanyak yang Anda inginkan, selama masih ada kapasitas. Untuk mengetahui informasi selengkapnya, baca Siklus proses instance VM.

Jika Compute Engine menghentikan satu atau beberapa Spot VM di cluster grup instance terkelola (MIG) atau Google Kubernetes Engine (GKE) penskalaan otomatis, grup akan memulai ulang VM saat resource tersedia kembali.

Mengidentifikasi model penyediaan dan tindakan penghentian VM

Identifikasi model penyediaan VM untuk melihat apakah VM tersebut adalah VM standar, Spot VM, atau preemptible VM. Untuk Spot VM, Anda juga dapat mengidentifikasi tindakan penghentian. Anda dapat mengidentifikasi model penyediaan dan tindakan penghentian VM menggunakan Google Cloud konsol, gcloud CLI, atau Compute Engine API.

Konsol

  1. Buka halaman VM instances.

    Buka halaman instance VM

  2. Klik Nama VM yang ingin Anda identifikasi. Halaman Detail instance VM akan terbuka.

  3. Buka bagian Pengelolaan di bagian bawah halaman. Di subbagian Kebijakan ketersediaan, periksa opsi berikut:

    • Jika model penyediaan VM disetel ke Spot, VM tersebut adalah Spot VM.
      • Saat penghentian VM menunjukkan tindakan yang harus dilakukan saat Compute Engine melakukan preempt terhadap VM, baik Menghentikan atau Menghapus VM.
    • Atau, jika model penyediaan VM disetel ke Standar atau —:
      • Jika opsi Kemungkinan untuk dihentikan disetel ke Aktif, VM tersebut adalah preemptible VM.
      • Jika tidak, VM tersebut adalah VM standar.

gcloud

Untuk mendeskripsikan VM dari gcloud CLI, gunakan perintah gcloud compute instances describe:

gcloud compute instances describe VM_NAME

dengan VM_NAME adalah nama VM yang ingin Anda periksa.

Pada output, periksa kolom scheduling untuk mengidentifikasi VM:

  • Jika outputnya menyertakan kolom provisioningModel yang ditetapkan ke SPOT, seperti yang berikut ini, VM tersebut adalah Spot VM.

    ...
    scheduling:
    ...
    provisioningModel: SPOT
    instanceTerminationAction: TERMINATION_ACTION
    ...
    

    dengan TERMINATION_ACTION menunjukkan tindakan yang harus dilakukan saat Compute Engine melakukan preempt terhadap VM, baik menghentikan (STOP) atau menghapus (DELETE) VM. Jika kolom instanceTerminationAction tidak ada, nilai defaultnya adalah STOP.

  • Jika tidak, jika output menyertakan kolom provisioningModel yang ditetapkan ke standard atau jika output menghilangkan kolom provisioningModel:

    • Jika outputnya menyertakan kolom preemptible yang ditetapkan ke true, VM tersebut adalah preemptible VM.
    • Jika tidak, VM tersebut adalah VM standar.

REST

Untuk mendeskripsikan VM dari Compute Engine API, gunakan metode instances.get:

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

Ganti kode berikut:

  • PROJECT_ID: project ID dari project tempat VM berada.
  • ZONE: zona tempat VM berada.
  • VM_NAME: nama VM yang ingin Anda periksa.

Pada output, periksa kolom scheduling untuk mengidentifikasi VM:

  • Jika outputnya menyertakan kolom provisioningModel yang ditetapkan ke SPOT, seperti yang berikut ini, VM tersebut adalah Spot VM.

    {
      ...
      "scheduling":
      {
         ...
         "provisioningModel": "SPOT",
         "instanceTerminationAction": "TERMINATION_ACTION"
         ...
      },
      ...
    }
    

    dengan TERMINATION_ACTION menunjukkan tindakan yang harus dilakukan saat Compute Engine melakukan preempt terhadap VM, baik menghentikan (STOP) atau menghapus (DELETE) VM. Jika kolom instanceTerminationAction tidak ada, nilai defaultnya adalah STOP.

  • Jika tidak, jika output menyertakan kolom provisioningModel yang ditetapkan ke standard atau jika output menghilangkan kolom provisioningModel:

    • Jika outputnya menyertakan kolom preemptible yang ditetapkan ke true, VM tersebut adalah preemptible VM.
    • Jika tidak, VM tersebut adalah VM standar.

Go


import (
	"context"
	"fmt"
	"io"

	compute "cloud.google.com/go/compute/apiv1"
	"cloud.google.com/go/compute/apiv1/computepb"
)

// isSpotVM checks if a given instance is a Spot VM or not.
func isSpotVM(w io.Writer, projectID, zone, instanceName string) (bool, error) {
	// projectID := "your_project_id"
	// zone := "europe-central2-b"
	// instanceName := "your_instance_name"
	ctx := context.Background()
	client, err := compute.NewInstancesRESTClient(ctx)
	if err != nil {
		return false, fmt.Errorf("NewInstancesRESTClient: %w", err)
	}
	defer client.Close()

	req := &computepb.GetInstanceRequest{
		Project:  projectID,
		Zone:     zone,
		Instance: instanceName,
	}

	instance, err := client.Get(ctx, req)
	if err != nil {
		return false, fmt.Errorf("GetInstance: %w", err)
	}

	isSpot := instance.GetScheduling().GetProvisioningModel() == computepb.Scheduling_SPOT.String()

	var isSpotMessage string
	if !isSpot {
		isSpotMessage = " not"
	}
	fmt.Fprintf(w, "Instance %s is%s spot\n", instanceName, isSpotMessage)

	return instance.GetScheduling().GetProvisioningModel() == computepb.Scheduling_SPOT.String(), nil
}

Java


import com.google.cloud.compute.v1.Instance;
import com.google.cloud.compute.v1.InstancesClient;
import com.google.cloud.compute.v1.Scheduling;
import java.io.IOException;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.TimeoutException;

public class CheckIsSpotVm {
  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 Google Cloud project you want to use.
    String projectId = "your-project-id";
    // Name of the virtual machine to check.
    String instanceName = "your-route-name";
    // Name of the zone you want to use. For example: "us-west3-b"
    String zone = "your-zone";

    boolean isSpotVm = isSpotVm(projectId, instanceName, zone);
    System.out.printf("Is %s spot VM instance - %s", instanceName, isSpotVm);
  }

  // Check if a given instance is Spot VM or not.
  public static boolean isSpotVm(String projectId, String instanceName, String zone)
          throws IOException {
    // Initialize client that will be used to send requests. This client only needs to be created
    // once, and can be reused for multiple requests.
    try (InstancesClient client = InstancesClient.create()) {
      Instance instance = client.get(projectId, zone, instanceName);

      return instance.getScheduling().getProvisioningModel()
              .equals(Scheduling.ProvisioningModel.SPOT.name());
    }
  }
}

Python

from google.cloud import compute_v1


def is_spot_vm(project_id: str, zone: str, instance_name: str) -> bool:
    """
    Check if a given instance is Spot VM or not.
    Args:
        project_id: project ID or project number of the Cloud project you want to use.
        zone: name of the zone you want to use. For example: "us-west3-b"
        instance_name: name of the virtual machine to check.
    Returns:
        The Spot VM status of the instance.
    """
    instance_client = compute_v1.InstancesClient()
    instance = instance_client.get(
        project=project_id, zone=zone, instance=instance_name
    )
    return (
        instance.scheduling.provisioning_model
        == compute_v1.Scheduling.ProvisioningModel.SPOT.name
    )

Mengelola preemption Spot VM

Untuk mempelajari cara mengelola preemption Spot VM, tinjau bagian berikut:

Menangani preemption

Saat Compute Engine mulai mem-preempt Spot VM, Anda dapat mencoba melakukan tindakan pembersihan sebelum VM selesai dimatikan. Penanganan penghentian sementara dapat mencakup penghentian proses yang sedang berjalan dengan lancar dan mentransfer status workload Anda.

Anda dapat menggunakan metode berikut untuk menangani preemption untuk Spot VM. Untuk mengetahui informasi selengkapnya tentang cara memilih tempat untuk menangani penghentian sementara workload Anda, lihat definisi durasi pemberitahuan penghentian sementara.

  • Tangani penghentian sementara dalam workload Anda. Kami merekomendasikan metode ini untuk VM Spot dengan durasi pemberitahuan penghentian sementara 120 detik. Secara khusus, dalam workload Anda, konfigurasikan kode untuk menangani penghentian sementara agar menunggu untuk dijalankan hingga penghentian sementara dimulai seperti yang dijelaskan dalam Mendeteksi penghentian sementara dalam VM. Kemudian, kode Anda untuk menangani pengambilalihan akan berjalan selama durasi pemberitahuan pengambilalihan. (Secara opsional, VM ini juga dapat menentukan skrip penonaktifan, yang berjalan selama periode penonaktifan.)
  • Menangani preemption dalam skrip penonaktifan. Sebaiknya gunakan metode ini untuk VM Spot tanpa durasi pemberitahuan preemption, yang merupakan konfigurasi default. Secara khusus, konfigurasi kode Anda untuk menangani penghentian sementara dalam skrip penonaktifan seperti yang ditunjukkan dalam contoh berikut. Skrip shutdown otomatis berjalan hingga 30 detik selama periode shutdown upaya terbaik untuk semua jenis shutdown. Oleh karena itu, Anda mungkin ingin mengonfigurasi kode untuk menangani preemption agar hanya berjalan jika VM di-preempt seperti yang dijelaskan dalam Mendeteksi preemption dalam VM.

Contoh penanganan pengambilalihan

Contoh skrip berikut menunjukkan cara menangani penghentian sementara dengan mengupload file checkpoint ke bucket Cloud Storage. Anda dapat menjalankan skrip ini dalam workload atau mengonfigurasinya sebagai skrip penonaktifan. Setelah menghentikan program tertentu dengan lancar, skrip akan melakukan upload paralel terhadap file checkpoint ke bucket Cloud Storage. Setelah skrip selesai atau waktunya habis, perintah kill normal sistem operasi akan menghentikan semua proses yang tersisa.

#!/bin/bash

MY_PROGRAM="PROGRAM_NAME" # For example, "apache2" or "nginx"
MY_USER="LOCAL_USER"
CHECKPOINT="/home/$MY_USER/checkpoint.out"
BUCKET_NAME="BUCKET_NAME" # For example, "my-checkpoint-files" (without gs://)

echo "Shutting down!  Seeing if ${MY_PROGRAM} is running."

# Find the newest copy of $MY_PROGRAM
PID="$(pgrep -n "$MY_PROGRAM")"

if [[ "$?" -ne 0 ]]; then
  echo "${MY_PROGRAM} not running, shutting down immediately."
  exit 0
fi

echo "Sending SIGINT to $PID"
kill -2 "$PID"

# Portable waitpid equivalent
while kill -0 "$PID"; do
   sleep 1
done

echo "$PID is done, copying ${CHECKPOINT} to gs://${BUCKET_NAME} as ${MY_USER}"

su "${MY_USER}" -c "gcloud storage cp $CHECKPOINT gs://${BUCKET_NAME}/"

echo "Done uploading, shutting down."

Skrip ini mengasumsikan hal berikut:

  • VM dibuat dengan setidaknya akses baca atau tulis ke Cloud Storage. Untuk mengetahui petunjuk cara membuat VM dengan cakupan yang sesuai, baca dokumentasi autentikasi.

  • Anda sudah memiliki bucket Cloud Storage dan izin untuk menulis ke bucket tersebut.

Untuk menambahkan skrip ini ke VM, konfigurasikan skrip agar berfungsi dengan workload di VM Anda, lalu tambahkan skrip ke workload atau metadata VM.

  1. Salin atau download contoh skrip:

    • Salin skrip sebelumnya setelah mengganti yang berikut:

      • PROGRAM_NAME: nama proses atau program yang ingin Anda hentikan. Misalnya apache2 atau nginx.
      • LOCAL_USER: nama pengguna yang Anda gunakan untuk login ke virtual machine.
      • BUCKET_NAME: nama bucket Cloud Storage tempat Anda ingin menyimpan file checkpoint program. Perlu diperhatikan bahwa dalam hal ini, nama bucket tidak diawali dengan gs://.
    • Download skrip contoh ke workstation lokal Anda. Kemudian, ganti variabel berikut dalam file:

      • PROGRAM_NAME: nama proses atau program yang ingin Anda hentikan. Misalnya apache2 atau nginx.
      • LOCAL_USER: nama pengguna yang Anda gunakan untuk login ke virtual machine.
      • BUCKET_NAME: nama bucket Cloud Storage tempat Anda ingin menyimpan file checkpoint program. Perlu diperhatikan bahwa dalam hal ini, nama bucket tidak diawali dengan gs://.
  2. Konfigurasi deteksi preemption dan tambahkan skrip berdasarkan tempat Anda berencana menangani preemption, baik dalam workload maupun dalam skrip penonaktifan. Untuk mengetahui informasi selengkapnya tentang cara memilih tempat untuk menangani penghentian sementara workload Anda, lihat definisi durasi pemberitahuan penghentian sementara.

    • Menangani penghentian sementara dalam workload Anda: Selesaikan langkah-langkah berikut.

      1. Konfigurasi skrip untuk menunggu hingga preemption dimulai seperti yang dijelaskan dalam Mendeteksi preemption dalam VM.

      2. Tambahkan skrip ke workload Anda.

    • Menangani preemption dalam skrip penonaktifan: Selesaikan langkah-langkah berikut.

      1. Sebaiknya konfigurasi skrip agar hanya berjalan saat penonaktifan disebabkan oleh preemption seperti yang dijelaskan dalam Mendeteksi preemption dalam VM. Misalnya, Anda tidak perlu mengupload file checkpoint saat VM Anda dimatikan karena workload Anda telah selesai.

      2. Tambahkan skrip penonaktifan ke VM baru atau VM yang ada.

Mendeteksi preemption Spot VM

Bagian berikut menjelaskan metode yang dapat Anda gunakan untuk mendeteksi preempti VM Spot.

  • Mendeteksi preemption dalam VM: Misalnya, gunakan metode ini untuk memeriksa preemption dalam skrip penonaktifan atau untuk memicu penanganan preemption untuk Spot VM dengan durasi pemberitahuan preemption 120 detik.
  • Melihat operasi preemption: Misalnya, gunakan metode ini saat Anda ingin menentukan alasan VM Spot dimatikan.

Mendeteksi preemption dalam VM

Untuk mendeteksi apakah VM sedang di-preempt dari dalam VM itu sendiri, periksa nilai preempted di server metadata dalam metadata default VM Anda. Misalnya, gunakan satu atau beberapa metode berikut berdasarkan tempat Anda berencana menangani penghentian sementara.

  • Jika Anda menangani penghentian paksa dalam skrip penonaktifan, periksa nilai preempted saat ini. Anda dapat menjalankan perintah curl berikut dari dalam VM untuk mendapatkan nilai saat ini untuk preempted:

    curl "http://metadata.google.internal/computeMetadata/v1/instance/preempted" -H "Metadata-Flavor: Google"
    TRUE
    

    Jika nilai ini TRUE, VM akan di-preempt oleh Compute Engine. Jika tidak, VM adalah FALSE. Misalnya, gunakan perintah ini dalam skrip penonaktifan untuk melakukan tindakan yang berbeda berdasarkan apakah penonaktifan disebabkan oleh preemption atau tidak.

  • Jika Anda menangani preempti dalam workload, tunggu hingga preempted menjadi TRUE. Untuk menunggu hingga preempted menjadi TRUE, Anda dapat menambahkan parameter kueri ?wait_for_change=true ke URL perintah sebelumnya. Dengan parameter kueri ini, perintah melakukan permintaan HTTP GET yang tidak berfungsi, yang hanya ditampilkan saat metadata telah berubah dan VM telah di-preempt.

    curl "http://metadata.google.internal/computeMetadata/v1/instance/preempted?wait_for_change=true" -H "Metadata-Flavor: Google"
    TRUE
    

    Perintah ini berguna saat Anda ingin memicu penanganan preemption di luar skrip penonaktifan. Misalnya, gunakan metode ini untuk memicu penanganan preemption untuk VM Spot dengan durasi pemberitahuan preemption 120 detik.

Melihat operasi penghentian sementara

Anda dapat melihat operasi penghentian sementara dari Compute Engine menggunakan Google Cloud console, gcloud CLI atau Compute Engine API.

Konsol

Anda dapat memeriksa apakah VM di-preempt dengan memeriksa log aktivitas sistem.

  1. Di konsol Google Cloud , buka halaman Logs.

    Buka Log

  2. Pilih project Anda, lalu klik Lanjutkan.

  3. Tambahkan compute.instances.preempted ke kolom filter menurut label atau penelusuran teks.

  4. Anda juga dapat memasukkan nama VM jika ingin melihat operasi preemption untuk VM tertentu.

  5. Tekan enter untuk menerapkan filter yang ditentukan. Konsol Google Cloud memperbarui daftar log untuk hanya menampilkan operasi dengan VM yang di-preempt.

  6. Pilih operasi dalam daftar untuk melihat detail tentang VM yang di-preempt.

gcloud

Gunakan perintah gcloud compute operations list dengan parameter filter untuk mendapatkan daftar peristiwa preemption dalam project Anda.

gcloud compute operations list \
    --filter="operationType=compute.instances.preempted"

Secara opsional, Anda dapat menggunakan parameter filter tambahan untuk menentukan cakupan hasil lebih lanjut. Misalnya, untuk melihat peristiwa preemption hanya untuk instance dalam grup instance terkelola, gunakan perintah berikut:

gcloud compute operations list \
    --filter="operationType=compute.instances.preempted AND targetLink:instances/BASE_INSTANCE_NAME"

dengan BASE_INSTANCE_NAME adalah nama dasar yang ditentukan sebagai awalan untuk nama semua VM dalam grup instance terkelola ini.

Output-nya mirip dengan berikut ini:

NAME                  TYPE                         TARGET                                        HTTP_STATUS STATUS TIMESTAMP
systemevent-yyyyyyyy  compute.instances.preempted  us-central1-f/instances/example-instance-yyy  200         DONE   2015-04-02T12:12:10.881-07:00

Jenis operasi compute.instances.preempted menunjukkan bahwa instance VM di-preempt. Anda dapat menggunakan perintah gcloud compute operations describe untuk mendapatkan informasi lebih lanjut tentang operasi preemption tertentu.

gcloud compute operations describe SYSTEM_EVENT \
    --zone=ZONE

Ganti kode berikut:

  • SYSTEM_EVENT: peristiwa sistem dari output perintah gcloud compute operations list—misalnya, systemevent-yyyyyyyy.
  • ZONE: zona peristiwa sistem—misalnya, us-central1-f.

Outputnya mirip dengan hal berikut ini:

...
operationType: compute.instances.preempted
progress: 100
selfLink: https://compute.googleapis.com/compute/v1/projects/my-project/zones/us-central1-f/operations/systemevent-yyyyyyyy
startTime: '2015-04-02T12:12:10.881-07:00'
status: DONE
statusMessage: Instance was preempted.
...

REST

Guna mendapatkan daftar operasi sistem terbaru untuk project dan zona tertentu, gunakan metode zoneOperations.get.

GET https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/zones/ZONE/operations

Ganti kode berikut:

Secara opsional, untuk mencakup respons agar hanya menampilkan operasi preemption, Anda dapat menambahkan filter ke permintaan API:

operationType="compute.instances.preempted"

Atau, guna melihat operasi preemption untuk VM tertentu, tambahkan parameter targetLink ke filter:

operationType="compute.instances.preempted" AND
targetLink="https://www.googleapis.com/compute/v1/projects/PROJECT_ID/zones/ZONE/instances/VM_NAME

Ganti kode berikut: + PROJECT_ID: project ID. + ZONE: zona. + VM_NAME: nama VM tertentu dalam zona dan project ini.

Respons berisi daftar operasi terbaru. Misalnya, preemption terlihat serupa dengan berikut ini:

{
  "kind": "compute#operation",
  "id": "15041793718812375371",
  "name": "systemevent-yyyyyyyy",
  "zone": "https://www.googleapis.com/compute/v1/projects/my-project/zones/us-central1-f",
  "operationType": "compute.instances.preempted",
  "targetLink": "https://www.googleapis.com/compute/v1/projects/my-project/zones/us-central1-f/instances/example-instance",
  "targetId": "12820389800990687210",
  "status": "DONE",
  "statusMessage": "Instance was preempted.",
  ...
}

Menguji setelan preemption

Anda dapat menjalankan simulasi peristiwa pemeliharaan di Spot VM untuk memaksanya melakukan preempt. Gunakan fitur ini untuk menguji cara beban kerja Anda mendeteksi dan menangani penghentian sementara. Untuk mempelajari cara menguji peristiwa pemeliharaan di instance Anda, lihat Menyimulasikan peristiwa pemeliharaan host.

Praktik terbaik

Berikut ini beberapa praktik terbaik untuk membantu Anda memaksimalkan Spot VM.

  • Lihat ketersediaan resource. Sebelum membuat Spot VM, atau jika Anda mencoba membuat Spot VM tetapi terus mengalami error ketersediaan resource, Anda dapat melihat ketersediaan jenis mesin di region atau zona tertentu. Memeriksa ketersediaan resource membantu meningkatkan peluang keberhasilan pembuatan Spot VM. Untuk mengetahui petunjuknya, lihat artikel Melihat ketersediaan Spot VM.

  • Melihat data historis. Sebelum membuat Spot VM, Anda dapat melihat tarif preemptive historis dan harga historis untuk jenis mesin yang ingin digunakan Spot VM Anda. Informasi ini membantu Anda membandingkan dan memilih jenis mesin yang paling sesuai dengan kebutuhan workload dan biaya Anda. Untuk mendapatkan petunjuk, lihat Melihat tarif dan harga preempti untuk Spot VM.

  • Menggunakan template instance. Daripada membuat Spot VM satu per satu, Anda dapat menggunakan template instance untuk membuat beberapa Spot VM dengan properti yang sama. Template instance diperlukan untuk menggunakan MIG. Atau, Anda juga dapat membuat beberapa Spot VM menggunakan Bulk Instance API.

  • Menggunakan MIG untuk meningkatkan ketersediaan resource dan membuat ulang Spot VM secara otomatis. Gunakan MIG untuk membuat workload di Spot VM lebih fleksibel dan tangguh. Misalnya, untuk mencegah error ketersediaan resource, Anda dapat meningkatkan fleksibilitas workload dengan mengizinkan hal berikut:

    Selain itu, MIG dapat memperbaiki Spot VM yang di-preempt dengan membuatnya ulang secara otomatis.

  • Memilih jenis mesin yang lebih kecil. Resource untuk Spot VM berasal dari kelebihan dan pencadangan Google Cloud kapasitas. Kapasitas untuk Spot VM sering kali lebih mudah didapatkan untuk jenis mesin yang lebih kecil, yaitu jenis mesin dengan resource yang lebih sedikit, seperti vCPU dan memori. Anda mungkin menemukan lebih banyak kapasitas untuk Spot VM dengan memilih jenis mesin kustom yang lebih kecil, tetapi kapasitas bahkan lebih mungkin tersedia untuk jenis mesin yang telah ditetapkan dengan ukuran lebih kecil. Misalnya, dibandingkan dengan kapasitas untuk jenis mesin yang telah ditetapkan n2-standard-32, kapasitas untuk jenis mesin kustom n2-custom-24-96 lebih mungkin tersedia, tetapi kapasitas untuk jenis mesin yang telah ditetapkan n2-standard-16 bahkan lebih mungkin lagi tersedia.

  • Menjalankan cluster Spot VM yang besar selain masa sibuk. Beban pada pusat data Google Cloud berbeda-beda menurut lokasi dan waktu, tetapi umumnya paling rendah pada malam hari dan akhir pekan. Dengan demikian, malam hari dan akhir pekan adalah waktu terbaik untuk menjalankan cluster Spot VM yang besar.

  • Mendesain workload Anda agar mampu menangani fault dan preemption. Anda harus siap dengan adanya perubahan pola preemption pada waktu yang berbeda. Misalnya, jika suatu zona mengalami pemadaman sebagian, sejumlah besar Spot VM dapat di-preempt untuk memberi ruang bagi VM standar yang perlu dipindahkan sebagai bagian dari pemulihan. Dalam jangka waktu yang singkat itu, tingkat preemption akan terlihat sangat berbeda dari hari lainnya. Jika beban kerja Anda berasumsi bahwa preemption selalu dilakukan dalam kelompok kecil, Anda mungkin tidak siap untuk peristiwa tersebut.

  • Mencoba lagi membuat Spot VM yang telah di-preempt. Jika Spot VM Anda telah di-preempt, coba buat Spot VM baru satu atau dua kali sebelum beralih kembali ke VM standar. Bergantung pada persyaratan Anda, sebaiknya gabungkan VM standar dan Spot VM di cluster Anda untuk memastikan bahwa pekerjaan dilakukan dengan kecepatan yang memadai.

  • Simpan progres untuk mengurangi preemption. Kelola pemberitahuan penonaktifan dan preemption dengan menyimpan progres workload Anda sehingga dapat melanjutkan tugas, bukan memulai dari awal. Misalnya, simpan progres setiap kali preemption terdeteksi seperti yang dijelaskan dalam Mengelola preemption Spot VM. Untuk ketahanan lebih lanjut, pertimbangkan juga untuk menyimpan progres secara berkala, bukan hanya saat preempti terdeteksi.

Apa langkah selanjutnya?