- CronJob → creates Job → creates Pod on schedule
spec.schedule: cron expression (* * * * *= every minute)spec.jobTemplate: Job template (not Pod directly)
CronJob YAML
apiVersion: batch/v1
kind: CronJob
metadata:
name: backup
spec:
schedule: "0 2 * * *" # 2am every day
concurrencyPolicy: Forbid
successfulJobsHistoryLimit: 3
failedJobsHistoryLimit: 1
startingDeadlineSeconds: 200
jobTemplate:
spec:
backoffLimit: 3
completions: 3
parallelism: 1
activeDeadlineSeconds: 300
template:
spec:
restartPolicy: OnFailure
containers:
- name: backup
image: backup-tool:1.0
args: ["/bin/sh", "-c", "echo $(date)"]
Concurrency policy
| Policy | Behaviour |
|---|---|
Allow (default) | Allows concurrent Jobs |
Forbid | Skips new run if previous still running |
Replace | Replaces current run with new one |
Key fields
| Field | Object |
|---|---|
completions, parallelism, backoffLimit, ttlSecondsAfterFinished | Job |
schedule, jobTemplate, successfulJobsHistoryLimit, failedJobsHistoryLimit | CronJob |
Imperative commands
kubectl create cronjob mycron --image=busybox --schedule='*/5 * * * *' -- date
kubectl create job manual-run --from=cronjob/backup
kubectl get cronjobs
kubectl get jobs,po
Exam gotchas
- Cron syntax: minute hour day-of-month month day-of-week;
*/5 * * * *= every 5 minutes restartPolicy: Never→ new pod on failure;OnFailure→ restarts same pod- Manual trigger:
kubectl create job manual --from=cronjob/<name>
Practice scenario: Jobs and CronJobs
Tasks
- Job
data-export: busybox,echo exported, 3 completions, 2 parallel,backoffLimit: 2 - CronJob
nightly-report: same, midnight daily,concurrencyPolicy: Forbid - Manually trigger the CronJob once and verify
Solution
cat <<EOF | kubectl apply -f -
apiVersion: batch/v1
kind: Job
metadata:
name: data-export
spec:
completions: 3
parallelism: 2
backoffLimit: 2
template:
spec:
restartPolicy: Never
containers:
- name: export
image: busybox
command: ["echo", "exported"]
EOF
kubectl create cronjob nightly-report --image=busybox --schedule='0 0 * * *' -- echo exported
kubectl patch cronjob nightly-report -p '{"spec":{"concurrencyPolicy":"Forbid"}}'
kubectl create job manual-trigger --from=cronjob/nightly-report
kubectl get jobs,pods