k8s job的使用
k8s job的使用
1.執行一次性容器
容器按照持續執行的時間可分為兩類:
服務類容器
服務類容器通常持續提供服務,需要一直執行,比如 http server,daemon 等。
工作類容器
工作類容器則是一次性任務,比如批處理程式,完成後容器就退出。
Kubernetes 的 Deployment、ReplicaSet 和 DaemonSet 都用於管理服務類容器;對於工作類容器,我們用 Job。
先看一個簡單的 Job 配置檔案 myjob.yml:
①batch/v1是當前job的Version
② 指定當前資源的型別時Job
③restartPolicy是指當前的重啟策略。對於 Job,只能設定為Never
OnFailure
。對於其他 controller(比如 Deployment)可以設定為Always
。
啟動這個job
[root@k8s-master k8s]# kubectl apply -f myjob.yml job.batch/myjob created
kubectl get job 檢視這個job
[root@k8s-master k8s]# kubectl get job NAME COMPLETIONS DURATION AGE myjob 1/1 23s 3m45s
completions為 1/1 表示成功運行了這個job
kubectl get pod 檢視pod的狀態
[root@k8s-master k8s]# kubectl get pod NAME READY STATUS RESTARTS AGE myjob-29qlw 0/1 Completed 0 4m5s
看到 狀態為Completed表示這個job已經執行完成
kubectl logs 命令檢視這個 pod的日誌
[root@k8s-master k8s]# kubectl logs myjob-29qlw hello k8s job!
2.Job的執行失敗
將配置檔案中的正確命令 echo 換成一個不存在的錯誤命令 invalid_command
檢視job的時候發現COMPLETIONS 0/1 這個job沒有完成。但是我們的重啟策略是never,所以他不會重啟,如果我們將策略設定為 onFaillure
[root@k8s-master k8s]# kubectl delete -f myjob.yml job.batch "myjob" deleted [root@k8s-master k8s]# kubectl apply -f myjob.yml job.batch/myjob created
通過kubectl get pod 檢視pod
發現2分鐘42秒 容器重啟了4次
通過 kubectl describe pod 檢視pod的日誌
如果容器啟動失敗,它會自動回退並重啟。
先前的版本是一個容器重啟失敗,他會繼續開啟一個新的容器,他檢測completions 是否為1 如果不為1,就會一直開啟新的容器,這樣做非常浪費資源,而且有可能會讓CPU記憶體等資源耗盡,新版本做了改進不會一直建立,而是一直回退重啟這個失敗的容器。並且重啟次數達到一定次數,會自動刪除這個容器不在執行這個job。我認為這是一個很睿智的改進。
3.並行執行job
有時,我們希望能同時執行多個 Pod,提高 Job 的執行效率。這個可以通過parallelism
設定。
將上面的錯誤命令改成正確的echo
job一共啟動了兩個pod,而且AGE是相同,證明是併發執行完成的。
上面通過kubectl get job 看到 completions的預設值為1,我們現在將它設定為6
重新啟動 Job 檢視到 completions 變為了 6
通過檢視pod 建立的時間 發現 總有個兩個相近完成時間建立的pod ,驗證了併發執行為2的設定
上面的例子只是為了演示 Job 的並行特性,實際用途不大。不過現實中確實存在很多需要並行處理的場景。比如批處理程式,每個副本(Pod)都會從任務池中讀取任務並執行,副本越多,執行時間就越短,效率就越高。這種類似的場景都可以用 Job 來實現。
4.定時執行Job
Linux 中有 cron 程式定時執行任務,Kubernetes 的 CronJob 提供了類似的功能,可以定時執行 Job。
CronJob 配置檔案cronjob.yml示例如下:
apiVersion: batch/v2alpha1 kind: CronJob metadata: name: hello spec: schedule: "*/1 * * * *" jobTemplate: spec: template: spec: containers: - name: hello image: busybox command: ["echo","hello k8s job!"] restartPolicy: OnFailure
①batch/v2alpha1
是當前 CronJob 的apiVersion
。
② 指明當前資源的型別為CronJob
。
③schedule
指定什麼時候執行 Job,其格式與 Linux cron 一致。這裡*/1 * * * *
的含義是每一分鐘啟動一次。
④jobTemplate
定義 Job 的模板,格式與前面 Job 一致。
執行後報如下錯誤:
[root@k8s-master k8s]# kubectl apply -f cronjob.yml error: unable to recognize "cronjob.yml": no matches for kind "CronJob" in version "batch/v2alpha1"
我們只需要更改一下/etc/kubernetes/manifests/kube-apiserver.yaml,增加如下配置,重啟 kubelet服務,然後重新執行這個cronJob
[root@k8s-master k8s]# systemctl restart kubelet
確認這個api已被載入
再次執行這個cronjob
[root@k8s-master k8s]# kubectl apply -f cronjob.yml cronjob.batch/hello created
等待幾分鐘,然後通過kubectl get jobs
檢視 Job 的執行情況:
通過AGE發現 每個job都比之前的多了 60s,正好符合我們的預期
使用 kubect get pods 和 kubectl logs 命令檢視
5.小結
執行容器化應用是 Kubernetes 最重要的核心功能。為滿足不同的業務需要,Kubernetes 提供了多種 Controller,包括 Deployment、DaemonSet、Job、CronJob 等。