kubernetes的Job和cronjob管理

 

 

Job

Job 工作机制

https://kubernetes.io/zh-cn/docs/concepts/workloads/controllers/job/

image

 

在日常的工作中,经常会遇到临时执行一个任务,但是这个任务必须在某个时间点执行才可以
前面的Deployment和DaemonSet主要负责编排始终持续运行的守护进程类的应用,并不适合此场景
针对于这种场景,一般使用job的方式来完成任务

Job负责编排运行有结束时间的“一次性”任务

  • 控制器要确保Pod内的进程“正常(成功完成任务)”退出
  • 非正常退出的Pod可以根据需要重启,并在重试指定的次数后终止
  • Job 可以是单次任务,也可以是在多个Pod分别各自运行一次,实现运行多次(次数通常固定)
  • Job 支持同时创建及并行运行多个Pod以加快任务处理速度,Job控制器支持用户自定义其并行度

关于job的执行主要有两种并行度的类型:

  • 串行 job:即所有的job任务都在上一个job执行完毕后,再开始执行
  • 并行 job:如果存在多个 job,可以设定并行执行的 job 数量。

Job资源同样需要标签选择器和Pod模板,但它不需要指定replicas,且需要给定completions,即需要
完成的作业次数,默认为1次

  • Job资源会为其Pod对象自动添加“job-name=JOB_NAME”和“controller-uid=UID”标签,并使用标签选择器完成对controller-uid标签的关联,因此,selector并非必选字段
  • Pod的命名格式:$(job-name)-$(index)-$(random-string),其中的$(index)字段取值与completions和completionMode有关

 

注意

  • Job 资源是标准的API资源类型
  • Job 资源所在群组为“batch/v1”
  • Job 资源中,Pod的RestartPolicy的取值只能为Never或OnFailure


Job 属性解析

 

apiVersion: batch/v1 # API群组及版本
kind: Job # 资源类型特有标识
metadata:
 name <string> # 资源名称,在作用域中要唯一
 namespace <string> # 名称空间;Job资源隶属名称空间级别
spec:
 selector <object> # 标签选择器,必须匹配template字段中Pod模板中
的标签
 suspend <boolean>   # 是否挂起当前Job的执行,挂起作业会重置StartTime字段的值
 template <object> # Pod模板对象
 completions <integer> # 期望的成功完成的作业次数,成功运行结束的Pod数量,默认值为1
 completionMode <string>               # 追踪Pod完成模式,支持有序的Indexed和无序的NonIndexed(默认)两种
 ttlSecondsAfterFinished <integer> # Completed终止状态作业的生存时长,超时将被删除
 parallelism <integer> # 作业的最大并行度,默认为1
 backoffLimit <integer> # 将作业标记为Failed之前的重试次数,默认为6
 activeDeadlineSeconds <integer> # 作业启动后可处于活动状态的时长

 

并行配置示例

#串行运行共5次任务
spec
 parallelism: 1
 completion: 5
#并行2个队列,总共运行6次任务
spec
 parallelism: 2
 completion: 6

  Job 案例

范例: 单个任务

#定制资源配置文件

[root@master1 workload]# cat  controller-job-single.yaml
apiVersion: batch/v1
kind: Job
metadata:
  name: job-single
spec:
  template:
    metadata:
      name: job-single
    spec:
      restartPolicy: Never
      containers:
      - name: job-single
        image: registry.cn-beijing.aliyuncs.com/wangxiaochun/busybox:1.32.0
        #image: busybox:1.30.0
        command: [ "/bin/sh", "-c", "for i in `seq 10 -1 1`; do echo $i; sleep 2; done" ]

#属性解析:job重启策略只有两种:仅支持Never和OnFailure两种,不支持Always,否则的话就成死循环了。

kubectl apply -f controller-job-single.yaml

 

[root@master1 workload]# kubectl get pod
NAME               READY   STATUS              RESTARTS   AGE
job-single-h7kww   0/1     ContainerCreating   0          4s
[root@master1 workload]# 
[root@master1 workload]# kubectl get job
NAME         STATUS    COMPLETIONS   DURATION   AGE
job-single   Running   0/1           7s         7s
[root@master1 workload]# 
[root@master1 workload]# kubectl logs -f  job-single-h7kww
10
9
8
7
6
5
4
3
2
1

 

#结果显示:job任务执行完毕后,状态是Completed

