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 等。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM