学习极客时间上的《深入剖析Kubernetes》
秉持眼过千遍不如手过一遍的原则。动手实践并记录结果
对应章节:22 | 撬动离线业务:Job与CronJob
Job
创建Job
1 2 3 4 5 6 7 8 9 10 11 12 13 apiVersion: batch/v1 kind: Job metadata: name: my-job spec: template: spec: containers: - name: hello image: busybox imagePullPolicy: IfNotPresent command: ["echo", " hello, Job" ] restartPolicy: Never
1 2 3 $ kubectl get jobs -o wide NAME COMPLETIONS DURATION AGE CONTAINERS IMAGES SELECTOR my-job 1/1 3s 102s hello busybox controller-uid=c85adfa3-f52f-40f7-a772-cab087df71cf
1 2 3 $ kubectl get pod NAME READY STATUS RESTARTS AGE my-job-d4rnl 0/1 Completed 0 2m4s
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 $ kubectl describe pod my-job-d4rnl Name: my-job-d4rnl Namespace: default Priority: 0 Node: k8s-node4/10.160.18.184 Start Time: Mon, 03 Aug 2020 14:05:42 +0800 Labels: controller-uid=c85adfa3-f52f-40f7-a772-cab087df71cf job-name=my-job Annotations: <none> Status: Succeeded IP: 172.1.3.12 IPs: IP: 172.1.3.12 Controlled By: Job/my-job ... Events: Type Reason Age From Message ---- ------ ---- ---- ------- Normal Scheduled 2m43s default-scheduler Successfully assigned default/my-job-d4rnl to k8s-node4 Normal Pulled 2m42s kubelet, k8s-node4 Container image "busybox" already present on machine Normal Created 2m41s kubelet, k8s-node4 Created container hello Normal Started 2m41s kubelet, k8s-node4 Started container hello $ kubectl describe jobs my-job Name: my-job Namespace: default Selector: controller-uid=c85adfa3-f52f-40f7-a772-cab087df71cf Labels: controller-uid=c85adfa3-f52f-40f7-a772-cab087df71cf job-name=my-job Annotations: Parallelism: 1 Completions: 1 Start Time: Mon, 03 Aug 2020 14:05:41 +0800 Completed At: Mon, 03 Aug 2020 14:05:44 +0800 Duration: 3s Pods Statuses: 0 Running / 1 Succeeded / 0 Failed Pod Template: Labels: controller-uid=c85adfa3-f52f-40f7-a772-cab087df71cf job-name=my-job Containers: hello: Image: busybox Port: <none> Host Port: <none> Command: echo hello, Job Environment: <none> Mounts: <none> Volumes: <none> Events: Type Reason Age From Message ---- ------ ---- ---- ------- Normal SuccessfulCreate 3m56s job-controller Created pod: my-job-d4rnl Normal Completed 3m54s job-controller Job completed $ kubectl logs my-job-d4rnl hello, Job
分析
Job创建后,pod模版中添加了一个controller-uid为一个随机字符串的label,而job则拥有一个同样id的selector
而job完成后,进入了completed的状态
删除对应的pod
1 2 $ kubectl delete pod my-job-d4rnl pod "my-job-d4rnl" deleted
删除对应的pod后,会发现没有再创建新的pod
错误的job
1 2 3 4 5 6 7 8 9 10 11 12 13 apiVersion: batch/v1 kind: Job metadata: name: my-job spec: template: spec: containers: - name: hello image: busybox imagePullPolicy: IfNotPresent command: ["exit 1 "] restartPolicy: Never
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 $ kubectl get jobs -o wide NAME COMPLETIONS DURATION AGE CONTAINERS IMAGES SELECTOR my-job 0/1 54s 54s hello busybox controller-uid=9ac8a40c-1548-4683-bbd6-870a236199bf $ kubectl describe job my-job Name: my-job Namespace: default Selector: controller-uid=9ac8a40c-1548-4683-bbd6-870a236199bf Labels: controller-uid=9ac8a40c-1548-4683-bbd6-870a236199bf job-name=my-job Annotations: Parallelism: 1 Completions: 1 Start Time: Mon, 03 Aug 2020 14:21:59 +0800 Pods Statuses: 1 Running / 0 Succeeded / 4 Failed Pod Template: Labels: controller-uid=9ac8a40c-1548-4683-bbd6-870a236199bf job-name=my-job Containers: hello: Image: busybox Port: <none> Host Port: <none> Command: exit 1 Environment: <none> Mounts: <none> Volumes: <none> Events: Type Reason Age From Message ---- ------ ---- ---- ------- Normal SuccessfulCreate 77s job-controller Created pod: my-job-n8qf2 Normal SuccessfulCreate 75s job-controller Created pod: my-job-j484w Normal SuccessfulCreate 65s job-controller Created pod: my-job-576nv Normal SuccessfulCreate 45s job-controller Created pod: my-job-xdk29 Normal SuccessfulCreate 5s job-controller Created pod: my-job-ghfcv
1 2 3 4 5 6 7 $ kubectl get pods NAME READY STATUS RESTARTS AGE my-job-576nv 0/1 ContainerCannotRun 0 109s my-job-ghfcv 0/1 ContainerCannotRun 0 49s my-job-j484w 0/1 ContainerCannotRun 0 119s my-job-n8qf2 0/1 ContainerCannotRun 0 2m1s my-job-xdk29 0/1 ContainerCannotRun 0 89s
由于restartPolicy=Never
,可以看到,对应的pod的RESTARTS始终为0,job-controller会不停的创建新的pod。
现在,讲restartPolicy改为OnFailure
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 $ kubectl describe job my-job Name: my-job Namespace: default Selector: controller-uid=d404af28-5d83-4943-85cf-301c2910d967 Labels: controller-uid=d404af28-5d83-4943-85cf-301c2910d967 job-name=my-job Annotations: Parallelism: 1 Completions: 1 Start Time: Mon, 03 Aug 2020 14:28:45 +0800 Pods Statuses: 1 Running / 0 Succeeded / 0 Failed Pod Template: Labels: controller-uid=d404af28-5d83-4943-85cf-301c2910d967 job-name=my-job Containers: hello: Image: busybox Port: <none> Host Port: <none> Command: exit 1 Environment: <none> Mounts: <none> Volumes: <none> Events: Type Reason Age From Message ---- ------ ---- ---- ------- Normal SuccessfulCreate 2m50s job-controller Created pod: my-job-2ndzd $ kubectl get pod NAME READY STATUS RESTARTS AGE my-job-2ndzd 0/1 CrashLoopBackOff 3 96s
可以看到,对应的pod在不断的重启
并行作业
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 apiVersion: batch/v1 kind: Job metadata: name: my-job spec: parallelism: 2 completions: 4 template: metadata: labels: name: my-job spec: containers: - name: my-job image: busybox imagePullPolicy: IfNotPresent command: ["echo", "hello Job" ] restartPolicy: Never
1 2 3 4 5 6 $ kubectl get pods -l name=my-job NAME READY STATUS RESTARTS AGE my-job-2x4lc 0/1 Completed 0 10s my-job-lnhxx 0/1 Completed 0 7s my-job-md4nr 0/1 Completed 0 10s my-job-s5znf 0/1 Completed 0 7s
1 2 3 $ kubectl get jobs NAME COMPLETIONS DURATION AGE my-job 4/4 5s 16s
可以根据pod的时间看出,my-job-2x4lc
和my-job-md4nr
是同一时间创建的,而另外两个pod则在其之后3s创建的。
CronJob
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 apiVersion: batch/v1beta1 kind: CronJob metadata: name: hello spec: schedule: "*/1 * * * *" jobTemplate: spec: template: spec: containers: - name: hello image: busybox imagePullPolicy: IfNotPresent args: - /bin/sh - -c - date; echo Hello from Kubernetes Cluster restartPolicy: OnFailure
1 2 3 4 5 6 7 8 9 10 11 12 $ kubectl get cronjobs.batch NAME SCHEDULE SUSPEND ACTIVE LAST SCHEDULE AGE hello */1 * * * * False 0 46s 2m39s $ kubectl get jobs NAME COMPLETIONS DURATION AGE hello-1596438780 1/1 2s 2m38s hello-1596438840 1/1 1s 98s hello-1596438900 1/1 2s 38s $ kubectl get pods NAME READY STATUS RESTARTS AGE hello-1596438720-2j5t4 0/1 Completed 0 3s hello-1596438780-lbwnz 0/1 Completed 0 12s
1 2 3 4 5 6 7 8 9 10 11 12 13 14 $ kubectl describe pod hello-1596438960-4c5ft Name: hello-1596438960-4c5ft Namespace: default Priority: 0 Node: k8s-node4/10.160.18.184 Start Time: Mon, 03 Aug 2020 15:16:03 +0800 Labels: controller-uid=e421bffd-df9f-4342-8c3f-a852076deb6e job-name=hello-1596438960 Annotations: <none> Status: Succeeded IP: 172.1.3.42 IPs: IP: 172.1.3.42 Controlled By: Job/hello-1596438960
1 2 3 4 5 6 7 8 $ kubectl describe job hello-1596438960 Name: hello-1596438960 Namespace: default Selector: controller-uid=e421bffd-df9f-4342-8c3f-a852076deb6e Labels: controller-uid=e421bffd-df9f-4342-8c3f-a852076deb6e job-name=hello-1596438960 Annotations: <none> Controlled By: CronJob/hello
分析
从yaml文件中可以看到,jobTemplate的描述同Job,所以,CronJob实际上是一个job的调度器。
CronJob创建了以hello-
+随机串的方式,创建了随后的多个Job,再由Job控制Pod运行
而从pod一层一层往上追溯:
Pod测controller为Job
Job的controller为CronJob
小结
本章节主要了解了一下Job和CronJob。需要理解的是:
Job控制pod,且Job仅运行一次
CronJob通过定时创建Job来运行