Pada artikel sebelumnya, kita telah membahas tentang DaemonSet yang memastikan Pod berjalan pada setiap node dalam klaster. Kali ini, kita akan membahas tentang Job, sebuah kontroler yang menjalankan Pod sampai tugasnya selesai dengan sukses.
Apa itu Job?
Job adalah kontroler di Kubernetes yang membuat satu atau lebih Pod dan memastikan bahwa sejumlah tertentu Pod berhasil menyelesaikan tugasnya. Berbeda dengan Deployment atau ReplicaSet yang dirancang untuk menjalankan aplikasi yang berjalan terus-menerus (long-running), Job dirancang untuk tugas yang memiliki titik akhir yang jelas, seperti batch processing, komputasi paralel, atau tugas pemeliharaan.
Ketika Pod yang dibuat oleh Job selesai menjalankan tugasnya, Job akan menandai tugas tersebut sebagai selesai. Ketika jumlah Pod yang berhasil menyelesaikan tugas mencapai jumlah yang ditentukan, Job dianggap selesai.
Kapan Menggunakan Job?
Job sangat berguna untuk kasus-kasus berikut:
- Batch Processing: Menjalankan tugas pemrosesan data batch seperti ETL (Extract, Transform, Load).
- Komputasi Paralel: Menjalankan tugas komputasi yang bisa diparalelkan.
- Migrasi Database: Menjalankan skrip migrasi database.
- Tugas Pemeliharaan: Menjalankan tugas pemeliharaan seperti backup atau pembersihan data.
- Pengujian: Menjalankan suite pengujian.
Membuat Job
Mari kita lihat contoh sederhana Job untuk menjalankan tugas batch:
apiVersion: batch/v1
kind: Job
metadata:
name: pi-calculator
spec:
template:
spec:
containers:
- name: pi
image: perl:5.34
command: ["perl", "-Mbignum=bpi", "-wle", "print bpi(2000)"]
restartPolicy: Never
backoffLimit: 4
Pada contoh di atas, kita membuat Job bernama pi-calculator yang akan menghitung nilai Pi hingga 2000 digit menggunakan Perl. Beberapa hal penting dalam konfigurasi Job:
restartPolicy: Harus diatur keNeveratauOnFailure. Tidak bisa diatur keAlwayskarena Job dirancang untuk tugas yang memiliki titik akhir.backoffLimit: Jumlah maksimum percobaan ulang jika Pod gagal. Default-nya adalah 6.
Pola Job
Kubernetes mendukung beberapa pola Job yang bisa digunakan sesuai kebutuhan:
1. Job Non-Paralel
Ini adalah pola paling sederhana di mana hanya satu Pod yang dibuat dan Job dianggap selesai ketika Pod tersebut selesai dengan sukses.
spec:
completions: 1
parallelism: 1
2. Job dengan Jumlah Penyelesaian Tetap
Dalam pola ini, Job akan membuat Pod secara berurutan atau paralel sampai jumlah Pod yang berhasil mencapai nilai completions.
spec:
completions: 5
parallelism: 2
Dengan konfigurasi di atas, Job akan membuat maksimal 2 Pod secara bersamaan dan akan terus membuat Pod baru sampai 5 Pod berhasil menyelesaikan tugasnya.
3. Job Paralel dengan Antrian Kerja
Dalam pola ini, Job membuat beberapa Pod yang bekerja secara independen untuk memproses item dari antrian kerja.
spec:
parallelism: 3
Dengan konfigurasi di atas, Job akan membuat 3 Pod secara bersamaan. Pod-Pod tersebut akan mengambil item dari antrian kerja (misalnya dari database atau message queue) dan memprosesnya.
Parameter Job
Berikut adalah beberapa parameter penting dalam konfigurasi Job:
1. completions
Jumlah Pod yang harus berhasil menyelesaikan tugasnya agar Job dianggap selesai. Default-nya adalah 1.
spec:
completions: 5
2. parallelism
Jumlah maksimum Pod yang bisa berjalan secara bersamaan. Default-nya adalah 1.
spec:
parallelism: 3
3. backoffLimit
Jumlah maksimum percobaan ulang jika Pod gagal. Default-nya adalah 6.
spec:
backoffLimit: 4
4. activeDeadlineSeconds
Batas waktu maksimum (dalam detik) untuk Job. Jika Job berjalan lebih lama dari waktu ini, semua Pod akan dihentikan dan Job dianggap gagal.
spec:
activeDeadlineSeconds: 100
5. ttlSecondsAfterFinished
Waktu (dalam detik) setelah Job selesai sebelum Job dihapus secara otomatis. Fitur ini berguna untuk membersihkan Job yang sudah selesai.
spec:
ttlSecondsAfterFinished: 100
Contoh Lengkap: Job Paralel
Mari kita lihat contoh lengkap Job paralel untuk memproses data:
apiVersion: batch/v1
kind: Job
metadata:
name: data-processor
spec:
completions: 10
parallelism: 3
backoffLimit: 4
template:
spec:
containers:
- name: processor
image: data-processor:v1
env:
- name: BATCH_SIZE
value: "100"
- name: REDIS_HOST
value: "redis-service"
resources:
requests:
memory: "128Mi"
cpu: "100m"
limits:
memory: "256Mi"
cpu: "200m"
restartPolicy: OnFailure
Pada contoh di atas, kita membuat Job bernama data-processor yang akan memproses data dalam batch. Job akan membuat maksimal 3 Pod secara bersamaan dan akan terus membuat Pod baru sampai 10 Pod berhasil menyelesaikan tugasnya.
Menangani Kegagalan
Job menyediakan beberapa mekanisme untuk menangani kegagalan:
1. restartPolicy
Kebijakan restart untuk Pod. Bisa diatur ke Never atau OnFailure.
Never: Pod yang gagal tidak akan di-restart. Job akan membuat Pod baru sebagai gantinya.OnFailure: Pod yang gagal akan di-restart di node yang sama.
spec:
template:
spec:
restartPolicy: OnFailure
2. backoffLimit
Jumlah maksimum percobaan ulang jika Pod gagal. Setelah mencapai batas ini, Job dianggap gagal.
spec:
backoffLimit: 4
3. activeDeadlineSeconds
Batas waktu maksimum untuk Job. Jika Job berjalan lebih lama dari waktu ini, Job dianggap gagal.
spec:
activeDeadlineSeconds: 100
Contoh Kasus: Migrasi Database
Mari kita lihat contoh Job untuk menjalankan migrasi database:
apiVersion: batch/v1
kind: Job
metadata:
name: db-migration
spec:
template:
spec:
containers:
- name: migration
image: flyway:latest
env:
- name: FLYWAY_URL
valueFrom:
secretKeyRef:
name: db-secret
key: url
- name: FLYWAY_USER
valueFrom:
secretKeyRef:
name: db-secret
key: username
- name: FLYWAY_PASSWORD
valueFrom:
secretKeyRef:
name: db-secret
key: password
command: ["flyway", "migrate"]
restartPolicy: OnFailure
backoffLimit: 2
Pada contoh di atas, kita membuat Job bernama db-migration yang akan menjalankan migrasi database menggunakan Flyway. Job akan mencoba ulang maksimal 2 kali jika migrasi gagal.
Membersihkan Job yang Sudah Selesai
Job yang sudah selesai tidak akan dihapus secara otomatis. Ini berguna untuk melihat log dan status Job setelah selesai. Namun, jika kita ingin Job dihapus secara otomatis setelah selesai, kita bisa menggunakan parameter ttlSecondsAfterFinished:
spec:
ttlSecondsAfterFinished: 100
Dengan konfigurasi di atas, Job akan dihapus secara otomatis 100 detik setelah selesai.
Kesimpulan
Job adalah kontroler yang sangat berguna untuk menjalankan tugas batch atau tugas yang memiliki titik akhir yang jelas di Kubernetes. Dengan Job, kita bisa memastikan bahwa tugas tersebut berjalan sampai selesai dengan sukses, dengan mekanisme retry yang otomatis jika terjadi kegagalan.
Pada artikel berikutnya, kita akan membahas tentang CronJob - kontroler yang mengatur Job untuk berjalan secara terjadwal. Jangan lupa untuk mencoba contoh-contoh di atas di klaster Minikube Anda!
Cappy Hoding! ๐๐พ