• Run workload until N successful completions; Pod stops when work finishes
  • Completed Jobs/Pods not auto-cleaned: delete manually or use ttlSecondsAfterFinished
  • restartPolicy: only OnFailure or Never (not Always): required for Jobs

Job YAML

apiVersion: batch/v1
kind: Job
metadata:
  name: db-migrate
spec:
  completions: 1
  parallelism: 1
  backoffLimit: 3
  ttlSecondsAfterFinished: 100
  template:
    spec:
      restartPolicy: Never   # REQUIRED
      containers:
      - name: migrate
        image: myapp:1.0
        command: ["python", "manage.py", "migrate"]

Completions & parallelism

Job typecompletionsparallelism
Non-parallel11
Parallel fixed count>=1>=1
Worker queueunset>=1

Indexed Job

spec:
  completions: 5
  parallelism: 2
  completionMode: Indexed
  backoffLimitPerIndex: 1   # requires completionMode: Indexed
  template:
    spec:
      restartPolicy: Never
      containers:
      - name: worker
        image: busybox
        command: ["sh", "-c", "echo Processing shard $JOB_COMPLETION_INDEX"]

Restart policy

PolicyOn failure
OnFailureRestart container in same Pod
NeverStart new Pod
  • backoffLimit: retries before marking Job failed (default 6)
  • activeDeadlineSeconds: deadline; all running Pods terminated after

Imperative commands

kubectl create job myjob --image=busybox -- echo hello
kubectl get pods --watch -l job-name=myjob
kubectl get jobs                     # watch COMPLETIONS (1/1)
kubectl logs <pod-from-job>