Kubernetes之Job與CronJob

1、Job概述

一)、Job負責處理短暫的一次性任務,即僅執行一次的任務,它保證批處理任務的一個或多個pod成功結束。今天介紹另外⼀類資源對象:Job,咱們在平常的工做中常常都會遇到⼀些須要進行批量數據處理和分析的需求,固然也會有按時間來進行調度的⼯做,Kubernetes 集羣中爲咱們提供了 JobCronJob 兩種資源對象來應對這種需求。node

* Job 負責處理任務,即僅執⾏⼀次的任務,它保證批處理任務的⼀個或多個 Pod 成功結束。
* CronJob 則就是在 Job 上加上了時間調度。

Kubernetes支持如下幾種Job:vim

* 非並行Job:一般建立一個Pod直到其成功結束;
* 固定結束次數的Job:在spec字段下添加completions字段。建立多個Pod,直到知足completions規定的數值。若是不添加的話,默認狀況下是1個;
* 帶有工做隊列的並行Job:在spec字段下添加Parallelism字段。表示幾個job同時並行工做。若是不添加的話,默認狀況下是1個;

根據能夠設置completions字段、Parallelism字段,能夠將Job分爲如下幾種:
Kubernetes之Job與CronJobapi

二)、Job Controller
Job Controller負責根據Job yaml文件中Spec字段定義的內容建立Pod,並持續監控Job的狀態,直至其成功結束。若是失敗,則根據restartPolicy(只支持OnFailure和Never,不支持Always)決定是否建立新的pod再次重試任務。
如圖:
Kubernetes之Job與CronJob併發

三)、應用示例
示例:app

[root@master job]# cat job.yaml 
kind: Job
apiVersion: batch/v1
metadata:
  name: test-job
spec:
  template:
    metadata:
      name: test-job
    spec:
      containers:
      - name: hello
        image: busybox
        command: ["echo","hello k8s job"]
      restartPolicy: Never

[root@master job]# kubectl apply -f job.yaml            //生成Job資源
[root@master job]# kubectl get job                        //查看Job
NAME       COMPLETIONS   DURATION   AGE
test-job   1/1           2s         5s
[root@master job]# kubectl get pod -o wide      //查看Job運行的詳細信息
NAME             READY   STATUS      RESTARTS   AGE   IP            NODE     NOMINATED NODE   READINESS GATES
test-job-rq9ws   0/1     Completed   0          25s   10.244.1.15   node01   <none>           <none>
[root@master job]# kubectl logs test-job-rq9ws             //查看經過Job生成的Pod的日誌信息
hello k8s job
[root@master job]# kubectl delete jobs test-job        
//刪除Job,那麼對應的pod也會被刪除!

注:若是容器內執行任務有誤,會根據容器的重啓策略操做容器,不過這裏的容器重啓策略只能是: Never和 OnFailure。ide

四)、提升Job的執行效率測試

* 咱們能夠在Job.spec字段下加上parallelism選項。表示同時運行多少個Pod執行任務。
* 咱們能夠在Job.spec字段下加上completions選項。表示總共須要完成Pod的數量。
* 舉例將上述Job任務進行更改。提示,更改Job任務的時候,須要先將原來的Job資源對象刪除

示例:3d

[root@master job]# cat job.yaml 
kind: Job
apiVersion: batch/v1
metadata:
  name: test-job
spec:
  parallelism: 2
  completions: 10
  template:
    metadata:
      name: test-job
    spec:
      containers:
      - name: hello
        image: busybox
        command: ["echo","hello k8s job"]
      restartPolicy: Never

[root@master job]# kubectl apply -f job.yaml 
[root@master job]# kubectl get job
NAME       COMPLETIONS   DURATION   AGE
test-job   10/10         7s         15s
//能夠看出是運行了10個任務

查看Job運行的詳細信息,如圖:
Kubernetes之Job與CronJobrest

示例:日誌

[root@master job]# cat job.yaml 
kind: Job
apiVersion: batch/v1
metadata:
  name: test-job
spec:
  backoffLimit: 5
  activeDeadlineSeconds: 100
  template:
    metadata:
      name: test-job
    spec:
      containers:
      - name: hello
        image: busybox
        command: ["echddddddo","hello k8s job"]
      restartPolicy: Never

[root@master job]# kubectl apply -f job.yaml 
[root@master job]# kubectl get job
NAME       COMPLETIONS   DURATION   AGE
test-job   0/1           2m28s      2m28s
[root@master job]# kubectl get pod 
NAME             READY   STATUS               RESTARTS   AGE
test-job-4lzsc   0/1     ContainerCannotRun   0          111s
test-job-8q659   0/1     ContainerCannotRun   0          2m42s
test-job-hjjbx   0/1     ContainerCannotRun   0          2m41s
test-job-qcf4z   0/1     ContainerCannotRun   0          2m31s

這個示例能夠看出:

  • backoffLimit:表示出現錯誤重試次數;
  • activeDeadlineSeconds:表示Job在集羣中存活的時間;
    關於Job就簡單介紹這麼多了!

2、CronJob

* CronJob即定時任務,相似於Linux系統中的crontab,在指定的時間週期運行指定的任務。

* CronJob yaml文件中的spec字段下的schedule是用來定義的時間間隔的,其用法與crontab同樣(分、時、日、月、周);
jobTemplate字段指定須要運行的任務;

* 在kubernetes 1.15中,使用CronJob須要使用API的batch/v2alpha1這個版本,可是,kubernetes自己並無這個版本,以下:

在kubernetes 1.15中,使用CronJob須要使用API的batch/v2alpha1這個版本,可是,kubernetes自己並無這個版本,以下:

[root@master job]# kubectl api-versions | grep batch/v2alpha1

須要進行如下操做使Kubernetes羣集支持這個batch/v2alpha1版本,操做以下:

[root@master ~]# vim /etc/kubernetes/manifests/kube-apiserver.yaml
在spec字段的command字段下添加如下內容:
    - --runtime-config=batch/v2alpha1=true
[root@master ~]# systemctl restart kubelet.service
//重啓kubelet服務
[root@master ~]# kubectl api-versions | grep batch/v2alpha1
batch/v2alpha1

附加圖片一張:
Kubernetes之Job與CronJob
一)、應用示例

[root@master job]# cat cronjob.yaml 
kind: CronJob
apiVersion: batch/v2alpha1
metadata:
  name: hello
spec:
  schedule: "*/1 * * * *"
  jobTemplate:
    spec:
      template:
        spec:
          containers:
          - name: hello
            image: busybox
            command: ["echo","hello cronjob"]
          restartPolicy: Never

[root@master job]# kubectl apply -f cronjob.yaml

查看效果:
Kubernetes之Job與CronJob
注:此時查看Pod的狀態,會發現,每分鐘都會運行一個新的Pod來執行命令規定的任務。
這樣測試是沒有問題的,可是若是指定計劃任務時,就會發現它不會像預期的效果同樣!
二)、應用示例

[root@master job]# cat cronjob.yaml 
kind: CronJob
apiVersion: batch/v2alpha1
metadata:
  name: hello
spec:
  schedule: "27 18 17 8 1"   //分別表明着「分、時、日、月、周」
  jobTemplate:
    spec:
      template:
        spec:
          containers:
          - name: hello
            image: busybox
            command: ["echo","hello cronjob"]
          restartPolicy: Never
[root@master job]#  date
2020年 08月 17日 星期一 18:27:01 CST
[root@master job]# kubectl get pod
No resources found.

注:

  • 此時仍然不能正常運行指定時間的cronJob,這是由於K8s官方在cronjob這個資源對象的支持中尚未完善此功能,還待開發。

  • 跟Job資源同樣在cronjob.spec.jobTemplate.spec下一樣支持併發Job參數:parallelism,也支持完成Pod的總數參數:completions
相關文章
相關標籤/搜索