Menjalankan workload fault-tolerant dengan biaya lebih rendah di Pod Spot


Halaman ini menunjukkan cara menjalankan workload fault-tolerant dengan biaya lebih rendah menggunakan Pod Spot di cluster Google Kubernetes Engine (GKE) Autopilot Anda.

Ringkasan

Di cluster GKE Autopilot, Spot Pod adalah Pod yang berjalan pada node yang didukung oleh Spot VM Compute Engine. Pod Spot dihargai lebih rendah daripada Pod Autopilot standar, tetapi dapat ditiadakan oleh GKE setiap kali resource komputasi diperlukan untuk menjalankan Pod standar.

Pod Spot ideal untuk menjalankan beban kerja stateless, batch, atau fault-tolerant dengan biaya lebih rendah daripada menjalankan beban kerja tersebut sebagai Pod standar. Untuk menggunakan Pod Spot di cluster Autopilot, ubah manifes dengan spesifikasi Pod untuk meminta Pod Spot.

Anda dapat menjalankan Pod Spot di class komputasi Autopilot umum default serta di class komputasi khusus yang memenuhi persyaratan hardware tertentu. Untuk mengetahui informasi tentang class komputasi ini, lihat Class komputasi di Autopilot.

Untuk mempelajari lebih lanjut harga Pod Spot di cluster Autopilot, lihat Harga Google Kubernetes Engine.

Manfaat

Menggunakan Pod Spot di cluster Autopilot akan memberi Anda manfaat berikut:

  • Harga lebih rendah daripada menjalankan beban kerja yang sama pada Pod Autopilot standar.
  • GKE mengelola penskalaan otomatis dan penjadwalan secara otomatis.
  • GKE secara otomatis taint node yang menjalankan Pod Spot untuk memastikan bahwa Pod standar, seperti beban kerja penting, tidak dijadwalkan pada node tersebut. Deployment Anda yang menggunakan Pod Spot akan otomatis diupdate dengan tolerasi yang sesuai.

Persyaratan dan batasan

  • Memerlukan GKE versi 1.21.4 atau yang lebih baru.
  • Pod Spot dikecualikan dari Perjanjian Tingkat Layanan Autopilot.
  • GKE tidak dapat menjadwalkan Pod Spot di cluster yang menjalankan versi GKE sebelum versi 1.21.4.
  • Cluster autopilot mendukung permintaan untuk Pod yang dapat dihentikan di cluster yang menjalankan GKE versi 1.21.4 atau yang lebih baru, menggunakan pemilih cloud.google.com/gke-preemptible. Pod yang menggunakan pemilih ini otomatis dimigrasikan ke Pod Spot, dan pemilih diubah menjadi cloud.google.com/gke-spot.

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 initialize gcloud CLI. Jika sebelumnya Anda telah menginstal gcloud CLI, dapatkan versi terbaru dengan menjalankan gcloud components update.

Meminta Pod Spot di beban kerja Autopilot Anda

Untuk meminta agar Pod Anda berjalan sebagai Pod Spot, gunakan label cloud.google.com/gke-spot=true di nodeSelector atau afinitas node dalam spesifikasi Pod Anda. GKE secara otomatis menyediakan node yang dapat menjalankan Pod Spor.

Pod Spot dapat dikeluarkan dan dihentikan kapan saja, misalnya jika resource komputasi diperlukan di tempat lain di Google Cloud. Saat penghentian terjadi, Pod Spot di node penghentian dapat meminta masa tenggang hingga 25 detik sebelum penghentian, yang diberikan berdasarkan upaya terbaik, dengan menentukan kolom terminationGracePeriodSeconds.

Masa tenggang maksimum yang diberikan untuk Pod Spot selama preemption adalah 25 detik. Meminta lebih dari 25 detik dalam terminationGracePeriodSeconds tidak berarti mendapatkan lebih dari 25 detik selama preemption. Saat dikeluarkan, Pod Anda akan dikirimi sinyal SIGTERM, dan harus mengambil langkah untuk mematikan selama masa tenggang.

Untuk Autopilot, GKE juga secara otomatis melakukan taint pada node yang dibuat untuk menjalankan Pod Spot dan mengubah beban kerja tersebut dengan toleransi yang sesuai. Taint ini mencegah Pod standar dijadwalkan pada node yang menjalankan Pod Spot.

Menggunakan PemilihNode untuk mengharuskan Pod Spot

Anda dapat menggunakan Pemilihnode untuk mewajibkan Pod Spot dalam Deployment. Tambahkan label cloud.google.com/gke-spot=true ke Deployment Anda, seperti dalam contoh berikut:

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

Menggunakan afinitas node untuk meminta Pod Spot

Atau, Anda dapat menggunakan afinitas node untuk meminta Pod Spot. Afinitas node memberi Anda cara yang lebih luas dalam memilih node yang akan menjalankan beban kerja. Misalnya, Anda dapat menggabungkan beberapa kriteria pemilihan untuk mendapatkan kontrol yang lebih baik atas lokasi di mana Pod Anda berjalan. Saat menggunakan afinitas node untuk meminta Pod Spot, Anda dapat menentukan jenis afinitas node yang akan digunakan, sebagai berikut:

  • requiredDuringSchedulingIgnoredDuringExecution: Harus menggunakan Pod Spot.
  • preferredDuringSchedulingIgnoredDuringExecution: Gunakan Pod Spot atas dasar upaya terbaik.

Untuk menggunakan afinitas node guna require Pod Spot dalam Deployment, tambahkan aturan nodeAffinity berikut ke manifes Deployment Anda:

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

Meminta Pod Spot atas dasar upaya terbaik

Untuk menggunakan afinitas node guna meminta Pod Spot dengan upaya terbaik, gunakan preferredDuringSchedulingIgnoredDuringExecution. Saat Anda meminta Pod Spot berdasarkan pilihan, GKE akan menjadwalkan Pod berdasarkan urutan berikut:

  1. Node yang ada yang dapat menjalankan Pod Spot yang memiliki ketersediaan kapasitas yang dapat dialokasikan.
  2. Node standar yang ada dan memiliki kapasitas alokasi yang tersedia.
  3. Node baru yang dapat menjalankan Pod Spot, jika resource komputasi tersedia.
  4. Node standar baru.

Karena GKE lebih memilih node standar yang ada dan memiliki kapasitas yang dapat dialokasikan daripada membuat node baru untuk Pod Spot, Anda mungkin melihat lebih banyak Pod yang berjalan sebagai Pod standar daripada Pod Spot, sehingga Anda tidak bisa memanfaatkan sepenuhnya harga Pod Spot yang lebih rendah.

Menemukan dan menghapus Pod yang dihentikan

Selama penghentian Pod setelah selesai, kubelet menetapkan status Failed dan alasan Shutdown ke Pod yang dihentikan. Saat jumlah Pod yang dihentikan mencapai batas 1000, pembersihan sampah memori akan membersihkan Pod. Anda juga dapat menghapus Pod shutdown secara manual menggunakan perintah berikut:

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

Langkah selanjutnya