[root@master1 workload]# kubectl get job
NAME         STATUS     COMPLETIONS   DURATION   AGE
job-single   Complete   1/1           37s        95s
[root@master1 workload]# kubectl get pod
NAME               READY   STATUS      RESTARTS   AGE
job-single-h7kww   0/1     Completed   0          97s

 

 范例: 多个串行任务

[root@master1 workload]# cat controller-job-multi-serial.yaml 
apiVersion: batch/v1
kind: Job
metadata:
  name: job-multi-serial
spec:
  completions: 5
  parallelism: 1                   #parallelism为1表示串行
  #completionMode: Indexed
  template:
    spec:
      containers:
      - name: job-multi-serial
        #image: busybox:1.30.0
        image: registry.cn-beijing.aliyuncs.com/wangxiaochun/busybox:1.32.0
        command: ["/bin/sh","-c","echo serial job; sleep 3"]
      restartPolicy: OnFailure

kubectl apply -f controller-job-multi-serial.yaml

 

[root@master1 workload]# kubectl logs -f job-multi-serial-cbfbm
serial job

 

root@master1 workload]# kubectl get pod
NAME                     READY   STATUS      RESTARTS   AGE
job-multi-serial-6qp2q   0/1     Completed   0          40s
job-multi-serial-cbfbm   0/1     Completed   0          47s
job-multi-serial-k8h46   0/1     Completed   0          33s
job-multi-serial-m29b6   0/1     Completed   0          19s
job-multi-serial-nt7jz   0/1     Completed   0          26s
job-single-h7kww         0/1     Completed   0          9m
[root@master1 workload]# kubectl get job
NAME               STATUS     COMPLETIONS   DURATION   AGE
job-multi-serial   Complete   5/5           35s        49s
job-single         Complete   1/1           37s        9m2s

 

CronJob

CronJob 工作机制

 

 

https://kubernetes.io/zh-cn/docs/concepts/workloads/controllers/cron-jobs/

image

 

对于周期性的定时任务,kubernetes提供了 Cronjob控制器实现任务的编排
CronJob 建立在Job的功能之上,是更高层级的控制器
它以Job控制器完成单批次的任务编排,而后为这种Job作业提供需要运行的周期定义
CronJob其实就是在Job的基础上加上了时间调度,可以在给定的时间点启动一个Pod 来运行任务,也可
以周期性地在给定时间点启动Pod运行任务。
CronJob 效果与linux中的crontab效果非常类似
CronJob 被调用的时间是来自于controller-manager的时间,需要确保controller-manager准确
另外CronJob执行时,需要拉取镜像也需要一定的时间,所以可能会导致真正执行的时间不准确

 

对于没有指定时区的 CronJob,kube-controller-manager 基于本地时区解释排期表(Schedule)
Crontab的名称最多不能超过63个字符,其中系统自动附加11个字符,所以用户指定的名称不能超过52个
字符
CronJob资源也是标准的API资源类型
删除CronJob,同时会级联删除相关的Job和Pod
一个CronJob对象其实就对应中crontab文件中的一行,它根据配置的时间格式周期性地运行一个Job,
格式和crontab也是相同的
注意:在CronJob中,通配符“?”和“*”的意义相同,它们都表示任何可用的有效值

 

Cron 时间表语法
2.8.2 CronJob 属性解析
# ┌───────────── 分钟 (0 - 59)
# │ ┌───────────── 小时 (0 - 23)
# │ │ ┌───────────── 月的某天 (1 - 31)
# │ │ │ ┌───────────── 月份 (1 - 12)
# │ │ │ │ ┌───────────── 周的某天 (0 - 6)(周日到周一;在某些系统上,7 也是星期日)
# │ │ │ │ │                         或者是 sun,mon,tue,web,thu,fri,sat
# │ │ │ │ │
# │ │ │ │ │
# * * * * *

 

输入 描述 相当于
@yearly (or @annually) 每年 1 月 1 日的午夜运行一次 0 0 1 1 *
@monthly 每月第一天的午夜运行一次 0 0 1 * *
@weekly 每周的周日午夜运行一次 0 0 * * 0
@daily (or @midnight) 每天午夜运行一次 0 0 * * *
@hourly 每小时的开始一次 0 * * * *

 

CronJob 属性解析

apiVersion: batch/v1 # API群组及版本,早期版本为batch/v1beta1
kind: CronJob # 资源类型特有标识
metadata:
  name: <string> # 资源名称,在作用域中要唯一
  namespace: <string> # 名称空间;CronJob资源隶属名称空间级别
