kubernetes的Job和cronjob管理
Job
Job 工作机制
https://kubernetes.io/zh-cn/docs/concepts/workloads/controllers/job/

在日常的工作中,经常会遇到临时执行一个任务,但是这个任务必须在某个时间点执行才可以
前面的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/

对于周期性的定时任务,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
#结果显示:每个任务中,周期性的执行一个动作
浙公网安备 33010602011771号