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 menit
  • 0 0 * * * - Setiap hari pada tengah malam
  • 0 0 * * 0 - Setiap hari Minggu pada tengah malam
  • 0 0 1 * * - Setiap awal bulan pada tengah malam
  • 0 9-17 * * 1-5 - Setiap jam kerja (9:00 - 17:00) pada hari kerja (Senin - Jumat)

Kubernetes juga mendukung beberapa format khusus:

  • @yearly atau @annually - Sama dengan 0 0 1 1 * (Setiap 1 Januari pada tengah malam)
  • @monthly - Sama dengan 0 0 1 * * (Setiap awal bulan pada tengah malam)
  • @weekly - Sama dengan 0 0 * * 0 (Setiap hari Minggu pada tengah malam)
  • @daily atau @midnight - Sama dengan 0 0 * * * (Setiap hari pada tengah malam)
  • @hourly - Sama dengan 0 * * * * (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 bersamaan
  • Forbid: Tidak memungkinkan Job berjalan bersamaan, Job berikutnya akan dilewati jika Job sebelumnya masih berjalan
  • Replace: 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:

  1. Backup berkala: Melakukan backup database atau file secara berkala
  2. Pembuatan laporan: Menghasilkan laporan harian, mingguan, atau bulanan
  3. Pengiriman email: Mengirim email notifikasi atau newsletter secara berkala
  4. Tugas pembersihan: Membersihkan data lama atau sementara
  5. Pemrosesan data berkala: Mengolah data yang masuk secara berkala
  6. Sinkronisasi data: Menyinkronkan data antar sistem secara berkala
  7. Pemeriksaan kesehatan: Memeriksa kesehatan sistem secara berkala

Batasan dan Praktik Terbaik

Saat menggunakan CronJob, ada beberapa batasan dan praktik terbaik yang perlu diperhatikan:

  1. Jangan bergantung pada ketepatan waktu: CronJob tidak menjamin Job akan dimulai tepat pada waktu yang ditentukan. Gunakan startingDeadlineSeconds untuk menentukan batas waktu maksimum.

  2. Tangani Job yang berjalan lama: Gunakan concurrencyPolicy yang sesuai untuk menangani Job yang berjalan lama.

  3. Batasi histori Job: Gunakan successfulJobsHistoryLimit dan failedJobsHistoryLimit untuk membatasi jumlah Job yang disimpan dalam histori.

  4. Gunakan timezone yang tepat: CronJob menggunakan timezone UTC secara default. Pastikan jadwal cron disesuaikan dengan timezone yang diinginkan.

  5. Tangani kegagalan: Gunakan restartPolicy yang sesuai untuk menangani kegagalan Pod.

  6. 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! 🖖🏾