Jobs and CronJobs in Kubernetes
/ 3 min read
kubernetes , k8s , jobs , cronjobs , devops , cloud-native , containers , batch , series:kubernetes:8
Understanding Jobs and CronJobs
Jobs create one or more Pods to perform a specific task and ensure they successfully complete. CronJobs create Jobs on a schedule.
Jobs
Basic Job Configuration
apiVersion: batch/v1kind: Jobmetadata: name: pispec: template: spec: containers: - name: pi image: perl:5.34.0 command: ["perl", "-Mbignum=bpi", "-wle", "print bpi(2000)"] restartPolicy: Never backoffLimit: 4Job Patterns
1. Non-Parallel Jobs
apiVersion: batch/v1kind: Jobmetadata: name: single-taskspec: template: spec: containers: - name: worker image: busybox command: ["echo", "Single task completed"] restartPolicy: Never2. Parallel Jobs with Fixed Completion Count
apiVersion: batch/v1kind: Jobmetadata: name: parallel-fixedspec: completions: 5 parallelism: 2 template: spec: containers: - name: worker image: busybox command: ["echo", "Task completed"] restartPolicy: Never3. Parallel Jobs with Work Queue
apiVersion: batch/v1kind: Jobmetadata: name: job-wqspec: parallelism: 2 template: spec: containers: - name: worker image: worker-image env: - name: REDIS_HOST value: redis-service restartPolicy: NeverCronJobs
Basic CronJob Configuration
apiVersion: batch/v1kind: CronJobmetadata: name: hellospec: schedule: "*/1 * * * *" jobTemplate: spec: template: spec: containers: - name: hello image: busybox:1.28 command: - /bin/sh - -c - date; echo Hello from the Kubernetes cluster restartPolicy: OnFailureCommon Use Cases
1. Database Backup
apiVersion: batch/v1kind: CronJobmetadata: name: db-backupspec: schedule: "0 2 * * *" jobTemplate: spec: template: spec: containers: - name: backup image: mysql:8.0 command: - /bin/sh - -c - mysqldump -h mysql-service -u root -p$MYSQL_ROOT_PASSWORD --all-databases > /backup/dump.sql env: - name: MYSQL_ROOT_PASSWORD valueFrom: secretKeyRef: name: mysql-secret key: password volumeMounts: - name: backup-volume mountPath: /backup volumes: - name: backup-volume persistentVolumeClaim: claimName: backup-pvc restartPolicy: OnFailure2. Log Rotation
apiVersion: batch/v1kind: CronJobmetadata: name: log-rotationspec: schedule: "0 0 * * *" jobTemplate: spec: template: spec: containers: - name: log-cleaner image: busybox command: - /bin/sh - -c - find /var/log -type f -mtime +7 -delete volumeMounts: - name: log-volume mountPath: /var/log volumes: - name: log-volume hostPath: path: /var/log restartPolicy: OnFailureJob Control and Management
Job Completion Modes
spec: completionMode: Indexed completions: 5 parallelism: 3TTL Controller for Finished Jobs
spec: ttlSecondsAfterFinished: 100Handling Job Failures
spec: backoffLimit: 6 activeDeadlineSeconds: 600Best Practices
1. Resource Management
spec: template: spec: containers: - name: job-task resources: requests: memory: "64Mi" cpu: "250m" limits: memory: "128Mi" cpu: "500m"2. Pod Security
spec: template: spec: securityContext: runAsNonRoot: true runAsUser: 1000 containers: - name: job-task securityContext: allowPrivilegeEscalation: false3. Error Handling
spec: backoffLimit: 4 template: spec: containers: - name: job-task command: - /bin/bash - -c - | if ! my-task; then echo "Task failed" exit 1 fiAdvanced Configurations
Suspending CronJobs
spec: suspend: trueConcurrency Policy
spec: concurrencyPolicy: Forbid # Allow, Forbid, or ReplaceHistorical Limit
spec: successfulJobsHistoryLimit: 3 failedJobsHistoryLimit: 1Monitoring and Debugging
Job Status Checking
kubectl get jobskubectl get cronjobskubectl describe job <job-name>kubectl logs job/<job-name>Common Issues
-
Job Never Completes
- Check resource constraints
- Verify logic completion
- Review logs
- Check node capacity
-
CronJob Not Running
- Verify schedule format
- Check concurrency policy
- Review suspend status
- Check previous job status
Example Scenarios
1. Data Processing Job
apiVersion: batch/v1kind: Jobmetadata: name: data-processorspec: parallelism: 3 completions: 10 template: spec: containers: - name: processor image: data-processor:v1 env: - name: BATCH_SIZE value: "1000" - name: INPUT_PATH value: "/data/input" volumeMounts: - name: data-volume mountPath: /data volumes: - name: data-volume persistentVolumeClaim: claimName: data-pvc restartPolicy: Never2. Scheduled Report Generation
apiVersion: batch/v1kind: CronJobmetadata: name: report-generatorspec: schedule: "0 6 * * *" jobTemplate: spec: template: spec: containers: - name: reporter image: report-generator:v1 env: - name: REPORT_TYPE value: "daily" - name: OUTPUT_FORMAT value: "pdf" restartPolicy: OnFailureSeries Navigation
Conclusion
Jobs and CronJobs are essential for running batch processes and scheduled tasks in Kubernetes. Understanding their configurations and best practices helps in implementing reliable task execution in your cluster.