Job資源在建立時會立即運行pod。但是許多batch任務需要在特定的時間運行,或者在指定的時間間隔內重複執行。類似Linux的CronJob。 k8s中的cron任務透過建立CronJob資源進行設定。在設定的時間,k8s將根據在CronJob物件中設定的Job樣板來建立Job資源。建立Job資源後,再根據Job的pod樣板來建立一個或者多個pod副本。

1. 建立一個CronJob

建立 cronjob.yaml ,以下是每15分鐘執行一個job任務。

時間表從左到右為:分 時 每月第幾天 月 星期幾 ,跟Linux的crontab時間表是一樣的。

apiVersion: batch/v1
kind: CronJob
metadata:
  name: batch-job-every-fifteen-minutes
spec:
  schedule: "0,15,30,45 * * * *"            # 時間使用方式跟linux一樣
  jobTemplate:                              # 用來定義job的樣板
    spec:
      template:
        metadata:
          labels:
            app: periodic-batch-job
        spec:
          restartPolicy: OnFailure
          containers:
          - name: main
            image: luksa/batch-job

2. 建立一個CronJob

[root@cp200 ch4]# kubectl create -f cronjob.yaml
cronjob.batch/batch-job-every-fifteen-minutes created

3. 查看CronJob、Job、Pod

由於時間還未到,所以還看不到job跟pod有再執行。

[root@cp200 ch4]# kubectl get cj
NAME                              SCHEDULE             SUSPEND   ACTIVE   LAST SCHEDULE   AGE
batch-job-every-fifteen-minutes   0,15,30,45 * * * *   False     0        <none>          16s
[root@cp200 ch4]# kubectl get job
No resources found in default namespace.
[root@cp200 ch4]# kubectl get po
No resources found in default namespace.

等到當下時間符合設定的時間,再次執行查看CronJob、Job、Pod

[root@cp200 ch4]# kubectl get cj
NAME                              SCHEDULE             SUSPEND   ACTIVE   LAST SCHEDULE   AGE
batch-job-every-fifteen-minutes   0,15,30,45 * * * *   False     0        2m21s           13m
[root@cp200 ch4]# kubectl get job
NAME                                       COMPLETIONS   DURATION   AGE
batch-job-every-fifteen-minutes-27470820   0/1           115s       115s
[root@cp200 ch4]# 
[root@cp200 ch4]# kubectl get po
NAME                                             READY   STATUS    RESTARTS   AGE
batch-job-every-fifteen-minutes-27470820-stc9r   1/1     Running   0          2m1s

補充:CronJob透過CronJob規範中設定的JobTemplete屬性建立job資源。

了解計畫任務的運行方式

在排程的大約時間內,CronJob會建立Job,然後Job建立pod。

但可能發生Job或pod建立並執行的時間相對較晚,如果對這項工作有高的要求,job開始時間不能落後預定時間過多,這種情況下可以設定 spec.startingDeadlineSeconds 來指定截止時間。如下:

apiVersion: batch/v1
kind: CronJob
spec:
  schedule: "0,15,30,45 * * * *"
  startingDeadlineSeconds: 15        # 設定job的截止時間

以上例子中,假如job執行時間應該在10:30:00,如果因為任何原因10:30:15不起動,任務將不會執行,並且將顯示為Failed。

在正常情況下,CronJob總是為排程中設定的job每一個執行建立一個Job,但可能會同時建立兩個Job,或者根本沒有建立。 為了解決第一個問題,你的任務應該是冪等的(多次而不是一次執行得到不希望的結果,多次執行還是一樣的結果)。對於第二個問題,請確保下一個任務執行完成本應該由上一次的(錯過的)執行完成的任何工作。