Kubernetes的Job资源对象怎么用

[复制链接]

1275

主题

1275

帖子

1013

积分

金牌会员

Rank: 6Rank: 6

积分
1013
分享到:
发表于 2022-6-27 10:45:50 | 显示全部楼层 |阅读模式
Kubernetes的Job资源对象怎么用?相信大部分人都还不知道Job资源对象的使用方法,为了让大家学会,给大家总结了以下内容,话不多说,一起往下看吧。
概念在有些场景下,是想要运行一些容器执行某种特定的任务,任务一旦执行完成,容器也就没有存在的必要了。在这种场景下,创建pod就显得不那么合适。于是就是了Job,Job指的就是那些一次性任务。通过Job运行一个容器,当其任务执行完以后,就自动退出,集群也不再重新将其唤醒。
从程序的运行形态上来区分,可以将Pod分为两类:长时运行服务(jboss、mysql等)和一次性任务(数据计算、测试)。RC创建的Pod都是长时运行的服务,Job多用于执行一次性任务、批处理工作等,执行完成后便会停止(status.phase变为Succeeded)。
环境介绍主机IP地址服务master192.168.1.21k8snode01192.168.1.22k8snode02192.168.1.23k8s基于[ https://blog.51cto.com/14320361/2464655]() 的实验继续进行
一、kubernetes支持以下几种job非并行job:通常创建一个pod直至其成功结束。固定结束次数的job:设置spec.completions,创建多个pod,直到.spec.completions个pod成功结束。带有工作队列的并行job:设置.spec.Parallelism但不设置.spec.completions,当所有pod结束并且至少一个成功时,job就认为是成功。Job ControllerJob Controller负责根据Job Spec创建pod,并持续监控pod的状态,直至其成功结束,如果失败,则根据restartPolicy(只支持OnFailure和Never,不支持Always)决定是否创建新的pod再次重试任务。
例子(1)编写一个job的yaml文件[root@master yaml]# vim jop.yamlkind: JobapiVersion: batch/v1metadata: name: test-jobspec: template: ?metadata: ??name: test-job ?spec: ??containers: ??- name: hello ???image: busybox ???command: ["echo","hello k8s job!"] ??restartPolicy: Never(2)执行一下[root@master yaml]# kubectl apply -f jop.yaml (3)查看一下[root@master yaml]# kubectl get pod

查看日志[root@master yaml]# kubectl logs test-job-gs45w

我们可以看到job与其他资源对象不同,仅执行一次性任务,默认pod借宿运行后job即结束,状态为Completed。
(4)修改一下jop的yaml文件,把echo命令换成乱码[root@master yaml]# vim jop.yamlkind: JobapiVersion: batch/v1metadata: name: test-jobspec: template: ?metadata: ??name: test-job ?spec: ??containers: ??- name: hello ???image: busybox ???command: ["asdasxsddwefew","hello k8s job!"] #修改 ??restartPolicy: Never(5)先删除之前的pod[root@master yaml]# kubectl delete jobs.batch test-job (6)执行一下[root@master yaml]# kubectl apply -f jop.yaml (7)查看一下[root@master yaml]# kubectl get pod -w

它会一直创建pod直到完成命令。
(8)修改一下jop的yaml文件,修改重启策略[root@master yaml]# vim jop.yaml kind: JobapiVersion: batch/v1metadata: name: test-jobspec: template: ?metadata: ??name: test-job ?spec: ??containers: ??- name: hello ???image: busybox ???command: ["asdasxsddwefew","hello k8s job!"] ??restartPolicy: OnFailure(9)先删除之前的pod[root@master yaml]# kubectl delete jobs.batch test-job (10)执行一下[root@master yaml]# kubectl apply -f jop.yaml (11)查看一下[root@master yaml]# kubectl get pod -w

它会一直重启pod完成命令,直到重启到一定次数就会删除job。
二、提高Job的执行效率1. 我们可以在Job.spec字段下加上[parallelism]()选项。表示同时运行多少个Pod执行任务。(1)编写一个job的yaml文件[root@master yaml]# vim jop.yamlkind: JobapiVersion: batch/v1metadata: name: test-jobspec: parallelism: 2 ?#同时启用几个pod template: ?metadata: ??name: test-job ?spec: ??containers: ??- name: hello ???image: busybox ???command: ["echo","hello k8s job!"] ??restartPolicy: OnFailure(3)执行一下[root@master yaml]# kubectl apply -f jop.yaml (4)查看一下[root@master yaml]# kubectl get pod

查看日志
2. 我们可以在Job.spec字段下加上complations选项。表示总共需要完成Pod的数量(1)编写一个job的yaml文件[root@master yaml]# vim jop.yamlkind: JobapiVersion: batch/v1metadata: name: test-jobspec: complations: 8 ?????#运行pod的总数量8个 parallelism: 2 ?????#同时运行2个pod template: ?metadata: ??name: test-job ?spec: ??containers: ??- name: hello ???image: busybox ???command: ["echo","hello k8s job!"] ??restartPolicy: OnFailurejob 字段解释:
completions:标志Job结束需要成功运行的Pod个数,默认为1

parallelism:标志并行运行的Pod的个数,默认为1

activeDeadlineSeconds:标志失败Pod的重试最大时间,超过这个时间不会继续重试.

(2)先删除之前的pod[root@master yaml]# kubectl delete jobs.batch test-job (3)执行一下[root@master yaml]# kubectl apply -f jop.yaml (4)查看一下[root@master yaml]# kubectl get pod

可以看到pod是两个两个的启动的。
3. 如何定时执行Job(1)编写一个cronjob的yaml文件[root@master yaml]# vim cronjop.yamlkind: CronJobapiVersion: batch/v1beta1metadata: name: hellospec: schedule: "*/1 * * * *" #限定时间 jobTemplate: ?spec: ??template: ???spec: ????containers: ????- name: hello ?????image: busybox ?????command: ["echo","hello","cronjob"] ????restartPolicy: OnFailure(2)先删除之前的pod[root@master yaml]# kubectl delete jobs.batch test-job (3)执行一下[root@master yaml]# kubectl apply -f jop.yaml (4)查看一下[root@master yaml]# kubectl get pod

[root@master yaml]# kubectl get cronjobs.batch

此时查看Pod的状态,会发现,每分钟都会运行一个新的Pod来执行命令规定的任
务。
练习:规定2020.1.15.10.5分运行上面的crontab任务。(1)编写一个cronjob的yaml文件[root@master yaml]# vim cronjop.yamlkind: CronJobapiVersion: batch/v1beta1metadata: name: hellospec: schedule: "5 10 15 1 *" #限定时间 jobTemplate: ?spec: ??template: ???spec: ????containers: ????- name: hello ?????image: busybox ?????command: ["echo","hello","cronjob"] ????restartPolicy: OnFailure(2)先删除之前的pod[root@master yaml]# kubectl delete cronjobs.batch hello (3)执行一下[root@master yaml]# kubectl apply -f jop.yaml (4)查看一下[root@master yaml]# kubectl get pod

这时会发现,如果规定具体时间,可能并不会执行任务。
(5)添加apiVersion库[root@master yaml]# vim /etc/kubernetes/manifests/kube-apiserver.yaml spec: containers: - command: ?- kube-apiserver ?- --runtime-config=batch/v2alpha1=true ?#添加
(6)重启kubelet[root@master yaml]# systemctl restart kubelet.service (7)查看api版本[root@master yaml]# kubectl api-versions

(8)编写一个cronjob的yaml文件[root@master yaml]# vim cronjop.yamlkind: CronJobapiVersion: batch/v1beta1metadata: name: hellospec: schedule: "47 10 15 1 *" #限定时间 jobTemplate: ?spec: ??template: ???spec: ????containers: ????- name: hello ?????image: busybox ?????command: ["echo","hello","cronjob"] ????restartPolicy: OnFailure(9)执行一下[root@master yaml]# kubectl apply -f jop.yaml (4)查看一下[root@master yaml]# kubectl get pod -w

注意:此时仍然不能正常运行指定时间的Job,这是因为K8s官方在cronjob这个资源对象的支持中还没有完善此功能,还待开发。
跟Job资源一样在cronjob.spec.jobTemplate.spec 下同样支持并发Job参数:

parallelism,也支持完成Pod的总数参数: completionsr

以上就是Kubernetes的Job资源对象的使用方法,看完之后是否有所收获呢?如果想了解更多相关内容,欢迎关注Vecloud行业资讯!

使用高级回帖 (可批量传图、插入视频等)快速回复

您需要登录后才可以回帖 登录 | 注册

本版积分规则   Ctrl + Enter 快速发布  

发帖时请遵守我国法律,网站会将有关你发帖内容、时间以及发帖IP地址等记录保留,只要接到合法请求,即会将信息提供给有关政府机构。
快速回复 返回顶部 返回列表