Jalankan workload fault-tolerant dengan biaya lebih rendah menggunakan Spot VM


Halaman ini menunjukkan cara menjalankan workload fault-tolerant, stateless, atau batch dengan biaya yang lebih rendah menggunakan Spot VM di cluster dan node pool Google Kubernetes Engine (GKE).

Ringkasan

Spot VM adalah virtual machine (VM) Compute Engine yang harganya lebih rendah daripada VM standar default dan tidak memberikan jaminan ketersediaan. Spot VM menawarkan jenis mesin dan opsi yang sama dengan VM Compute Engine standar. Compute Engine dapat mengklaim kembali Spot VM kapan saja karena peristiwa sistem, seperti saat resource diperlukan untuk VM standar.

Untuk mempelajari Spot VM di GKE lebih lanjut, baca artikel tentang Spot VM.

Spot VM menggantikan kebutuhan menggunakan preemptible VM untuk menjalankan workload stateless, batch, atau fault-tolerant. Berbeda dengan preemptible VM, yang masa berlakunya akan habis setelah 24 jam, Spot VM tidak memiliki masa berlaku. Spot VM dihentikan saat Compute Engine memerlukan resource untuk menjalankan VM standar.

Spot VM juga didukung di cluster GKE Autopilot melalui Spot Pod. Dengan Pod Spot, Autopilot otomatis menjadwalkan dan mengelola workload pada Spot VM.

Batasan

Sebelum memulai

Sebelum memulai, pastikan Anda telah menjalankan tugas berikut:

  • Aktifkan Google Kubernetes Engine API.
  • Aktifkan Google Kubernetes Engine API
  • Jika ingin menggunakan Google Cloud CLI untuk tugas ini, instal lalu lakukan inisialisasi gcloud CLI. Jika sebelumnya Anda telah menginstal gcloud CLI, dapatkan versi terbaru dengan menjalankan gcloud components update.

Membuat cluster dengan Spot VM

Anda dapat membuat cluster baru menggunakan Spot VM dengan Google Cloud CLI atau Konsol Google Cloud.

gcloud

Buat cluster baru yang menggunakan Spot VM di node pool default, bukan VM standar:

gcloud container clusters create CLUSTER_NAME \
    --spot

Ganti CLUSTER_NAME dengan nama cluster baru Anda.

Konsol

Untuk membuat cluster baru dengan node pool menggunakan Spot VM, lakukan langkah-langkah berikut:

  1. Buka halaman Google Kubernetes Engine di Konsol Google Cloud.

    Buka Google Kubernetes Engine

  2. Klik Create.

  3. Pada dialog Buat cluster, di samping GKE Standard, klik Konfigurasi.

  4. Dari menu navigasi, di bagian Node Pools, klik nama node pool yang ingin Anda konfigurasi, lalu klik Nodes.

  5. Centang kotak Enable Spot VMs.

  6. Konfigurasikan cluster sesuai kebutuhan, lalu klik Buat.

Membuat node pool dengan Spot VM

Anda dapat membuat node pool baru menggunakan Spot VM dengan gcloud CLI atau Konsol Google Cloud. Anda hanya dapat mengaktifkan Spot VM pada node pool baru. Anda tidak dapat mengaktifkan atau menonaktifkan Spot VM pada node pool yang ada.

gcloud

Buat node pool baru menggunakan Spot VM:

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

Ganti POOL_NAME dengan nama node pool baru Anda.

Konsol

Untuk membuat node pool baru menggunakan Spot VM, lakukan langkah-langkah berikut:

  1. Buka halaman Google Kubernetes Engine di Konsol Google Cloud.

    Buka Google Kubernetes Engine

  2. Di daftar cluster, klik nama cluster yang ingin diubah.

  3. Klik Add node pool.

  4. Dari menu navigasi, klik Node.

  5. Centang kotak Enable Spot VMs.

  6. Konfigurasikan node pool sesuai kebutuhan, lalu klik Create.

Menjadwalkan workload di Spot VM

GKE 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 memfilter label ini di spesifikasi Pod menggunakan kolom nodeSelector di spesifikasi Pod atau afinitas node.

