您好,登錄后才能下訂單哦!
Cron Job 是什么?
Cron Job 管理基于時間的 Job,即:
在給定時間點只運行一次
在給定時間點周期性地運行
一個 CronJob 對象類似于 crontab (cron table)文件中的一行。它根據指定的預定計劃周期性地運行一個 Job
注意: 在預定計劃中,問號(?
)和星號(*
)的意義是相同的,表示給定字段的取值是任意可用值。
注意: 在 Kubernetes 1.4 版本引入了 ScheduledJob 資源,但從 1.5 版本開始改成了 CronJob。
典型的用法如下所示:
在給定的時間點調度 Job 運行
創建周期性運行的 Job,例如:數據庫備份、發送郵件。
當使用的 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 完成后將不會被保留。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。