• 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

PolicyBehaviour
Allow (default)Allows concurrent Jobs
ForbidSkips new run if previous still running
ReplaceReplaces current run with new one

Key fields

FieldObject
completions, parallelism, backoffLimit, ttlSecondsAfterFinishedJob
schedule, jobTemplate, successfulJobsHistoryLimit, failedJobsHistoryLimitCronJob

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