Job batch dan workload toleran gangguan dapat menjadi mahal jika dijalankan terus-menerus pada instans sesuai permintaan (on-demand). Instans preemptible memungkinkan Anda menjalankan workload tersebut pada Pod berbasis Elastic Container Instance (ECI) dengan biaya jauh lebih rendah, sementara Kubernetes Job controller secara otomatis menggantikan Pod apa pun yang direklaim sebelum job selesai.
Workload yang sesuai
Gunakan instans preemptible untuk workload yang dapat mentoleransi gangguan:
| Sesuai | Tidak sesuai |
|---|---|
| Job batch dan tugas satu kali jalan | Aplikasi stateful |
| Aplikasi stateless dan toleran gangguan, seperti layanan web yang dapat diskalakan | Layanan berjalan lama yang tidak dapat menangani gangguan di tengah tugas |
| Tugas komputasi berumur pendek yang dapat menerima restart | Workload yang waktu startup atau shutdown-nya melebihi jendela pra-rilis 5 menit |
Cara kerja
Saat membuat instans preemptible, Anda menentukan kebijakan penawaran (bid policy). Instans dibuat ketika harga penawaran Anda melebihi harga pasar real-time dan inventaris resource untuk tipe instans tersebut mencukupi.
Periode perlindungan: Setelah dibuat, instans berjalan selama periode perlindungan 1 jam (default), ditagih berdasarkan harga pasar saat pembelian.
Setelah periode perlindungan: Sistem memeriksa harga pasar dan inventaris setiap 5 menit. Jika harga pasar melebihi harga penawaran Anda atau inventaris habis, instans akan dirilis. Event SpotToBeReleased dikirim ke daftar event Kubernetes sekitar 5 menit sebelum rilis — gunakan jendela ini untuk menghentikan lalu lintas masuk atau membuat checkpoint workload Anda.
Kontinuitas job: Ketika Pod dirilis sebelum job selesai, Kubernetes Job controller secara otomatis membuat Pod baru untuk melanjutkan job tersebut. Pod asli tetap dipertahankan dengan status BidFailed.
Batasan
Secara default, periode perlindungan adalah 1 jam.
Setelah periode perlindungan, ketersediaan instans bergantung pada harga pasar dan inventaris resource — tidak ada jaminan uptime.
Event
SpotToBeReleasedtiba sekitar 5 menit sebelum rilis. Jika workload Anda membutuhkan waktu lebih dari 5 menit untuk shutdown secara bersih, instans preemptible mungkin tidak cocok.
Prasyarat
Sebelum memulai, pastikan Anda telah memiliki:
Kluster ACK Serverless
kubectlyang telah dikonfigurasi untuk terhubung ke kluster
Jalankan job pada instans preemptible
Langkah 1: Buat manifes job
Buat file bernama spot_job.yaml dengan konten berikut:
apiVersion: batch/v1
kind: Job
metadata:
name: pi
spec:
template:
metadata:
annotations:
k8s.aliyun.com/eci-use-specs: ecs.c5.large,2-4Gi # Multiple instance types improve creation success rate
k8s.aliyun.com/eci-spot-strategy: SpotAsPriceGo # Use the real-time market price as the bid price
spec:
containers:
- name: pi
image: registry-vpc.cn-beijing.aliyuncs.com/ostest/perl
command: ["perl", "-Mbignum=bpi", "-wle", "print bpi(2000)"]
restartPolicy: NeverAnotasi k8s.aliyun.com/eci-spot-strategy menetapkan kebijakan penawaran:
| Nilai | Deskripsi |
|---|---|
SpotAsPriceGo | Secara otomatis menggunakan harga pasar saat pembelian sebagai harga penawaran. |
SpotWithPriceLimit | Menggunakan harga maksimum per jam yang Anda tetapkan. Tambahkan anotasi k8s.aliyun.com/eci-spot-price-limit untuk menentukan harga tersebut. |
Anotasi k8s.aliyun.com/eci-use-specs mencantumkan beberapa tipe instans. Menentukan beberapa tipe meningkatkan kemungkinan instans preemptible berhasil dibuat saat inventaris salah satu tipe sedang rendah.
Langkah 2: Buat job
kubectl create -f spot_job.yamlLangkah 3: Pantau status Pod
kubectl get podPod melewati status berikut:
Running — job sedang berjalan:
NAME READY STATUS RESTARTS AGE
pi-frmr8 1/1 Running 0 35sCompleted — job berhasil selesai:
NAME READY STATUS RESTARTS AGE
pi-frmr8 0/1 Completed 0 2hBidFailed — Pod dirilis sebelum job selesai. Job controller telah membuat Pod baru (pi-kp5zx) untuk melanjutkan:
NAME READY STATUS RESTARTS AGE
pi-frmr8 1/1 BidFailed 0 4h53m
pi-kp5zx 1/1 Running 0 3h45mEvent SpotToBeReleased dikeluarkan sekitar 5 menit sebelum Pod memasuki status BidFailed. Untuk melihat event tersebut, jalankan kubectl get events. Untuk detail penanganan event pra-rilis, lihat Release of preemptible instances.
Langkah selanjutnya
Create a preemptible elastic container instance — konfigurasikan kebijakan penawaran lanjutan dan strategi pemilihan tipe instans.