spec:
  jobTemplate: <Object> # job作业模板,必选字段
    metadata: <object> # 模板元数据
    spec: <object> # 作业的期望状态
  schedule: <string> # 调度时间设定,必选字段,格式和Linux的crontab相同
  concurrencyPolicy: <string> # 多个Cronjob是否允许并发策略,可用值有Allow、Forbid和Replace
    # Allow 允许上一个Crontjob没有完成,开始新的一个Crontjob开始执行
    # Forbid 禁止在上一个Crontjob还没有完成就开始新的任务
    # Replace 当上一个Crontjob没有完成时,杀掉旧任务,用新的任务替代
  failedJobsHistoryLimit: <integer> # 失败作业的历史记录数,默认为1,建议设置此值稍大一些,方便查看原因
  successfulJobsHistoryLimit: <integer> # 成功作业的历史记录数,默认为3
  startingDeadlineSeconds: <integer> # 因错过时间点而未执行的作业的可超期时长,仍可继续执行
  suspend: <boolean> # 是否挂起后续的作业,不影响当前作业,默认为false

 

CronJob 案例

范例: 单周期任务

[root@master1 workload]# cat controller-cronjob-simple.yaml
apiVersion: batch/v1
kind: CronJob
metadata:
  name: cronjob
spec:
  schedule: "* * * * *"   #每2分钟执行一次
  jobTemplate:
    spec:
      #parallelism: 2    #两路并行
      #completions: 2
      template:
        spec:
          restartPolicy: OnFailure
          containers:
          - name: cronjob
            #image: busybox:1.30.0
            image: registry.cn-beijing.aliyuncs.com/wangxiaochun/busybox:1.32.0
            command: ["/bin/sh","-c","echo Cron Job"]

 

kubectl apply -f controller-cronjob-simple.yaml

 

root@master1 workload]# kubectl get cj
NAME      SCHEDULE    TIMEZONE   SUSPEND   ACTIVE   LAST SCHEDULE   AGE
cronjob   * * * * *   <none>     False     0        11s             70s

[root@master1 workload]# kubectl get pod
NAME                     READY   STATUS      RESTARTS   AGE
cronjob-29646452-9547b   0/1     Completed   0          38s

 

范例: 秒级周期任务

[root@master1 workload]# cat controller-cronjob-second.yaml 
apiVersion: batch/v1
kind: CronJob
metadata:
  name: cronjob-second
spec:
  schedule: "* * * * *"
  jobTemplate:
    spec:
      template:
        spec:
          restartPolicy: OnFailure
          containers:
          - name: cronjob
            #image: busybox:1.30.0
            image: registry.cn-beijing.aliyuncs.com/wangxiaochun/busybox:1.32.0
            command: ["/bin/sh","-c","i=0; until [ $i -eq 60 ]; do sleep 10; let i=i+10; echo $i sencond job; done"]

#属性解析:调度是每秒都执行后面的命令,命令是每执行一下停止10s,这里的10s应该符合原则上的时间整除规则

kubectl apply -f controller-cronjob-second.yaml 

[root@master1 workload]# kubectl get cj
NAME             SCHEDULE    TIMEZONE   SUSPEND   ACTIVE   LAST SCHEDULE   AGE
cronjob-second   * * * * *   <none>     False     0        <none>          32s

 

[root@master1 workload]# kubectl get pod
NAME                            READY   STATUS    RESTARTS   AGE
cronjob-second-29646456-584tb   1/1     Running   0          5s

#查看pod日志

[root@master1 workload]# kubectl logs -f cronjob-second-29646456-584tb
10 sencond job
20 sencond job
30 sencond job
40 sencond job
50 sencond job
60 sencond job

#结果显示:周期性任务每分钟执行一次

[root@master1 workload]# kubectl get pod
NAME                            READY   STATUS      RESTARTS   AGE
cronjob-second-29646456-584tb   0/1     Completed   0          2m19s
cronjob-second-29646457-db7lv   0/1     Completed   0          79s
cronjob-second-29646458-8wn9h   1/1     Running     0          19s


[root@master1 workload]# kubectl logs -f cronjob-second-29646457-db7lv 
10 sencond job
20 sencond job
30 sencond job
40 sencond job
50 sencond job
60 sencond job
[root@master1 workload]# kubectl logs -f cronjob-second-29646458-8wn9h
10 sencond job
20 sencond job
30 sencond job
40 sencond job
50 sencond job
60 sencond job

#结果显示:每个任务中,周期性的执行一个动作

 

 

 

posted @ 2026-05-15 03:41  minger_lcm  阅读(30)  评论(0)    收藏  举报