1. 程式人生 > 實用技巧 >k8s 中Job、Cronjob

k8s 中Job、Cronjob

Job負責處理任務,即僅執行一次的任務,它保證批處理任務的一個或多個Pod成功結束。

CronJob則就是在Job上加上了時間排程。

一、job

Job這個資源物件來建立一個任務,我們定一個Job來執行一個倒計時的任務,定義YAML檔案

apiVersion: batch/v1
kind: Job
metadata:
  name: job-demo
spec:
  template:
    metadata:
      name: job-demo
    spec:
      restartPolicy: Never
      containers:
      - name: counter
        image: busybox
        command:
        - "bin/sh"
        - "-c"
        - "for i in 9 8 7 6 5 4 3 2 1; do echo $i; done"

注意JobRestartPolicy僅支援NeverOnFailure兩種,不支援Always,我們知道Job就相當於來執行一個批處理任務,執行完就結束了,如果支援Always的話是不是就陷入了死迴圈了?

二、CronJob

CronJob其實就是在Job的基礎上加上了時間排程,我們可以:在給定的時間點執行一個任務,也可以週期性地在給定時間點執行。這個實際上和我們Linux中的crontab就非常類似了。

一個CronJob物件其實就對應中crontab檔案中的一行,它根據配置的時間格式週期性地執行一個Job,格式和crontab也是一樣的。

crontab的格式如下:

分 時 日 月 星期 要執行的命令第1列分鐘0~59 第2列小時0~23) 第3列日1~31 第4列月1~12 第5列星期0~7(0和7表示星期天) 第6列要執行的命令

現在,我們用CronJob來管理我們上面的Job任務,

我們這裡的KindCronJob了,要注意的是.spec.schedule欄位是必須填寫的,用來指定任務執行的週期,格式就和crontab一樣,另外一個欄位是.spec.jobTemplate, 用來指定需要執行的任務,格式當然和Job是一致的。還有一些值得我們關注的欄位.spec.successfulJobsHistoryLimit.spec.failedJobsHistoryLimit,表示歷史限制,是可選的欄位。它們指定了可以保留多少完成和失敗的Job,預設沒有限制,所有成功和失敗的Job都會被保留。然而,當執行一個Cron Job

時,Job可以很快就堆積很多,所以一般推薦設定這兩個欄位的值。如果設定限制的值為 0,那麼相關型別的Job完成後將不會被保留.

當然,也可以用kubectl run來建立一個CronJob

kubectl run hello --schedule="*/1 * * * *" --restart=OnFailure --image=busybox -- /bin/sh -c "date; echo Hello from the Kubernetes cluster"
$ kubectl get cronjob
NAME      SCHEDULE      SUSPEND   ACTIVE    LAST-SCHEDULE
hello     */1 * * * *   False     0         <none>
$ kubectl get jobs
NAME               DESIRED   SUCCESSFUL   AGE
hello-1202039034   1         1            49s
$ pods=$(kubectl get pods --selector=job-name=hello-1202039034 --output=jsonpath={.items..metadata.name} -a)
$ kubectl logs $pods
Mon Aug 29 21:34:09 UTC 2016
Hello from the Kubernetes cluster
$ kubectl delete cronjob hello
cronjob "hello" deleted