K8S之任務計劃Cron Job

Cron Job 是什麼?html

Cron Job 管理基於時間的 Job,即:python

  • 在給定時間點只運行一次數據庫

  • 在給定時間點週期性地運行json

一個 CronJob 對象相似於 crontab (cron table)文件中的一行。它根據指定的預約計劃週期性地運行一個 Jobapi

注意: 在預約計劃中,問號(?)和星號(*)的意義是相同的,表示給定字段的取值是任意可用值。併發

注意: 在 Kubernetes 1.4 版本引入了 ScheduledJob 資源,但從 1.5 版本開始改爲了 CronJob。ide

典型的用法以下所示:jsonp

  • 在給定的時間點調度 Job 運行url

  • 建立週期性運行的 Job,例如:數據庫備份、發送郵件。spa

前提條件

當使用的 Kubernetes 集羣,版本 >= 1.4(對 ScheduledJob),>= 1.5(對 CronJob),當啓動 API Server(參考 爲集羣開啓或關閉 API 版本 獲取更多信息)時,經過傳遞選項 --runtime-config=batch/v2alpha1=true 能夠開啓 batch/v2alpha1 API。

建立 Cron Job

下面是一個 Cron Job 的例子。它會每分鐘運行一個 Job,打印出當前時間並輸出問候語 hello。

% include code.html language=「yaml」 file=「cronjob.yaml」ghlink=「/docs/concepts/workloads/controllers/cronjob.yaml」 %}

下載並運行該示例 Cron Job,而後執行以下命令:


$ kubectl create -f ./cronjob.yaml 
cronjob "hello" created

可選地,使用 kubectl run 建立一個 Cron Job,不須要寫完整的配置:


$ kubectl run hello --schedule="*/1 * * * *" --restart=OnFailure --image=busybox -- /bin/sh -c "date; echo Hello from the Kubernetes cluster" 
cronjob "hello" created

建立該 Cron Job 以後,經過以下命令獲取它的狀態信息:

$ kubectl get cronjob hello 
NAME      SCHEDULE      SUSPEND   ACTIVE    LAST-SCHEDULE 
hello     */1 * * * *   False     0         <none>

如上所示,既沒有 active 的 Job,也沒有被調度的 Job。

等待並觀察建立的 Job,大約一分鐘時間:

$ kubectl get jobs --watch 
NAME     DESIRED   SUCCESSFUL   AGE 
hello-4111706356   1         1         2s

如今能看到一個名稱爲 hello 的 Job 在運行。咱們能夠中止觀察,並再次獲取該 Job 的狀態信息:


$ kubectl get cronjob hello 
NAME      SCHEDULE      SUSPEND   ACTIVE    LAST-SCHEDULE 
hello     */1 * * * *   False     0      Mon, 29 Aug 2016 14:34:00 -0700

應該可以看到名稱爲 「hello」 的 Job 在 LAST-SCHEDULE 指定的時間點被調度了。當前存在 0 個活躍(Active)的 Job,說明該 Job 已經被調度運行完成或失敗。

如今,找到最近一次被調度的 Job 建立的 Pod,可以看到其中一個 Pod 的標準輸出。注意,Job 名稱和 Pod 名稱是不同的。

# Replace "hello-4111706356" with the job name in your system  
$  pods=$(kubectl get pods --selector=job-name=hello-4111706356 --output=jsonpath={.items..metadata.name}) 
$ echo $pods hello-4111706356-o9qcm 

$ kubectl logs pods 
Mon Aug 29 21:34:09 UTC 2016 
Hello from the Kubernetes cluster

刪除 Cron Job

一旦再也不須要 Cron Job,簡單地可使用 kubectl 命令刪除它:

$ kubectl delete cronjob hello 
cronjob "hello" deleted

這將會終止正在建立的 Job。然而,運行中的 Job 將不會被終止,不會刪除 Job 或 它們的 Pod。爲了清理那些 Job 和 Pod,須要列出該 Cron Job 建立的所有 Job,而後刪除它們:

$ kubectl get jobs 
NAME   DESIRED   SUCCESSFUL   AGE hello-1201907962   1         1            11m 
hello-1202039034   1         1            8m ... 


$ kubectl delete jobs hello-1201907962 hello-1202039034 ... 
job "hello-1201907962" deleted 
job "hello-1202039034" deleted

一旦 Job 被刪除,由 Job 建立的 Pod 也會被刪除。注意,全部由名稱爲 「hello」 的 Cron Job 建立的 Job 會之前綴字符串 「hello-」 進行命名。若是想要刪除當前 Namespace 中的全部 Job,能夠經過命令 kubectl delete jobs --all 馬上刪除它們。

Cron Job 限制

Cron Job 在每次調度運行時間內 大概 會建立一個 Job 對象。咱們之因此說 大概 ,是由於在特定的環境下可能會建立兩個 Job,或者一個 Job 都沒建立。咱們嘗試少發生這種狀況,但卻不能徹底避免。所以,建立 Job 操做應該是 _冪等的_。

Job 根據它所建立的 Pod 的並行度,負責重試建立 Pod,並就決定這一組 Pod 的成功或失敗。Cron Job 根本不會去檢查 Pod。

編寫 Cron Job 規約

和其它 Kubernetes 配置同樣,Cron Job 須要 apiVersionkind、和 metadata 這三個字段。 關於如何實現一個配置文件的更新信息,參考文檔 部署應用、 配置容器 和 使用 kubectl 管理資源。

Cron Job 也須要 .spec 段。

注意: 對一個 Cron Job 的全部修改,尤爲是對其 .spec 的修改,僅會在下一次運行的時候生效。

調度

.spec.schedule.spec 中必需的字段,它的值是 Cron 格式字的符串,例如:0 * * * *,或者 @hourly,根據指定的調度時間 Job 會被建立和執行。

Job 模板

.spec.jobTemplate 是另外一個 .spec 中必需的字段。它是 Job 的模板。 除了它能夠是嵌套的,而且不具備 apiVersionkind 字段以外,它和 Job 同樣具備徹底相同的模式(schema)。 參考 編寫 Job 規格。

啓動 Job 的期限(秒級別)

.spec.startingDeadlineSeconds 字段是可選的。它表示啓動 Job 的期限(秒級別),若是由於任何緣由而錯過了被調度的時間,那麼錯過執行時間的 Job 將被認爲是失敗的。若是沒有指定,則沒有期限。

併發策略

.spec.concurrencyPolicy 字段也是可選的。它指定了如何處理被 Cron Job 建立的 Job 的併發執行。只容許指定下面策略中的一種:

  • Allow(默認):容許併發運行 Job

  • Forbid:禁止併發運行,若是前一個尚未完成,則直接跳過下一個

  • Replace:取消當前正在運行的 Job,用一個新的來替換

注意,當前策略只能應用於同一個 Cron Job 建立的 Job。若是存在多個 Cron Job,它們建立的 Job 之間老是容許併發運行。

掛起

.spec.suspend 字段也是可選的。若是設置爲 true,後續全部執行都將被掛起。它對已經開始執行的 Job 不起做用。默認值爲 false

Job 歷史限制

.spec.successfulJobsHistoryLimit.spec.failedJobsHistoryLimit 這兩個字段是可選的。它們指定了能夠保留完成和失敗 Job 數量的限制。

默認沒有限制,全部成功和失敗的 Job 都會被保留。然而,當運行一個 Cron Job 時,很快就會堆積不少 Job,推薦設置這兩個字段的值。設置限制值爲 0,相關類型的 Job 完成後將不會被保留。

相關文章
相關標籤/搜索