Menjalankan crond di dalam container adalah anti-pattern yang lahir dari kebiasaan server tradisional. Episode ini menjelaskan mengapa pendekatan itu bermasalah, cara menggantinya dengan entrypoint loop sederhana atau Kubernetes CronJob batch/v1, serta anatomi schedule, concurrencyPolicy, dan TTL untuk menghindari job menumpuk.

Di episode 14 kita membuat script-nya aman. Sekarang kita pindah konteks: di dalam container dan Kubernetes.
Banyak tim, ketika meng-containersisasi aplikasi, membawa semua kebiasaan lama — termasuk menjalankan crond di dalam image. Ini bekerja, tetapi menciptakan masalah yang tidak ada di mesin fisik: container yang "abadi" justru kontradiktif dengan filosofi container, dan cron di dalam container mati begitu container di-restart. Episode ini menjelaskan mengapa, dan apa penggantinya.
Container idealnya menjalankan satu proses utama (PID 1). Ketika kalian menjalankan crond + aplikasi di image yang sama, kalian butuh process supervisor, konfigurasi sinyal yang rumit, dan jadwal yang mati bersama container:
Aturan praktis modern: cron bukan tanggung jawab container; itu tanggung jawab orkestrator. Dua pengganti resmi:
Untuk image yang menjalankan satu job berulang, loop dengan sleep di dalam entrypoint bisa menggantikan cron:
#!/bin/sh
set -e
while true; do
/app/run-task.sh
sleep 3600 # ekivalen jadwal setiap jam
doneDengan pola ini:
Kekurangannya: tidak ada offset menit presisi tanpa menambahkan logika sleep. Untuk kebutuhan kompleks, langsung gunakan K8s CronJob.
Note
Jika tetap ingin cron di dalam container (misal image berisi banyak jadwal), pertimbangkan supercronic atau tool serupa yang memakai crontab biasa — tetapi jalankan satu proses per container, dan pastikan init/signal handling benar. Namun untuk sebagian besar kasus, K8s CronJob jauh lebih baik.
Kubernetes menyediakan CronJob (API stabil batch/v1) yang menjadwalkan pod secara periodik — sintaks schedule-nya persis crontab.
apiVersion: batch/v1
kind: CronJob
metadata:
name: backup
spec:
schedule: "30 2 * * *"
concurrencyPolicy: Forbid
jobTemplate:
spec:
template:
spec:
restartPolicy: OnFailure
containers:
- name: backup
image: myorg/backup-tool:1.4
args: ["backup", "run"]schedule — jadwal crontab lima field (zona waktu cluster/kube-controller-manager).concurrencyPolicy — apa yang terjadi jika dua jadwal bertemu: Allow, Forbid, atau Replace. Forbid menggantikan flock di dunia K8s (episode 9).restartPolicy — pod dalam job harus OnFailure atau Never.Setiap eksekusi CronJob membuat Job dan Pod. Tanpa pembersihan, mereka menumpuk selamanya:
spec:
successfulJobsHistoryLimit: 3
failedJobsHistoryLimit: 1
jobTemplate:
spec:
ttlSecondsAfterFinished: 3600successfulJobsHistoryLimit / failedJobsHistoryLimit — berapa banyak Job yang dipertahankan.ttlSecondsAfterFinished — Job dihapus otomatis beberapa saat setelah selesai.| Aspek | Cron host | K8s CronJob |
|---|---|---|
| Penyebaran | Per-host | Seluruh cluster |
| Fault tolerance | Bergantung host | Pod di-restart, jadwal persisten |
| Isolasi | User/root | Namespace/SA/RBAC |
| Concurrency | flock manual | concurrencyPolicy |
| Pembersihan | Manual | History limits + TTL |
| Secrets | Env file/Vault | Secrets/K8s + Vault |
Warning
Jangan jalankan beberapa crond di beberapa instance container yang mengeksekusi job yang sama — itu resep duplikasi dan korupsi data. Di K8s, concurrencyPolicy: Forbid + history limit adalah padanan modern dari flock + retention yang kita bangun di episode 9.
kubectl apply -f backup-cronjob.yaml
kubectl get cronjob backup
kubectl get jobs -l job-name=backup
kubectl logs job/backup-xxxxxxxx --tail=20Untuk menguji tanpa menunggu jadwal, kita bahas cara memicu manual dan fitur lanjutan (startingDeadlineSeconds, suspend, parallelism) di episode 19.
Inti yang harus dibawa pulang:
crond di dalam container adalah anti-pattern: multi-process, state hilang, job duplikat.batch/v1 adalah pengganti modern untuk workload cluster.concurrencyPolicy: Forbid menggantikan flock; history limit + TTL mencegah penumpukan.Di episode 16 selanjutnya kita akan membahas timezone dan DST handling — CRON_TZ=Asia/Jakarta di crontab, pengaruh Daylight Saving Time pada job harian, dan praktik terbaik memakai UTC untuk infrastruktur!