VM Spot


Halaman ini menjelaskan apa itu Spot VM dan cara kerjanya di Google Kubernetes Engine (GKE). Untuk mempelajari cara menggunakan VM Spot, baca artikel Menggunakan Spot VM.

Ringkasan Spot VM di GKE

Spot VM adalah instance virtual machine (VM) Compute Engine yang harganya lebih rendah daripada VM Compute Engine standar dan tidak memberikan jaminan ketersediaan. Spot VM menawarkan jenis mesin dan opsi yang sama dengan VM standar.

Anda dapat menggunakan Spot VM di cluster dan kumpulan node untuk menjalankan workload stateless, batch, atau fault-tolerant yang dapat menoleransi gangguan yang disebabkan oleh sifat sementara Spot VM.

Spot VM tetap tersedia hingga Compute Engine memerlukan resource untuk VM standar.

Untuk mempelajari Spot VM lebih lanjut, baca artikel Spot VM dalam dokumentasi Compute Engine.

Manfaat Spot VM

Spot VM dan preemptible VM memiliki banyak keuntungan, termasuk:

  • Harga lebih rendah daripada VM Compute Engine standar.
  • Berguna untuk workload stateless dan fault-tolerant yang tahan terhadap sifat VM yang sementara.
  • Dapat digunakan dengan autoscaler cluster dan penyediaan otomatis node.

Berbeda dengan preemptible VM, yang masa berlakunya akan berakhir setelah 24 jam, Spot VM tidak memiliki masa berlaku. Spot VM hanya dihentikan saat Compute Engine memerlukan resource di tempat lain.

Cara kerja Spot VM di GKE

Saat Anda membuat cluster atau kumpulan node dengan Spot VM, GKE akan membuat Spot VM Compute Engine dasar yang berperilaku seperti grup instance terkelola (MIG). Node yang menggunakan Spot VM berperilaku seperti node GKE standar, tetapi tanpa jaminan ketersediaan. Saat resource yang digunakan oleh Spot VM diperlukan untuk menjalankan VM standar, Compute Engine akan menghentikan Spot VM tersebut untuk menggunakan resource di tempat lain.

Penghentian dan pemadaman tuntas Spot VM

Saat Compute Engine perlu mengklaim kembali resource yang digunakan oleh Spot VM, pemberitahuan penghentian akan dikirim ke GKE. Spot VM dihentikan 30 detik setelah menerima pemberitahuan penghentian.

Secara default, cluster menggunakan penghentian node secara halus. Kubelet merespons pemberitahuan penghentian dan secara tuntas menghentikan Pod yang berjalan di node. Jika Pod adalah bagian dari Deployment, pengontrol akan membuat dan menjadwalkan Pod baru untuk menggantikan Pod yang dihentikan.

Atas dasar upaya terbaik, kubelet memberikan periode penghentian tuntas selama 15 detik untuk Pod non-sistem, setelah itu Pod sistem (dengan priorityClasses system-cluster-critical atau system-node-critical) memiliki waktu 15 detik untuk tuntas dihentikan.

Selama penghentian node tuntas, kubelet akan memperbarui status Pod, dengan menetapkan fase Failed dan alasan Terminated untuk Pod yang dihentikan.

Jika jumlah Pod yang dihentikan mencapai batas 1000 untuk cluster dengan kurang dari 100 node atau 5000 untuk cluster dengan 100 node atau lebih, pembersihan sampah memori akan membersihkan Pod.

Anda juga dapat menghapus secara manual Pod yang dihentikan menggunakan perintah berikut:

  kubectl get pods --all-namespaces | grep -i NodeShutdown | awk '{print $1, $2}' | xargs -n2 kubectl delete pod -n
  kubectl get pods --all-namespaces | grep -i Terminated | awk '{print $1, $2}' | xargs -n2 kubectl delete pod -n

Menjadwalkan workload di Spot VM

GKE secara otomatis menambahkan label cloud.google.com/gke-spot=true dan cloud.google.com/gke-provisioning=spot (untuk node yang menjalankan GKE versi 1.25.5-gke.2500 atau yang lebih baru) ke node yang menggunakan Spot VM. Anda dapat menjadwalkan Pod tertentu pada node yang menggunakan Spot VM menggunakan kolom nodeSelector dalam spesifikasi Pod. Contoh berikut menggunakan label cloud.google.com/gke-spot:

apiVersion: v1
kind: Pod
spec:
  nodeSelector:
    cloud.google.com/gke-spot: "true"

Atau, Anda dapat menggunakan afinitas node untuk memberi tahu GKE agar menjadwalkan Pod di Spot VM, mirip dengan contoh berikut:

apiVersion: v1
kind: Pod
spec:
...
  affinity:
    nodeAffinity:
      requiredDuringSchedulingIgnoredDuringExecution:
        nodeSelectorTerms:
        - matchExpressions:
          - key: cloud.google.com/gke-spot
            operator: In
            values:
            - "true"
...

Anda juga dapat menggunakan nodeAffinity.preferredDuringSchedulingIgnoredDuringExecution untuk memilih agar GKE menempatkan Pod pada node yang menggunakan Spot VM. Memilih Spot VM tidak direkomendasikan, karena GKE mungkin menjadwalkan Pod ke node yang sudah tersedia dan menggunakan VM standar.

Menggunakan taint dan toleransi untuk penjadwalan

Untuk menghindari gangguan sistem, gunakan taint node untuk memastikan bahwa GKE tidak menjadwalkan workload penting ke Spot VM. Saat Anda melakukan taint pada node yang menggunakan Spot VM, GKE hanya menjadwalkan Pod yang memiliki toleransi yang sesuai ke node tersebut.

Jika Anda menggunakan taint node, pastikan cluster Anda juga memiliki setidaknya satu kumpulan node yang menggunakan VM Compute Engine standar. Kumpulan node yang menggunakan VM standar menyediakan tempat yang andal bagi GKE untuk menjadwalkan komponen sistem penting seperti DNS.

Untuk mengetahui informasi tentang penggunaan taint node untuk VM Spot, baca artikel Menggunakan taint dan toleransi untuk Spot VM.

Menggunakan Spot VM dengan node pool GPU

Dukungan Spot VM menggunakan GPU. Saat Anda membuat node pool GPU baru, GKE secara otomatis menambahkan taint nvidia.com/gpu=present:NoSchedule ke node baru. Hanya Pod dengan toleransi yang sesuai yang dapat berjalan di node ini. GKE secara otomatis menambahkan toleransi ini ke Pod yang meminta GPU.

Cluster Anda harus memiliki setidaknya satu node pool non-GPU yang menggunakan VM standar sebelum Anda membuat node pool GPU yang menggunakan Spot VM. Jika cluster Anda hanya memiliki node pool GPU dengan Spot VM, GKE tidak menambahkan taint nvidia.com/gpu=present:NoSchedule ke node tersebut. Akibatnya, GKE mungkin menjadwalkan workload sistem ke node pool GPU dengan Spot VM, yang dapat menyebabkan gangguan akibat Spot VM dan dapat meningkatkan konsumsi resource karena node GPU lebih mahal daripada node non-GPU.

Autoscaler cluster dan penyediaan otomatis node

Anda dapat menggunakan autoscaler cluster dan penyediaan otomatis node untuk menskalakan cluster dan node pool secara otomatis berdasarkan permintaan workload Anda. Autoscaler cluster dan penyediaan otomatis node mendukung Spot VM.

Spot VM dan penyediaan otomatis node

Penyediaan otomatis node akan membuat dan menghapus node pool secara otomatis di cluster Anda untuk memenuhi permintaan workload Anda. Saat Anda menjadwalkan workload yang memerlukan Spot VM dengan menggunakan nodeSelector atau afinitas node, penyediaan otomatis node akan membuat node pool baru untuk mengakomodasi Pod workload. GKE secara otomatis menambahkan taint cloud.google.com/gke-spot=true:NoSchedule ke node dalam node pool baru. Hanya Pod dengan toleransi terkait yang dapat berjalan di node dalam node pool tersebut. Anda harus menambahkan toleransi yang sesuai ke deployment Anda agar GKE dapat menempatkan Pod di Spot VM:

   tolerations:
   - key: cloud.google.com/gke-spot
     operator: Equal
     value: "true"
     effect: NoSchedule

