「走进k8s」Kubernetes1.15.1的定时任务和任务管理(24)

2019-08-23 18:40:45 浏览数 (1)

上次一起学习了Pod自动伸缩的方法,使用到了HPA这个资源对象。任务Job,我们在日常的工作中经常都会遇到一些需要进行批量数据处理和分析的需求,当然也会有按时间来进行调度的工作,在Kubernetes集群中为我们提供了Job和CronJob两种资源对象来。任务的作用也是为了自动化处理,解放双手的。

(一)JOB 和 Cron Job
  • ① 背景

我们在日常的工作中经常都会遇到一些需要进行批量数据处理和分析的需求,当然也会有按时间来进行调度的工作。

  • ② 介绍

当使用的 Kubernetes 集群,版本 >= 1.4(对 ScheduledJob),>= 1.5(对 CronJob),当启动 API Server时,通过传递选项 --runtime-config=batch/v2alpha1=true 可以开启 batch/v2alpha1 API。 无论是job还是CronJob,执行时都产生一个pod,然后在里面运行给定的命令。要执行自己的任务,需要一个自己的Docker镜像和yaml格式的job描述文件。执行环境是容器隔离的,外部存储可以通过pvc/pv等挂载进去,与pod配置参数完全一致。

  • ③ 区别

Job负责处理任务,即仅执行一次的任务,它保证批处理任务的一个或多个Pod成功结束。而CronJob则就是在Job上加上了时间调度。

(二)Job
  • ① API地址

https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.15/#job-v1-batch

  • ① 代码演示
代码语言:javascript复制
---apiVersion: batch/v1kind: Jobmetadata:  name: demo-jobspec:  template:    metadata:      name: demo-job    spec:      restartPolicy: Never      containers:      - name: counter        image: busybox        command:        - "bin/sh"        - "-c"        - "for i in 9 8 7 6 5 4 3 2 1; do echo $i; done"

Job的RestartPolicy仅支持Never和OnFailure两种,执行完就结束,如果使用always任务执行完就重启,这样就不停的执行,不符合任务的特性。

代码语言:javascript复制
 cd ~mkdir jobcd job/vi job-demo.yaml
  • ③ 代码运行,查看详情
代码语言:javascript复制
kubectl apply -f job-demo.yamlkubectl get jobskubectl describe jobs demo-job
代码语言:javascript复制
kubectl get podskubectl logs demo-job-xs8z4

job任务的pod,运行完毕后只有completed这种状态。打印了之前执行的脚本从9到1

  • ④ dashboard查看
(三)CronJob
  • ① 介绍

在给定时间点只运行一次。周期性地在给定时间点运行。这个实际上和Linux中的crontab就非常类似了。

  • ②crontab的格式

第1列分钟0~59 第2列小时0~23 第3列日1~31 第4列月1~12 第5列星期0~7(0和7表示星期天) 第6列要运行的命令

  • ③ api

https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.15/#cronjob-v1beta1-batch

  • ④ 源码编写

.spec.schedule:调度,必需字段,指定任务运行周期 .spec.jobTemplate:Job 模板,必需字段,指定需要运行的任务

代码语言:javascript复制
---apiVersion: batch/v1beta1kind: CronJobmetadata:  name: demo-cronjobspec:  schedule: "*/1 * * * *"  jobTemplate:    spec:      template:        spec:          restartPolicy: OnFailure          containers:          - name: hello            image: busybox            args:            - "bin/sh"            - "-c"            - "for i in 9 8 7 6 5 4 3 2 1; do echo $i; done"

编写

代码语言:javascript复制
 vi demo-cronjob.yaml
  • ⑤ 代码运行,查看详情
代码语言:javascript复制
kubectl apply -f demo-cronjob.yamlkubectl get cronjobkubectl get jobkubectl get podskubectl get jobs

当定时器还没执行完的时候jobs里面没有,等定时任务执行完后,在get jobs 里面才有。目前设置的每一分钟执行一个job,这个job会不断的增加。

像这种情况一分钟增加一个,这样很快硬盘就爆掉了,所以在yaml里面需要增加一个历史记录的限制。关注的字段.spec.successfulJobsHistoryLimit和.spec.failedJobsHistoryLimit,表示历史限制,是可选的字段。成功历史条数,失败历史条数。

  • ⑤ 删除定时job

当删除定时job后,里面的jobs也被删除了。

代码语言:javascript复制
kubectl get cronjobskubectl delete cronjobs demo-cronjobkubectl get cronjobskubectl get jobs
  • ⑥ dashboard

PS:当前一个CronJob在执行期间“大约”创建一个Job,之所以说“大约”是因为在特殊的情况下可能会创建两个或没有Job被创建。Kubernetes官方正在试图使这种情况尽量少发生,但目前还不能保证完全杜绝。CronJob的时间一定要控制好,设置好成功和失败,我的实例代码没写,但是在升成中务必添加。

0 人点赞