咱們常常須要進行批量數據處理和分析,以及按照時間進行調度執行。能夠在Kubenrtes中使用容器技術完成,使用Job和CronJob來執行。這樣,能夠維護較爲乾淨的執行環境,減小不一樣任務工具的相互干擾。同時能夠在集羣上按照任務要求和資源情況進行動態伸縮執行。html
參考:node
.spec.completions
標誌Job結束須要成功運行的Pod個數,默認爲1。.spec.parallelism
標誌並行運行的Pod的個數,默認爲1。spec.activeDeadlineSeconds
標誌失敗Pod的重試最大時間,超過這個時間不會繼續重試。一個簡單的例子:數據庫
apiVersion: batch/v1beta1 kind: Job metadata: name: pi spec: template: metadata: name: pi spec: containers: - name: pi image: perl command: ["perl", "-Mbignum=bpi", "-wle", "print bpi(2000)"] restartPolicy: Never
執行工做任務:json
$ kubectl create -f ./job.yaml job "pi" created $ pods=$(kubectl get pods --selector=job-name=pi --output=jsonpath={.items..metadata.name}) $ kubectl logs $pods 3.141592653589793238462643383279502...
Cron Job 管理基於時間的 Job,即:api
一個 CronJob 對象相似於 crontab (cron table)文件中的一行。併發
典型的用法以下所示:工具
注意:jsonp
.spec.schedule
:調度,必需字段,指定任務運行週期,格式同 Cron。spa
.spec.jobTemplate
:Job 模板,必需字段,指定須要運行的任務,格式同 Job。.net
.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 完成後將不會被保留。
apiVersion: batch/v1beta1 kind: CronJob metadata: name: hello spec: schedule: "*/1 * * * *" jobTemplate: spec: template: spec: containers: - name: hello image: busybox args: - /bin/sh - -c - date; echo Hello from the Kubernetes cluster restartPolicy: OnFailure
上面的描述文件指定每分鐘執行一次,輸出一條信息。
啓動調度任務:
$ kubectl create -f cronjob.yaml cronjob "hello" created
固然,也能夠用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 # 注意,刪除cronjob的時候不會自動刪除job,這些job能夠用kubectl delete job來刪除 $ kubectl delete cronjob hello cronjob "hello" deleted
Cron Job 在每次調度運行時間內「大概」會建立一個 Job 對象。咱們之因此說「大概」 ,是由於在特定的環境下可能會建立兩個 Job,或者一個 Job 都沒建立。咱們嘗試少發生這種狀況,但卻不能徹底避免。所以,建立 Job 操做應該是 冪等的。
Job 根據它所建立的 Pod 的並行度,負責重試建立 Pod,並就決定這一組 Pod 的成功或失敗。Cron Job 根本就不會去檢查 Pod。
一旦再也不須要 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
馬上刪除它們。