Pada artikel sebelumnya, kita telah membahas tentang Job yang berjalan sampai fungsi tugasnya selesai. Job sangat berguna untuk tugas-tugas yang hanya perlu dijalankan sekali. Namun, bagaimana jika kita ingin menjalankan tugas tersebut secara berkala, misalnya setiap jam atau setiap hari? Di sinilah peran CronJob menjadi sangat penting.
Apa itu CronJob?
CronJob adalah resource Kubernetes yang membuat Job berdasarkan jadwal yang ditentukan. CronJob mengikuti format penjadwalan cron yang umum digunakan di sistem Unix dan Linux. Dengan CronJob, kita dapat menjalankan tugas secara berkala seperti backup, pembuatan laporan, pengiriman email, atau tugas pemeliharaan lainnya.
Bayangkan CronJob sebagai pengatur alarm yang akan memicu Job pada waktu-waktu tertentu. Setiap kali alarm berbunyi, sebuah Job baru akan dibuat dan dijalankan.
Format Jadwal Cron
Format jadwal cron terdiri dari lima bidang yang dipisahkan oleh spasi:
┌───────────── menit (0 - 59)
│ ┌───────────── jam (0 - 23)
│ │ ┌───────────── hari dalam sebulan (1 - 31)
│ │ │ ┌───────────── bulan (1 - 12)
│ │ │ │ ┌───────────── hari dalam seminggu (0 - 6) (Minggu = 0 atau 7)
│ │ │ │ │
│ │ │ │ │
* * * * *
Beberapa contoh jadwal cron:
0 * * * *- Setiap jam tepat (jam 1:00, 2:00, dst)*/15 * * * *- Setiap 15 menit0 0 * * *- Setiap hari pada tengah malam0 0 * * 0- Setiap hari Minggu pada tengah malam0 0 1 * *- Setiap awal bulan pada tengah malam0 9-17 * * 1-5- Setiap jam kerja (9:00 - 17:00) pada hari kerja (Senin - Jumat)
Kubernetes juga mendukung beberapa format khusus:
@yearlyatau@annually- Sama dengan0 0 1 1 *(Setiap 1 Januari pada tengah malam)@monthly- Sama dengan0 0 1 * *(Setiap awal bulan pada tengah malam)@weekly- Sama dengan0 0 * * 0(Setiap hari Minggu pada tengah malam)@dailyatau@midnight- Sama dengan0 0 * * *(Setiap hari pada tengah malam)@hourly- Sama dengan0 * * * *(Setiap jam tepat)
Membuat CronJob
Mari kita lihat contoh sederhana dari CronJob:
apiVersion: batch/v1
kind: CronJob
metadata:
name: hello
spec:
schedule: "*/1 * * * *" # Setiap menit
jobTemplate:
spec:
template:
spec:
containers:
- name: hello
image: busybox
command:
- /bin/sh
- -c
- date; echo Hello from the Kubernetes cluster
restartPolicy: OnFailure
Pada contoh di atas, kita membuat CronJob bernama hello yang akan menjalankan Job setiap menit. Job tersebut akan membuat Pod dengan container yang menjalankan perintah untuk menampilkan tanggal dan pesan.
Parameter Penting CronJob
CronJob memiliki beberapa parameter penting yang perlu diperhatikan:
1. schedule
Parameter ini menentukan kapan Job akan dijalankan menggunakan format cron. Ini adalah parameter wajib.
2. startingDeadlineSeconds
Parameter ini menentukan batas waktu maksimum (dalam detik) yang diizinkan untuk memulai Job jika jadwal terlewatkan. Jika Job tidak dapat dimulai dalam batas waktu ini, maka akan dianggap sebagai kegagalan.
spec:
schedule: "*/1 * * * *"
startingDeadlineSeconds: 200
3. concurrencyPolicy
Parameter ini menentukan bagaimana CronJob menangani Job yang berjalan bersamaan:
Allow(default): Memungkinkan Job berjalan bersamaanForbid: Tidak memungkinkan Job berjalan bersamaan, Job berikutnya akan dilewati jika Job sebelumnya masih berjalanReplace: Job yang sedang berjalan akan digantikan oleh Job baru
spec:
schedule: "*/1 * * * *"
concurrencyPolicy: Forbid
4. successfulJobsHistoryLimit dan failedJobsHistoryLimit
Parameter ini menentukan berapa banyak Job yang berhasil atau gagal yang akan disimpan dalam histori.
spec:
schedule: "*/1 * * * *"
successfulJobsHistoryLimit: 3
failedJobsHistoryLimit: 1
5. suspend
Parameter ini menentukan apakah CronJob akan ditangguhkan. Jika true, tidak ada Job baru yang akan dibuat.
spec:
schedule: "*/1 * * * *"
suspend: true
Contoh Lengkap: Backup Database
Mari kita lihat contoh yang lebih praktis: CronJob untuk melakukan backup database PostgreSQL setiap hari pada tengah malam:
apiVersion: batch/v1
kind: CronJob
metadata:
name: database-backup
spec:
schedule: "0 0 * * *" # Setiap hari pada tengah malam
concurrencyPolicy: Forbid
successfulJobsHistoryLimit: 7
failedJobsHistoryLimit: 3
jobTemplate:
spec:
template:
spec:
containers:
- name: backup
image: postgres:13
command:
- /bin/sh
- -c
- |
pg_dump -h ${DB_HOST} -U ${DB_USER} -d ${DB_NAME} -f /backup/db-$(date +%Y%m%d).sql
echo "Backup completed at $(date)"
env:
- name: DB_HOST
value: "postgres-service"
- name: DB_USER
valueFrom:
secretKeyRef:
name: db-credentials
key: username
- name: DB_PASSWORD
valueFrom:
secretKeyRef:
name: db-credentials
key: password
- name: DB_NAME
value: "myapp"
- name: PGPASSWORD
valueFrom:
secretKeyRef:
name: db-credentials
key: password
volumeMounts:
- name: backup-volume
mountPath: /backup
volumes:
- name: backup-volume
persistentVolumeClaim:
claimName: backup-pvc
restartPolicy: OnFailure
Pada contoh di atas, kita membuat CronJob yang akan menjalankan backup database PostgreSQL setiap hari pada tengah malam. Job tersebut akan membuat Pod dengan container yang menjalankan perintah pg_dump untuk melakukan backup database. Hasil backup akan disimpan di volume persisten.
Kasus Penggunaan CronJob
CronJob sangat berguna untuk berbagai skenario, seperti:
- Backup berkala: Melakukan backup database atau file secara berkala
- Pembuatan laporan: Menghasilkan laporan harian, mingguan, atau bulanan
- Pengiriman email: Mengirim email notifikasi atau newsletter secara berkala
- Tugas pembersihan: Membersihkan data lama atau sementara
- Pemrosesan data berkala: Mengolah data yang masuk secara berkala
- Sinkronisasi data: Menyinkronkan data antar sistem secara berkala
- Pemeriksaan kesehatan: Memeriksa kesehatan sistem secara berkala
Batasan dan Praktik Terbaik
Saat menggunakan CronJob, ada beberapa batasan dan praktik terbaik yang perlu diperhatikan:
-
Jangan bergantung pada ketepatan waktu: CronJob tidak menjamin Job akan dimulai tepat pada waktu yang ditentukan. Gunakan
startingDeadlineSecondsuntuk menentukan batas waktu maksimum. -
Tangani Job yang berjalan lama: Gunakan
concurrencyPolicyyang sesuai untuk menangani Job yang berjalan lama. -
Batasi histori Job: Gunakan
successfulJobsHistoryLimitdanfailedJobsHistoryLimituntuk membatasi jumlah Job yang disimpan dalam histori. -
Gunakan timezone yang tepat: CronJob menggunakan timezone UTC secara default. Pastikan jadwal cron disesuaikan dengan timezone yang diinginkan.
-
Tangani kegagalan: Gunakan
restartPolicyyang sesuai untuk menangani kegagalan Pod. -
Gunakan resource limits: Tetapkan batas sumber daya untuk Job untuk mencegah penggunaan sumber daya yang berlebihan.
Memeriksa Status CronJob
Kita dapat memeriksa status CronJob dengan perintah:
kubectl get cronjobs
Output akan terlihat seperti ini:
NAME SCHEDULE SUSPEND ACTIVE LAST SCHEDULE AGE
database-backup 0 0 * * * False 0 2d 10d
hello */1 * * * * False 0 25s 5d
Untuk melihat Job yang dibuat oleh CronJob:
kubectl get jobs
Dan untuk melihat Pod yang dibuat oleh Job:
kubectl get pods
Kesimpulan
CronJob adalah resource Kubernetes yang sangat berguna untuk menjalankan tugas secara berkala. Dengan CronJob, kita dapat mengotomatisasi berbagai tugas seperti backup, pembuatan laporan, pengiriman email, dan tugas pemeliharaan lainnya.
Pada artikel berikutnya, kita akan membahas tentang HPA (Horizontal Pod Autoscaler) - resource Kubernetes yang dapat menambah atau mengurangi jumlah replika Pod secara otomatis berdasarkan penggunaan sumber daya. Jangan lupa untuk mencoba contoh-contoh di atas di klaster Minikube Anda!
Cappy Hoding! 🖖🏾