k8s运行容器之Job应用(6)

k8s运行容器之Job应用(6)

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: Status: FailedIP: 172.20.72.146Controlled By: Job/jobContainers: job: Container ID: docker://858e1dffa45cad2e43fa096b002a925f15dfc07ad08b406c4c2ad01fe68c2ccd Image: /learn/busybox:latest Image ID: docker-pullable:///learn/busybox@sha256:dd97a3fe6d721c5cf03abac0f50e2848dc583f7c4e41bf39102ceb42edfd1808 Port: Host Port: Command: echorrr hello kubernetes State: Terminated Reason: ContainerCannotRun Message: OCI runtime create failed: container_:348: starting container process caused "exec: "echorrr": executable file not found in $PATH": unknown Exit Code: 127 Started: Fri, 25 Oct 2019 19:02:58 +0800 Finished: Fri, 25 Oct 2019 19:02:58 +0800 Ready: False Restart Count: 0 Environment: Mounts: /var/run/secrets//serviceaccount from default-token-qvqql (ro)Conditions: Type Status Initialized True

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: Tolerations: Events: Type Reason Age From Message ---- ------ ---- ---- ------- Normal Scheduled 11m default-scheduler Successfully assigned default/job-2phbq to 192.168.11.5 Normal Pulling 11m kubelet, 192.168.11.5 Pulling image "/learn/busybox:latest" Normal Pulled 11m kubelet, 192.168.11.5 Successfully pulled image "/learn/busybox:latest" Normal Created 11m kubelet, 192.168.11.5 Created container job Warning Failed 11m kubelet, 192.168.11.5 Error: failed to start container "job": Error response from daemon: OCI runtime create failed: container_:348: starting container process caused "exec: "echorrr": executable file not found i  ⽇志显⽰没有可执⾏程序符合我们的预期。为什么kubectl get pod 会看到这么多个失败的pod?  原因是:当第⼀个 Pod 启动时,容器失败退出,根据 restartPolicy: Never,此失败容器不会被重启,但 Job DESIRED 的 Pod 是 1,⽬前 SUCCESSFUL 为 0,不满⾜,所以 Jobcontroller 会启动新的 Pod,直到 SUCCESSFUL 为 1。对于我们这个例⼦,SUCCESSFUL 永远也到不了 1,所以 Job controller 会⼀直创建新的 Pod。为了终⽌这个⾏为,只能删除 Job。[root@ren7 yaml]# kubectl delete -f

"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 15s4、等待⼏分钟再次查看jobs的执⾏情况[root@ren7 yaml]# kubectl get jobNAME COMPLETIONS DURATION AGEtiming-1572005160 1/1 3s 2m29stiming-1572005220 1/1 3s 89stiming-1572005280 1/1 3s 29s  可以看到每隔⼀分钟就会启动⼀个job。  过段时间查看pod[root@ren7 yaml]# kubectl get podNAME READY STATUS RESTARTS AGEtiming-1572005340-5fds8 0/1 Completed 0 2m40stiming-1572005400-8qsd4 0/1 Completed 0 99stiming-1572005460-hnsh7 0/1 Completed 0 39s5、执⾏kubectl logs 可查看某个 Job 的pod运⾏⽇志:[root@ren7 yaml]# kubectl logs timing-1572005340-5fds8hello k8s cronjob!  查看pod会遗留很多已经完成的pod,只需要删除即可。[root@ren7 yaml]# kubectl delete -f

"timing" deleted[root@ren7 yaml]# kubectl get podsNo resources found.

发布者:admin,转转请注明出处:http://www.yc00.com/news/1688592925a153150.html

相关推荐

发表回复

评论列表(0条)

  • 暂无评论

联系我们

400-800-8888

在线咨询: QQ交谈

邮件:admin@example.com

工作时间:周一至周五,9:30-18:30,节假日休息

关注微信