Anda dapat memastikan bahwa GKE hanya menjadwalkan Pod di Spot VM dengan menggunakan toleransi maupun nodeSelector atau aturan afinitas node untuk memfilter untuk Spot VM.

Jika Anda menjadwalkan workload hanya dengan menggunakan toleransi, GKE dapat menjadwalkan Pod ke Spot VM atau VM standar yang sudah ada dengan kapasitas. Jika Anda memerlukan workload yang dijadwalkan di Spot VM, gunakan nodeSelector atau afinitas node selain toleransi. Untuk mempelajari lebih lanjut, lihat Menjadwalkan workload di Spot VM.

Spot VM dan autoscaler cluster

Autoscaler cluster otomatis menambahkan dan menghapus node dalam node pool Anda berdasarkan permintaan. Jika cluster Anda memiliki Pod yang tidak dapat ditempatkan di Spot VM yang ada, autoscaler cluster akan menambahkan node baru yang menggunakan Spot VM.

Kebijakan default

Mulai dari GKE versi 1.24.1-gke.800, Anda dapat menentukan kebijakan lokasi autoscaler. Autoscaler cluster mencoba menyediakan node pool Spot VM saat resource tersedia dan kebijakan lokasi default ditetapkan ke ANY. Dengan kebijakan ini, Spot VM memiliki risiko yang lebih rendah untuk di-preempt. Untuk jenis VM lainnya, kebijakan distribusi autoscaler cluster default adalah BALANCED.

Mengupgrade node pool Standar menggunakan Spot VM

Jika node pool cluster Standard Anda yang menggunakan Spot VM dikonfigurasi untuk menggunakan upgrade lonjakan, GKE akan membuat node lonjakan dengan Spot VM. Namun, GKE tidak menunggu VM Spot siap sebelum memisahkan dan mengosongkan node yang ada, karena VM Spot tidak memberikan jaminan ketersediaan. Untuk mempelajari lebih lanjut, lihat Upgrade Surge.

Perubahan pada perilaku Kubernetes

Penggunaan Spot VM di GKE mengubah beberapa jaminan dan batasan yang diberikan Kubernetes, seperti berikut ini:

  • Reklamasi Spot VM bersifat tidak sukarela dan tidak tercakup dalam jaminan PodDisruptionBudgets. Anda mungkin mengalami ketidaktersediaan yang lebih besar daripada PodDisruptionBudget yang dikonfigurasi.

Praktik terbaik untuk Spot VM

Saat mendesain sistem yang menggunakan Spot VM, Anda dapat menghindari gangguan besar dengan mengikuti panduan berikut:

  • Spot VM tidak memiliki jaminan ketersediaan. Desain sistem Anda dengan asumsi bahwa GKE dapat mengklaim kembali sebagian atau semua Spot VM Anda kapan saja, tanpa jaminan kapan instance baru akan tersedia.
  • Untuk memastikan workload dan Tugas Anda diproses meskipun tidak ada Spot VM yang tersedia, pastikan cluster Anda memiliki gabungan node pool yang menggunakan Spot VM dan node pool yang menggunakan VM Compute Engine standar.
  • Pastikan cluster Anda memiliki setidaknya satu node pool non-GPU yang menggunakan VM standar sebelum Anda menambahkan node pool GPU yang menggunakan Spot VM.
  • Meskipun nama node biasanya tidak berubah saat node dibuat ulang, alamat IP internal dan eksternal yang digunakan oleh Spot VM mungkin berubah setelah pembuatan ulang.
  • Gunakan taint dan toleransi node untuk memastikan bahwa Pod penting tidak dijadwalkan ke node pool yang menggunakan Spot VM.
  • Untuk menjalankan workload stateful di Spot VM, lakukan pengujian untuk memastikan bahwa workload Anda dapat dihentikan dengan tuntas dalam waktu 25 detik setelah penonaktifan untuk meminimalkan risiko kerusakan data volume persisten.
  • Ikuti praktik terbaik penghentian Pod Kubernetes.

Langkah berikutnya