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 的例子。它會每分鐘運行一個 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,簡單地可使用 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 在每次調度運行時間內 大概 會建立一個 Job 對象。咱們之因此說 大概 ,是由於在特定的環境下可能會建立兩個 Job,或者一個 Job 都沒建立。咱們嘗試少發生這種狀況,但卻不能徹底避免。所以,建立 Job 操做應該是 _冪等的_。
Job 根據它所建立的 Pod 的並行度,負責重試建立 Pod,並就決定這一組 Pod 的成功或失敗。Cron Job 根本不會去檢查 Pod。
和其它 Kubernetes 配置同樣,Cron Job 須要 apiVersion
、 kind
、和 metadata
這三個字段。 關於如何實現一個配置文件的更新信息,參考文檔 部署應用、 配置容器 和 使用 kubectl 管理資源。
Cron Job 也須要 .spec
段。
注意: 對一個 Cron Job 的全部修改,尤爲是對其 .spec
的修改,僅會在下一次運行的時候生效。
.spec.schedule
是 .spec
中必需的字段,它的值是 Cron 格式字的符串,例如:0 * * * *
,或者 @hourly
,根據指定的調度時間 Job 會被建立和執行。
.spec.jobTemplate
是另外一個 .spec
中必需的字段。它是 Job 的模板。 除了它能夠是嵌套的,而且不具備 apiVersion
或 kind
字段以外,它和 Job 同樣具備徹底相同的模式(schema)。 參考 編寫 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
。
.spec.successfulJobsHistoryLimit
和 .spec.failedJobsHistoryLimit
這兩個字段是可選的。它們指定了能夠保留完成和失敗 Job 數量的限制。
默認沒有限制,全部成功和失敗的 Job 都會被保留。然而,當運行一個 Cron Job 時,很快就會堆積不少 Job,推薦設置這兩個字段的值。設置限制值爲 0
,相關類型的 Job 完成後將不會被保留。