目 录CONTENT

文章目录

k8s | 深入理解 Job 和 CronJob

RobKing
2023-07-20 / 0 评论 / 0 点赞 / 212 阅读 / 855 字

k8s | 深入理解 Job 和 CronJob

Job 负责批量处理短暂的一次性任务 (short lived one-off tasks),即仅执行一次的任务,它保证批处理任务的一个或多个 Pod 成功结束。

CronJob 即定时任务,就类似于 Linux 系统的 crontab,在指定的时间周期运行指定的任务。例如备份、数据清理等

工作原理

Job

image-20230720095451968

Job Controller 负责根据 Job Spec 创建 Pod,并持续监控 Pod 的状态,直至其成功结束。如果失败,则根据 restartPolicy(只支持 OnFailure 和 Never,不支持 Always)决定是否创建新的 Pod 再次重试任务。

CronJob

  1. 创建 CronJob 对象。为其分配唯一的名称。
  2. 接收到任务触发时间。定期检查 时间表以确定下一个任务的触发时间。某个任务的触发时间已到达时,执行下一步操作。
  3. 创建 Job 对象。CronJob 控制器会根据 CronJob 对象的定义创建一个 Job 模板
  4. 创建 Pod 对象。在创建 Job 实例期间,CronJob 控制器会根据 Job 模板创建一个或多个 Pod 实例,并将它们调度到集群中的节点上运行。
  5. 监视 Pod 状态。CronJob 控制器会监视 Pod 的状态,并根据需要更新 Pod 或创建新的 Pod。
  6. 删除 Job 和 Pod 对象。一旦任务完成,CronJob 控制器会删除 Job 和 Pod 对象。
  7. 更新 CronJob 对象状态。CronJob 控制器会监视 Job 的状态,并更新 CronJob 对象的状态

Job类型

  • 非并行 Job:通常创建一个 Pod 直至其成功结束
  • 固定结束次数的 Job:设置 .spec.completions,创建多个 Pod,直到 .spec.completions 个 Pod 成功结束
  • 带有工作队列的并行 Job:设置 .spec.Parallelism 但不设置 .spec.completions,当所有 Pod 结束并且至少一个成功时,Job 就认为是成功

使用

Job 使用

创建 job.yaml 文件

apiVersion: batch/v1
kind: Job
metadata:
  name: pi
spec:
  template:
    metadata:
      name: pi
    spec:
      containers:
      - name: pi
        image: perl
        command: ["perl",  "-Mbignum=bpi", "-wle", "print bpi(2000)"]
      restartPolicy: Never

详细解释

  • spec.template 格式同 Pod
  • RestartPolicy 仅支持 Never 或 OnFailure
  • 单个 Pod 时,默认 Pod 成功运行后 Job 即结束
  • .spec.completions 标志 Job 结束需要成功运行的 Pod 个数,默认为 1
  • .spec.parallelism 标志并行运行的 Pod 的个数,默认为 1
  • spec.activeDeadlineSeconds 标志失败 Pod 的重试最大时间,超过这个时间不会继续重试

执行 kubectl create -f ./job.yaml

查看 job 运行的详细信息

kubectl get jobs

kubectl describe job pi

kubectl get pod --show-all -l job-name=pi

CronJob使用

apiVersion: batch/v1beta1
kind: CronJob #资源类型
metadata:
  name: my-cronjob
spec:
  schedule: "0 * * * *"
  jobTemplate:
    spec:
      template:
        metadata:
          labels:
            app: my-cronjob
        spec:
          containers:
          - name: my-container
            image: my-image:latest
            imagePullPolicy: Always
          restartPolicy: OnFailure
  1. 定义了一个名为"my-cronjob"的CronJob,并设置了其调度计划为每小时运行一次。
  2. 定义了作业模板,该模板包含一个Pod模板,其中包含一个容器,该容器将运行我们创建的容器镜像。
  3. 将重启策略设置为"OnFailure",以便在作业失败时自动重新启动。

执行

kubectl apply -f my-cronjob.yaml

查看CronJob的状态

kubectl get cronjobs
0

评论区