← 返回首页
🔧

Kubernetes Jobs 批处理任务

📂 devops ⏱ 3 min 505 words

Kubernetes Jobs 批处理任务

什么是 Job

Job 是 Kubernetes 中用于运行一次性任务的控制器。它会创建一个或多个 Pod,确保指定数量的 Pod 成功完成任务后终止。适用于批处理、数据迁移、备份等场景。

Job 的特点

创建 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

最佳实践

总结

Job 和 CronJob 是 Kubernetes 中管理批处理和定时任务的核心组件。合理使用可以实现数据迁移、备份、清理等自动化任务。