欢迎光临
我们一直在努力

让任务自动执行:利用 CronJob 与 Job 实现 K8s 集群内的自动化脚本调度

在 Kubernetes (K8s) 环境中,我们经常需要运行一些非持久化的、最终会完成的批处理任务,例如数据备份、清理操作、定期报告生成或一次性的数据迁移。这些任务不适合使用常规的 Deployment 或 DaemonSet。Kubernetes 提供了 JobCronJob 这两个强大的资源对象来专门处理此类自动化脚本和计划任务。

本文将通过实操示例,指导您如何利用这两个资源来实现集群内的任务自动化调度。

1. 核心概念:Job 与 CronJob

  • Job (任务): 确保一个 Pod 成功运行并完成其工作,一旦容器内的进程退出代码为 0,Job 即被标记为完成。Job 通常用于执行一次性的批处理任务。
  • CronJob (定时任务): 基于标准的 Cron 格式,定时创建并管理 Job 对象。CronJob 非常适合执行周期性的维护任务或自动化脚本。

2. 实践:创建一次性任务 (Job)

我们首先创建一个简单的 Job,它使用 busybox 镜像执行一个脚本,打印当前日期并等待 10 秒。

将以下内容保存为 one-time-job.yaml:

apiVersion: batch/v1
kind: Job
metadata:
  name: simple-data-backup-job
spec:
  # 如果 Pod 失败,最多重试 4 次
  backoffLimit: 4
  template:
    spec:
      containers:
      - name: task-runner
        image: busybox
        command: ["sh", "-c", "echo 'Starting critical data backup process...' && date && sleep 10 && echo 'Backup finished.'"]
      # 任务一旦完成,无需重启 Pod
      restartPolicy: OnFailure

运行与验证 Job

  1. 应用配置:
    kubectl apply -f one-time-job.yaml
    
  2. 检查 Job 状态:
    kubectl get jobs
    # 状态应显示 1/1 Completions
    
  3. 查看 Pod 日志: 找到由该 Job 创建的 Pod 名称,并查看其输出。
    POD_NAME=$(kubectl get pods --selector=job-name=simple-data-backup-job -o jsonpath='{.items[0].metadata.name}')
    kubectl logs $POD_NAME
    

    输出将包含:“Starting critical data backup process…” 和 “Backup finished.”

3. 实践:创建定时任务 (CronJob)

接下来,我们使用 CronJob 来实现自动化脚本的周期性调度。我们创建一个每 5 分钟运行一次的定时任务,模拟定期集群健康检查。

将以下内容保存为 scheduled-cronjob.yaml:

apiVersion: batch/v1
kind: CronJob
metadata:
  name: cluster-health-checker
spec:
  # Cron 表达式:*/5 * * * * (每 5 分钟)
  schedule: "*/5 * * * *"
  # 可选:如果上一次 Job 仍在运行,如何处理新的 Job。Forbid (禁止,即跳过)
  concurrencyPolicy: Forbid
  # 保留最近 3 个成功的 Job 历史记录
  successfulJobsHistoryLimit: 3
  # 保留最近 1 个失败的 Job 历史记录
  failedJobsHistoryLimit: 1
  jobTemplate:
    spec:
      template:
        spec:
          containers:
          - name: health-checker
            image: busybox
            command: ["sh", "-c", "echo 'Cluster Health Check running at:' && date && echo 'System nominal.'"]
          restartPolicy: OnFailure

Cron 表达式简述: Minute Hour DayOfMonth Month DayOfWeek。例如,***/5 * * * *** 表示每 5 分钟。

运行与验证 CronJob

  1. 应用配置:
    kubectl apply -f scheduled-cronjob.yaml
    
  2. 检查 CronJob 状态:
    kubectl get cronjobs
    # 检查 'LAST SCHEDULE' 字段确认调度时间
    
  3. 观察 Job 的生成:
    等待几分钟,CronJob 将自动生成 Job 对象。您可以观察到 Job 列表不断更新。

    kubectl get jobs
    # 您将看到类似 cluster-health-checker-27514867 这样的 Job 名称
    
  4. 查看日志 (重复步骤): 找到最新的 Job 创建的 Pod,并检查其日志,确认任务已按时执行。

总结

通过使用 Kubernetes 的 JobCronJob 资源,您可以轻松地将批处理任务和自动化脚本集成到您的 K8s 工作流中。Job 保证任务的可靠完成,而 CronJob 则提供了灵活且强大的周期性调度能力,极大地提升了集群管理的自动化水平。

【本站文章皆为原创,未经允许不得转载】:汤不热吧 » 让任务自动执行:利用 CronJob 与 Job 实现 K8s 集群内的自动化脚本调度
分享到: 更多 (0)

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址