专栏首页编程坑太多「走进k8s」Kubernetes1.15.1的定时任务和任务管理(24)

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

上次一起学习了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

  • ① 代码演示
---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任务执行完就重启,这样就不停的执行,不符合任务的特性。

 cd ~mkdir jobcd job/vi job-demo.yaml
  • ③ 代码运行,查看详情
kubectl apply -f job-demo.yamlkubectl get jobskubectl describe jobs demo-job
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 模板,必需字段,指定需要运行的任务

---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"

编写

 vi demo-cronjob.yaml
  • ⑤ 代码运行,查看详情
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也被删除了。

kubectl get cronjobskubectl delete cronjobs demo-cronjobkubectl get cronjobskubectl get jobs
  • ⑥ dashboard

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

本文分享自微信公众号 - 编程坑太多(idig88),作者:诸葛阿明

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2019-08-23

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • html元素(标签)

    IT故事会
  • 『高级篇』docker容器来说软件架构的进化(二)

    IT故事会
  • 『高级篇』docker容器来说软件架构的进化(二)

    IT故事会
  • 美团点评境外度假团队前端项目开发实践总结

    前言 随着前端项目数量和规模越来越大,参与的人员也越来越多,如何在前端项目开发过程中保证优质的开发者体验和项目的可维护性,同时确保极致的用户体验将会是一个非常大...

    美团技术团队
  • 用go语言爬取珍爱网 | 第一回

    在返回体里可以找到<meta charset="gbk" /> 即编码为gbk,而go默认编码为utf-8,所以就会出现乱码。接下来用第三方库将其编码格式转为u...

    我的小碗汤
  • Spring Boot 传参方式

    最近在搞Spring Boot的项目,把传参方式总结一下。网上也参考一些文章,总结的很不错,这里借鉴一下。

    用户2146693
  • 英拟资助类人计算可行性研究

    英国工程与物理科学研究理事会(EPSRC)宣布投资200万英镑资助6项类人计算可行性研究,项目将延续18个月,每个项目将获得高达30万英镑的资助。英国经济与社会...

    人工智能快报
  • java集合【6】-- Collection源码解析

    collection在java集合中,算是顶级接口,它继承了iterable接口,不能实例化,只能实例化其子类。之所以需要这样一个接口,是因为java作为面向对...

    秦怀杂货店
  • 实践总结:基于Kbone使用React同构开发小程序

    据官方介绍,Kbone 是一个致力于微信小程序和Web端同构的解决方案。具体来说,因为微信小程序的底层模型和 Web 端不同,所以如果我们想直接把 Web 端的...

    极乐君
  • 为什么“少就是多”是云计算的秘密

    正如云计算通常将硬件和整个物理层抽象化一样,云原生计算将此原则扩展到所有内部环境。因此,云原生方法是混合IT的基础,它试图抽象多个公共云、私有云、内部虚拟化和遗...

    静一

扫码关注云+社区

领取腾讯云代金券