Kubernetes Jobs 批处理任务
Kubernetes Jobs 批处理任务
什么是 Job
Job 是 Kubernetes 中用于运行一次性任务的控制器。它会创建一个或多个 Pod,确保指定数量的 Pod 成功完成任务后终止。适用于批处理、数据迁移、备份等场景。
Job 的特点
- 运行一次性任务
- 确保任务成功完成
- 支持并行和串行执行
- 自动清理已完成的 Pod
创建 Job
基本 Job
apiVersion: batch/v1
kind: Job
metadata:
name: data-migration
spec:
template:
spec:
containers:
- name: migration
image: my-app/migration:latest
command: ["python", "migrate.py"]
restartPolicy: Never
backoffLimit: 3
并行 Job
apiVersion: batch/v1
kind: Job
metadata:
name: parallel-job
spec:
parallelism: 5 # 并行运行 5 个 Pod
completions: 10 # 需要 10 个 Pod 完成
template:
spec:
containers:
- name: worker
image: my-app/worker:latest
command: ["python", "process.py"]
restartPolicy: Never
backoffLimit: 2
串行 Job
apiVersion: batch/v1
kind: Job
metadata:
name: sequential-job
spec:
completions: 5 # 需要 5 次成功
parallelism: 1 # 每次只运行 1 个 Pod
template:
spec:
containers:
- name: worker
image: my-app/worker:latest
restartPolicy: Never
部署 Job
kubectl apply -f job.yaml
# 查看 Job 状态
kubectl get jobs
kubectl describe job data-migration
# 查看 Pod 状态
kubectl get pods -l job-name=data-migration
Job 配置参数
backoffLimit
任务失败后的重试次数:
spec:
backoffLimit: 5 # 最多重试 5 次
activeDeadlineSeconds
任务超时时间:
spec:
activeDeadlineSeconds: 3600 # 1 小时超时
ttlSecondsAfterFinished
完成后自动清理时间:
spec:
ttlSecondsAfterFinished: 86400 # 24 小时后清理
manualSelector
手动指定 Pod 选择器:
spec:
manualSelector: true
selector:
matchLabels:
job: my-job
CronJob 定时任务
基本 CronJob
apiVersion: batch/v1
kind: CronJob
metadata:
name: daily-backup
spec:
schedule: "0 2 * * *" # 每天凌晨 2 点
jobTemplate:
spec:
template:
spec:
containers:
- name: backup
image: my-app/backup:latest
command: ["python", "backup.py"]
restartPolicy: OnFailure
concurrencyPolicy: Forbid # 禁止并发
successfulJobsHistoryLimit: 3
failedJobsHistoryLimit: 1
CronJob 表达式
┌───────────── 分钟 (0-59)
│ ┌───────────── 小时 (0-23)
│ │ ┌───────────── 日 (1-31)
│ │ │ ┌───────────── 月 (1-12)
│ │ │ │ ┌───────────── 星期 (0-6, 0=周日)
│ │ │ │ │
* * * * *
示例:
# 每小时执行
schedule: "0 * * * *"
# 每天凌晨 2 点
schedule: "0 2 * * *"
# 每周一上午 10 点
schedule: "0 10 * * 1"
# 每月 1 号凌晨 0 点
schedule: "0 0 1 * *"
并发策略
spec:
concurrencyPolicy: Allow # 允许并发(默认)
concurrencyPolicy: Forbid # 禁止并发
concurrencyPolicy: Replace # 替换旧任务
常用操作
# 手动触发 CronJob
kubectl create job manual-backup --from=cronjob/daily-backup
# 查看 CronJob
kubectl get cronjob
kubectl describe cronjob daily-backup
# 查看执行历史
kubectl get jobs --sort-by=.metadata.creationTimestamp
# 暂停 CronJob
kubectl patch cronjob daily-backup -p '{"spec":{"suspend":true}}'
# 恢复 CronJob
kubectl patch cronjob daily-backup -p '{"spec":{"suspend":false}}'
# 删除 CronJob
kubectl delete cronjob daily-backup
实践案例
数据库备份 Job
apiVersion: batch/v1
kind: CronJob
metadata:
name: db-backup
spec:
schedule: "0 3 * * *"
jobTemplate:
spec:
template:
spec:
containers:
- name: mysql-backup
image: mysql:8.0
command:
- /bin/sh
- -c
- |
mysqldump -h $DB_HOST -u $DB_USER -p$DB_PASSWORD \
$DB_NAME > /backup/backup-$(date +%Y%m%d).sql
env:
- name: DB_HOST
valueFrom:
configMapKeyRef:
name: db-config
key: host
- name: DB_USER
valueFrom:
secretKeyRef:
name: db-secret
key: username
- name: DB_PASSWORD
valueFrom:
secretKeyRef:
name: db-secret
key: password
volumeMounts:
- name: backup-volume
mountPath: /backup
volumes:
- name: backup-volume
persistentVolumeClaim:
claimName: backup-pvc
restartPolicy: OnFailure
定期清理任务
apiVersion: batch/v1
kind: CronJob
metadata:
name: log-cleanup
spec:
schedule: "0 4 * * 0" # 每周日凌晨 4 点
jobTemplate:
spec:
template:
spec:
containers:
- name: cleanup
image: alpine:latest
command:
- /bin/sh
- -c
- find /var/log -name "*.log" -mtime +7 -delete
restartPolicy: OnFailure
常见问题
Job 一直挂起
# 检查节点资源
kubectl describe nodes
# 检查 Pod 事件
kubectl describe pod <pod-name>
Job 失败
# 查看 Pod 日志
kubectl logs <pod-name>
# 检查重启次数
kubectl get pods -l job-name=data-migration
最佳实践
- 设置合理的 backoffLimit 和 activeDeadlineSeconds
- 使用 ttlSecondsAfterFinished 自动清理
- 使用 OnFailure 避免无限重启
- 定期检查 CronJob 执行历史
总结
Job 和 CronJob 是 Kubernetes 中管理批处理和定时任务的核心组件。合理使用可以实现数据迁移、备份、清理等自动化任务。