2023年7月6日发(作者:)
k8s运⾏容器之Job应⽤(6) 容器按照持续运⾏的时间可分为两类:服务类容器和⼯作类容器。 服务类容器通常持续提供服务,需要⼀直运⾏,⽐如 http server,daemon 等。⼯作类容器则是⼀次性任务,⽐如批处理程序,完成后容器就退出。 Kubernetes 的 Deployment、ReplicaSet 和 DaemonSet 都⽤于管理服务类容器;对于⼯作类容器,我们⽤ Job。⼀、job的应⽤1、编写job的yaml⽂件:[root@ren7 yaml]# cat
apiVersion: batch/v1 kind: Jobmetadata: name: jobspec: template: spec: containers: - name: job image: /learn/busybox:latest command: ["echo","hello kubernetes"] restartPolicy: Never ① batch/v1 是当前 Job 的 apiVersion。 ② 指明当前资源的类型为 Job。 ③ restartPolicy 指定什么情况下需要重启容器。对于 Job,只能设置为 Never 或者 OnFailure。对于其他 controller(⽐如 Deployment)可以设置为 Always 。2、启动job[root@ren7 yaml]# kubectl apply -f
/job created3、查看job的状态[root@ren7 yaml]# kubectl get jobNAME COMPLETIONS DURATION AGEjob 1/1 3s 84s4、查看pod的状态[root@ren7 yaml]# kubectl get podNAME READY STATUS RESTARTS AGEjob-m9shb 0/1 Completed 0 2m40s 显⽰completed已经完成5、查看pod的标准输出[root@ren7 yaml]# kubectl logs job-m9shbhello kubernetes⼆、job失败的情况 如果job失败了会怎么样呢?1、修改⽂件,故意引⼊⼀个错误:[root@ren7 yaml]# cat
apiVersion: batch/v1kind: Jobmetadata: name: jobspec: template: spec: containers: - name: job image: /learn/busybox:latest command: ["echorrr","hello kubernetes"] restartPolicy: Never2、删除之前的job[root@ren7 yaml]# kubectl delete -f
"job" deleted[root@ren7 yaml]# kubectl get podNo resources found.3、运⾏新的job并查看状态[root@ren7 yaml]# kubectl apply -f
/job created[root@ren7 yaml]# kubectl get podNAME READY STATUS RESTARTS AGEjob-l9spb 0/1 ContainerCannotRun 0 5sjob-mk5fp 0/1 ContainerCreating 0 1s[root@ren7 yaml]# kubectl get podNAME READY STATUS RESTARTS AGEjob-2phbq 0/1 ContainerCreating 0 2sjob-l9spb 0/1 ContainerCannotRun 0 16sjob-mk5fp 0/1 ContainerCannotRun 0 12s 发现没有创建成功,显⽰0 并且可以看到有多个pod,状态均不正常。4、使⽤ kubectldescribe pod 查看某个pod的启动⽇志[root@ren7 yaml]# kubectl describe pods job-2phbqName: job-2phbqNamespace: defaultNode: 192.168.11.5/192.168.11.5Start Time: Fri, 25 Oct 2019 19:02:56 +0800Labels: controller-uid=f7746782-f716-11e9-867d-000c297d011c job-name=jobAnnotations:
Ready False
ContainersReady False
PodScheduled True
Volumes: default-token-qvqql: Type: Secret (a volume populated by a Secret) SecretName: default-token-qvqql Optional: falseQoS Class: BestEffortNode-Selectors:
"job" deleted[root@ren7 yaml]# kubectl get podNo resources found. 如果将 restartPolicy 设置为 OnFailure 会怎么样?下⾯我们实践⼀下,修改 后重新启动。[root@ren7 yaml]# vim #依旧是错误命令,且改了restartPolicy: OnFailure[root@ren7 yaml]# kubectl apply -f
/job created[root@ren7 yaml]# kubectl get podNAME READY STATUS RESTARTS AGEjob-9fd6w 0/1 ContainerCreating 0 2s[root@ren7 yaml]# kubectl get podNAME READY STATUS RESTARTS AGEjob-9fd6w 0/1 RunContainerError 0 14s[root@ren7 yaml]# kubectl get podNAME READY STATUS RESTARTS AGEjob-9fd6w 0/1 RunContainerError 1 27s[root@ren7 yaml]# kubectl get podNAME READY STATUS RESTARTS AGEjob-9fd6w 0/1 CrashLoopBackOff 2 36s 完成依然为0。 这⾥只有⼀个 Pod,不过 RESTARTS 为 2,⽽且不断增加,说明 OnFailure ⽣效,容器失败后会⾃动重启。三、并⾏执⾏job 有时,我们希望能同时运⾏多个pod,提⾼job的执⾏效率。1、设置parallelism[root@ren7 yaml]# cat
apiVersion: batch/v1kind: Jobmetadata: name: jobspec: parallelism: 2 template: spec: containers: - name: job image: /learn/busybox:latest restartPolicy: Never2、执⾏该yaml⽂件[root@ren7 yaml]# kubectl apply -f
/job created3、查看job[root@ren7 yaml]# kubectl get podNAME READY STATUS RESTARTS AGEjob-5jkpz 0/1 ContainerCreating 0 3sjob-svs94 0/1 ContainerCreating 0 3s[root@ren7 yaml]# kubectl get podNAME READY STATUS RESTARTS AGEjob-5jkpz 0/1 Completed 0 10sjob-svs94 0/1 Completed 0 10s job⼀共启动了两个pod,⽽且AGE相同,可见是并⾏运⾏的。4、还可以通过 completions 设置 Job 成功完成 Pod 的总数:[root@ren7 yaml]# cat
apiVersion: batch/v1kind: Jobmetadata: name: jobspec: parallelism: 2 completions: 6 template: spec: containers: - name: job image: /learn/busybox:latest restartPolicy: Never5、查看相应的pod和job[root@ren7 yaml]# kubectl get podNAME READY STATUS RESTARTS AGEjob-82gll 0/1 Completed 0 18sjob-gsn55 0/1 Completed 0 18sjob-h6gnw 0/1 Completed 0 11sjob-nz5vs 0/1 Completed 0 14sjob-v48cr 0/1 Completed 0 15sjob-vx5gt 0/1 Completed 0 10s[root@ren7 yaml]# kubectl get jobNAME COMPLETIONS DURATION AGEjob 6/6 11s 72s 如果不指定 completions 和 parallelism,默认值均为 1。 上⾯的例⼦只是为了演⽰ Job 的并⾏特性,实际⽤途不⼤。不过现实中确实存在很多需要并⾏处理的场景。⽐如批处理程序,每个副本(Pod)都会从任务池中读取任务并执⾏,副本越多,执⾏时间就越短,效率就越⾼。这种类似的场景都可以⽤ Job 来实现。四、定时执⾏job Linux 中有 cron 程序定时执⾏任务,Kubernetes 的 CronJob 提供了类似的功能,可以定时执⾏ Job。1、CronJob 配置⽂件⽰例如下:[root@ren7 yaml]# cat
apiVersion: batch/v1beta1kind: CronJobmetadata: name: timingspec: schedule: "*/1 * * * *" jobTemplate: spec: template: spec: containers: - name: timing image: /learn/busybox:latest command: ["echo","hello k8s cronjob!"] restartPolicy: OnFailure ① batch/v1beta1 是当前 CronJob 的 apiVersion。 ② 指明当前资源的类型为 CronJob。 ③ schedule 指定什么时候运⾏ Job,其格式与 Linux cron ⼀致。这⾥ */1 * * * * 的含义是每⼀分钟启动⼀次。 ④ jobTemplate 定义 Job 的模板,格式与前⾯ Job ⼀致。2、通过 kubectl apply 创建 CronJob[root@ren7 yaml]# kubectl apply -f
/timing created3、查看crontab的状态[root@ren7 yaml]# kubectl get jobNo resources found.[root@ren7 yaml]# kubectl get cronjobNAME SCHEDULE SUSPEND ACTIVE LAST SCHEDULE AGEtiming */1 * * * * False 0
"timing" deleted[root@ren7 yaml]# kubectl get podsNo resources found.
发布者:admin,转转请注明出处:http://www.yc00.com/news/1688592925a153150.html
评论列表(0条)