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 memaksimalkan efisiensi biaya, gabungkan menggunakan Spot VM dengan Praktik terbaik untuk menjalankan aplikasi Kubernetes yang hemat biaya di GKE.
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.
Pada cluster yang menjalankan GKE versi 1.20 dan yang lebih baru, fitur pemadaman tuntas node kubelet diaktifkan secara default. Kubelet merespons pemberitahuan penghentian dan secara tuntas memadamkan Pod yang sedang 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 berikut, berdasarkan versi GKE dari kumpulan node:
- Lebih dari 1.22.8-gke.200: 15 detik untuk Pod non-sistem, setelah itu
Pod sistem (dengan class prioritas
system-cluster-critical
atausystem-node-critical
) memiliki waktu 15 detik untuk pengentian tuntas. - 1.22.8-gke.200 dan yang lebih lama: 25 detik untuk Pod non-sistem, setelah itu
Pod sistem (dengan class prioritas
system-cluster-critical
atausystem-node-critical
) memiliki waktu 5 detik untuk penghentian tuntas.
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
.
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 daripadaPodDisruptionBudget
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
- Pelajari cara menggunakan Spot VM di node pool Anda.
- Pelajari tentang penskalaan otomatis cluster Anda.
- Pelajari cara menskalakan aplikasi yang di-deploy.
- Pelajari Spot VM lebih lanjut di dokumentasi Compute Engine.
- Ikuti tutorial tentang cara men-deploy workload batch menggunakan Spot VM di GKE.