Menggunakan preemptible VM untuk menjalankan workload fault-tolerant

Halaman ini menunjukkan cara menggunakan preemptible VM di Google Kubernetes Engine (GKE).

Praktik terbaik:

Spot VM adalah versi terbaru dari preemptible VM. Daripada preemptible VM, sebaiknya gunakan Spot Pod di cluster Autopilot atau Spot VM di cluster Standar. GKE terus mendukung preemptible VM, yang menggunakan model harga yang sama dengan Spot VM.

Ringkasan

Preemptible VM adalah instance VM Compute Engine yang harganya lebih rendah daripada VM standar dan tidak memberikan jaminan ketersediaan. Preemptible VM menawarkan fungsi yang serupa dengan Spot VM, tetapi hanya bertahan hingga 24 jam setelah pembuatan.

Dalam beberapa kasus, preemptible VM mungkin bertahan lebih dari 24 jam. Hal ini dapat terjadi jika instance Compute Engine baru muncul terlalu cepat dan Kubernetes tidak mengenali bahwa VM Compute Engine yang berbeda telah dibuat. Instance Compute Engine yang mendasarinya akan memiliki durasi maksimum 24 jam dan mengikuti perilaku preemptible VM yang diharapkan.

Perbandingan dengan Spot VM

Preemptible VM memiliki banyak kesamaan dengan Spot VM, termasuk:

Berbeda dengan Spot VM, yang tidak memiliki waktu habis masa berlaku maksimum, preemptible VM hanya bertahan hingga 24 jam setelah pembuatan.

Anda dapat mengaktifkan preemptible VM pada cluster dan node pool baru, menggunakan nodeSelector atau afinitas node untuk mengontrol penjadwalan, serta menggunakan taint dan toleransi untuk menghindari masalah terkait beban kerja sistem saat node di-preempt.

Penghentian dan pemadaman tuntas preemptible VM

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

Secara default, cluster menggunakan penonaktifan node yang benar. kubelet merespons pemberitahuan penghentian dan secara tuntas menghentikan Pod yang sedang berjalan di node. Jika Pod adalah bagian dari workload terkelola, seperti 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 priorityClass system-cluster-critical atau system-node-critical) memiliki waktu 15 detik untuk penghentian tuntas. Selama penghentian node tuntas, kubelet memperbarui status Pod dan menetapkan fase Failed serta alasan Terminated untuk Pod yang dihentikan.

Periode penghentian tuntas untuk Pod non-sistem memiliki waktu maksimum 15 detik. Menentukan nilai yang lebih besar dari 15 detik di kolom terminationGracePeriodSeconds pada manifes Pod tidak akan berpengaruh. Seluruh VM dimatikan 30 detik setelah pemberitahuan preemption.

Perubahan pada perilaku Kubernetes

Penggunaan preemptible VM di GKE mengubah perlindungan yang diberikan oleh Kubernetes PodDisruptionBudgets. Reklamasi VM preemptible bersifat tidak sukarela dan tidak tercakup dalam perlindungan PodDisruptionBudgets. Anda mungkin mengalami ketidaktersediaan yang lebih besar daripada PodDisruptionBudget yang dikonfigurasi.

Batasan

  • Preemptible VM tidak mendukung node pool Windows Server.
  • Dengan VM preemptible, Anda tidak dapat mengubah masa tenggang 15 detik untuk Pod non-sistem dan periode 15 detik berikutnya untuk Pod sistem. Kolom konfigurasi shutdownGracePeriod dan shutdownGracePeriodCriticalPods kubelet yang mendasarinya tidak dapat diubah. Namun, Spot VM mendukung perubahan setelan ini. Untuk mengetahui informasi selengkapnya, lihat Penghentian dan penghentian normal Spot VM.

Membuat cluster atau node pool dengan preemptible VM

Anda dapat menggunakan Google Cloud CLI untuk membuat cluster atau node pool dengan preemptible VM.

Untuk membuat cluster dengan preemptible VM, jalankan perintah berikut:

gcloud container clusters create CLUSTER_NAME \
    --preemptible

Ganti CLUSTER_NAME dengan nama cluster baru Anda.

Untuk membuat node pool dengan preemptible VM, jalankan perintah berikut:

gcloud container node-pools create POOL_NAME \
    --cluster=CLUSTER_NAME \
    --preemptible

Ganti POOL_NAME dengan nama node pool baru Anda.

Menggunakan nodeSelector untuk menjadwalkan Pod di preemptible VM

GKE menambahkan label cloud.google.com/gke-preemptible=true dan cloud.google.com/gke-provisioning=preemptible ke node yang menggunakan preemptible VM. Anda dapat menggunakan nodeSelector di deployment Anda untuk memberi tahu GKE agar menjadwalkan Pod ke preemptible VM.

Sebagai contoh, filter Deployment berikut untuk preemptible VM menggunakan label cloud.google.com/gke-preemptible:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: hello-app
spec:
  replicas: 3
  selector:
    matchLabels:
      app: hello-app
  template:
    metadata:
      labels:
        app: hello-app
    spec:
      containers:
      - name: hello-app
        image: us-docker.pkg.dev/google-samples/containers/gke/hello-app:1.0
        resources:
          requests:
            cpu: 200m
      nodeSelector:
        cloud.google.com/gke-preemptible: "true"

Menggunakan taint node untuk preemptible VM

Anda dapat melakukan taint pada node yang menggunakan preemptible VM sehingga GKE hanya dapat menempatkan Pod dengan toleransi yang sesuai pada node tersebut.

Untuk menambahkan taint node ke node pool yang menggunakan preemptible VM, gunakan tanda --node-taints saat membuat node pool, mirip dengan perintah berikut:

gcloud container node-pools create POOL2_NAME \
    --cluster=CLUSTER_NAME \
    --node-taints=cloud.google.com/gke-preemptible="true":NoSchedule

Sekarang, hanya Pod yang menoleransi taint node yang dijadwalkan ke node.

Untuk menambah toleransi yang relevan ke Pod Anda, ubah deployment dan tambahkan hal berikut ke spesifikasi Pod:

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

Taint node untuk preemptible VM

Dukungan Preemptible VM menggunakan GPU. Anda harus membuat minimal satu node pool lain di cluster yang tidak menggunakan preemptible VM sebelum menambahkan node pool GPU yang menggunakan preemptible VM. Memiliki node pool standar membantu memastikan bahwa GKE dapat menempatkan komponen sistem dengan aman seperti DNS.

Jika Anda membuat cluster baru dengan node pool GPU yang menggunakan preemptible VM, atau jika Anda menambahkan node pool GPU baru yang menggunakan preemptible VM ke cluster yang belum memiliki node pool standar, GKE tidak secara otomatis menambahkan taint nvidia.com/gpu=present:NoSchedule ke node. GKE mungkin menjadwalkan Pod sistem ke preemptible VM, yang dapat menyebabkan gangguan. Perilaku ini juga meningkatkan konsumsi resource Anda karena node GPU lebih mahal daripada node non-GPU.

Langkah berikutnya