当前位置:   article > 正文

Kubernetes之Job与CronJob

kubernetes job cronjob

一、Job

(1)Job概述

Job负责处理短暂的一次性任务,即仅执行一次的任务,它保证批处理任务的一个或多个pod成功结束。

Kubernetes支持以下几种Job:

  • 非并行Job:通常创建一个Pod直到其成功结束;
  • 固定结束次数的Job:在spec字段下添加completions字段。创建多个Pod,直到满足completions规定的数值。如果不添加的话,默认情况下是1个;
  • 带有工作队列的并行Job:在spec字段下添加Parallelism字段。表示几个job同时并行工作。如果不添加的话,默认情况下是1个;

根据可以设置completions字段、Parallelism字段,可以将Job分为以下几种:
Kubernetes之Job与CronJob

(2)Job Controller

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

如图:
Kubernetes之Job与CronJob

(3)应用示例

一个简单的小示例:

  1. [root@master job]# cat job.yaml
  2. kind: Job
  3. apiVersion: batch/v1
  4. metadata:
  5. name: test-job
  6. spec:
  7. template:
  8. metadata:
  9. name: test-job
  10. spec:
  11. containers:
  12. - name: hello
  13. image: busybox
  14. command: ["echo","hello k8s job"]
  15. restartPolicy: Never
  16. [root@master job]# kubectl apply -f job.yaml //生成Job资源
  17. [root@master job]# kubectl get job //查看Job
  18. NAME COMPLETIONS DURATION AGE
  19. test-job 1/1 2s 5s
  20. [root@master job]# kubectl get pod -o wide //查看Job运行的详细信息
  21. NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
  22. test-job-rq9ws 0/1 Completed 0 25s 10.244.1.15 node01 <none> <none>
  23. [root@master job]# kubectl logs test-job-rq9ws //查看通过Job生成的Pod的日志信息
  24. hello k8s job
  25. [root@master job]# kubectl delete jobs test-job
  26. //删除Job,那么对应的pod也会被删除!

(4)提高Job的执行效率

一个简单的小示例:

  1. [root@master job]# cat job.yaml
  2. kind: Job
  3. apiVersion: batch/v1
  4. metadata:
  5. name: test-job
  6. spec:
  7. parallelism: 2
  8. completions: 10
  9. template:
  10. metadata:
  11. name: test-job
  12. spec:
  13. containers:
  14. - name: hello
  15. image: busybox
  16. command: ["echo","hello k8s job"]
  17. restartPolicy: Never
  18. [root@master job]# kubectl apply -f job.yaml
  19. [root@master job]# kubectl get job
  20. NAME COMPLETIONS DURATION AGE
  21. test-job 10/10 7s 15s
  22. //可以看出是运行了10个任务

查看Job运行的详细信息,如图:
Kubernetes之Job与CronJob
由这个示例可以查看:

  • parallelism:表示同时运行多少个Pod执行任务;
  • completions:表示总共需要完成的pod的数量;

一个简单的小示例:

  1. [root@master job]# cat job.yaml
  2. kind: Job
  3. apiVersion: batch/v1
  4. metadata:
  5. name: test-job
  6. spec:
  7. backoffLimit: 5
  8. activeDeadlineSeconds: 100
  9. template:
  10. metadata:
  11. name: test-job
  12. spec:
  13. containers:
  14. - name: hello
  15. image: busybox
  16. command: ["echddddddo","hello k8s job"]
  17. restartPolicy: Never
  18. [root@master job]# kubectl apply -f job.yaml
  19. [root@master job]# kubectl get job
  20. NAME COMPLETIONS DURATION AGE
  21. test-job 0/1 2m28s 2m28s
  22. [root@master job]# kubectl get pod
  23. NAME READY STATUS RESTARTS AGE
  24. test-job-4lzsc 0/1 ContainerCannotRun 0 111s
  25. test-job-8q659 0/1 ContainerCannotRun 0 2m42s
  26. test-job-hjjbx 0/1 ContainerCannotRun 0 2m41s
  27. test-job-qcf4z 0/1 ContainerCannotRun 0 2m31s

由这个示例可以看出:

  • backoffLimit:表示出现错误重试次数;
  • activeDeadlineSeconds:表示Job在集群中存活的时间;

关于Job就简单介绍这么多了!

二、CronJob

CronJob即定时任务,类似于Linux系统中的crontab,在指定的时间周期运行指定的任务。

CronJob yaml文件中的spec字段下的schedule是用来定义的时间间隔的,其用法与crontab一样(分、时、日、月、周);jobTemplate字段指定需要运行的任务;

在kubernetes 1.15中,使用CronJob需要使用API的batch/v2alpha1这个版本,但是,kubernetes本身并没有这个版本,如下:

[root@master job]# kubectl api-versions | grep batch/v2alpha1

需要进行以下操作使Kubernetes群集支持这个batch/v2alpha1版本,操作如下:

  1. [root@master ~]# vim /etc/kubernetes/manifests/kube-apiserver.yaml
  2. 在spec字段的command字段下添加以下内容:
  3. - --runtime-config=batch/v2alpha1=true
  4. [root@master ~]# systemctl restart kubelet.service
  5. //重启kubelet服务
  6. [root@master ~]# kubectl api-versions | grep batch/v2alpha1
  7. batch/v2alpha1

为了防止内容添加发生错误,附上图片一张:
Kubernetes之Job与CronJob

(1)应用示例

  1. [root@master job]# cat cronjob.yaml
  2. kind: CronJob
  3. apiVersion: batch/v2alpha1
  4. metadata:
  5. name: hello
  6. spec:
  7. schedule: "*/1 * * * *"
  8. jobTemplate:
  9. spec:
  10. template:
  11. spec:
  12. containers:
  13. - name: hello
  14. image: busybox
  15. command: ["echo","hello cronjob"]
  16. restartPolicy: Never
  17. [root@master job]# kubectl apply -f cronjob.yaml

查看效果:
Kubernetes之Job与CronJob

这样测试是没有问题的,但是如果指定计划任务时,就会发现它不会像预期的效果一样!
如下:

  1. [root@master job]# cat cronjob.yaml
  2. kind: CronJob
  3. apiVersion: batch/v2alpha1
  4. metadata:
  5. name: hello
  6. spec:
  7. schedule: "18 16 15 1 3"
  8. jobTemplate:
  9. spec:
  10. template:
  11. spec:
  12. containers:
  13. - name: hello
  14. image: busybox
  15. command: ["echo","hello cronjob"]
  16. restartPolicy: Never
  17. [root@master job]# date
  18. 20200115日 星期三 16:18:48 CST
  19. [root@master job]# kubectl get pod
  20. No resources found.

这个算是k8s的一个小问题吧,官方已经在紧急修复这个问题,相信在以后的新版本,这个问题是可以解决的吧!

注意,此时仍然不能正常运行指定时间的job,这时因为k8s官方在cronjob这个资源对象的支持中还没有完善此功能。还待开发。

CronJob跟Job资源一样在cronjob.spec.jobTemplate.spec下同样支持并发Job参数:parallelism,也支持完成Pod的总数参数:completions!

关于CronJob就先简单介绍这么多!

——————————本文到此结束,感谢阅读——————————

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/weixin_40725706/article/detail/563791
推荐阅读
相关标签
  

闽ICP备14008679号