Pada contoh berikut, Anda membuat cluster dengan dua node pool, salah satunya menggunakan Spot VM. Kemudian, Anda akan men-deploy aplikasi nginx stateless ke Spot VM, menggunakan nodeSelector untuk mengontrol tempat GKE menempatkan Pod.

  1. Buat cluster baru dengan node pool default menggunakan VM standar:

    gcloud container clusters create CLUSTER_NAME
    

    Ganti CLUSTER_NAME dengan nama cluster baru Anda.

  2. Dapatkan kredensial untuk cluster:

    gcloud container clusters get-credentials CLUSTER_NAME
    
  3. Buat node pool menggunakan Spot VM:

    gcloud container node-pools create POOL_NAME \
        --num-nodes=1 \
        --spot
    

    Ganti POOL_NAME dengan nama node pool baru Anda.

  4. Simpan manifes berikut sebagai file bernama pi-app.yaml:

    apiVersion: batch/v1
    kind: Job
    metadata:
      name: pi
    spec:
      template:
        metadata:
          labels:
            app: pi
        spec:
          nodeSelector:
            cloud.google.com/gke-spot: "true"
          terminationGracePeriodSeconds: 25
          containers:
          - name: pi
            image: perl:5.34.0
            command: ["perl",  "-Mbignum=bpi", "-wle", "print bpi(2000)"]
          restartPolicy: Never
      backoffLimit: 4
    

    Dalam manifes ini, kolom nodeSelector memberi tahu GKE untuk hanya menjadwalkan Pod pada node yang menggunakan Spot VM.

  5. Terapkan manifes ke cluster Anda:

    kubectl apply -f pi-app.yaml
    
  6. Deskripsikan Pod:

    kubectl describe pod pi
    

    Outputnya mirip dengan hal berikut ini:

    Name:         pi-kjbr9
    Namespace:    default
    Priority:     0
    Node:         gke-cluster-2-spot-pool-fb434072-44ct
    ...
    Labels:       app=pi
                  job-name=pi
    Status:       Succeeded
    ...
    Controlled By:  Job/pi
    Containers:
    ...
    Conditions:
      Type              Status
      Initialized       True 
      Ready             False 
      ContainersReady   False 
      PodScheduled      True 
    Volumes:
    ...
    Node-Selectors:              cloud.google.com/gke-spot=true
    Tolerations:                 node.kubernetes.io/not-ready:NoExecute op=Exists for 300s
                                node.kubernetes.io/unreachable:NoExecute op=Exists for 300s
    Events:
      Type    Reason     Age    From               Message
      ----    ------     ----   ----               -------
      Normal  Scheduled  4m3s   default-scheduler  Successfully assigned default/pi-kjbr9 to gke-cluster-2-spot-pool-fb434072-44ct
      Normal  Pulling    4m2s   kubelet            Pulling image "perl:5.34.0"
      Normal  Pulled     3m43s  kubelet            Successfully pulled image "perl:5.34.0" in 18.481761978s
      Normal  Created    3m43s  kubelet            Created container pi
      Normal  Started    3m43s  kubelet            Started container pi
    

    Kolom Node menunjukkan bahwa GKE hanya menjadwalkan Pod Anda di node yang menggunakan Spot VM.

Menggunakan taint dan toleransi untuk Spot VM

Sebagai praktik terbaik, buat cluster dengan setidaknya satu node pool tanpa Spot VM tempat Anda dapat menempatkan workload sistem seperti DNS. Anda dapat menggunakan taint node dan toleransi yang sesuai untuk memberi tahu GKE agar menghindari penempatan workload tertentu di Spot VM.

  1. Untuk membuat node pool dengan node yang menggunakan Spot VM dan memiliki taint node, gunakan flag --node-taints saat membuat node pool:

    gcloud container node-pools create POOL_NAME \
        --node-taints=cloud.google.com/gke-spot="true":NoSchedule
        --spot
    
  2. Untuk menambah toleransi yang sesuai ke Pod yang ingin dijadwalkan ke Spot VM, ubah deployment Anda dan tambahkan hal berikut ke spesifikasi Pod:

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

    GKE hanya menjadwalkan Pod dengan toleransi ini ke Spot VM dengan taint node yang ditambahkan.

Langkah berikutnya