Job負責批量處理短暫的一次性任務 (short lived one-off tasks),即僅執行一次的任務,它保證批處理任務的一個或多個Pod成功結束。job是一種特殊的pod, 使用執行一次的任務,執行完釋放資源
Kubernetes支持以下幾種Job:
- 非並行Job:通常創建一個Pod直至其成功結束
- 固定結束次數的Job:設置.spec.completions,創建多個Pod,直到.spec.completions個Pod成功結束
- 帶有工作隊列的並行Job:設置.spec.Parallelism但不設置.spec.completions,當所有Pod結束並且至少一個成功時,Job就認為是成功
根據.spec.completions和.spec.Parallelism的設置,可以將Job划分為以下幾種pattern:
Job類型 | 使用示例 | 行為 | completions | Parallelism |
---|---|---|---|---|
一次性Job | 數據庫遷移 | 創建一個Pod直至其成功結束 | 1 | 1 |
固定結束次數的Job | 處理工作隊列的Pod | 依次創建一個Pod運行直至completions個成功結束 | 2+ | 1 |
固定結束次數的並行Job | 多個Pod同時處理工作隊列 | 依次創建多個Pod運行直至completions個成功結束 | 2+ | 2+ |
並行Job | 多個Pod同時處理工作隊列 | 創建一個或多個Pod直至有一個成功結束 | 1 | 2+ |
Job Controller
Job Controller負責根據Job Spec創建Pod,並持續監控Pod的狀態,直至其成功結束。如果失敗,則根據restartPolicy(只支持OnFailure和Never,不支持Always)決定是否創建新的Pod再次重試任務。
Job Spec格式
- spec.template格式同Pod
- RestartPolicy僅支持Never或OnFailure
- 單個Pod時,默認Pod成功運行后Job即結束
- .spec.completions標志Job結束需要成功運行的Pod個數,默認為1
- .spec.parallelism標志並行運行的Pod的個數,默認為1
- spec.activeDeadlineSeconds標志失敗Pod的重試最大時間,超過這個時間不會繼續重試
一個簡單的例子:
apiVersion: batch/v1 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
$ 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...
固定結束次數的Job示例
apiVersion: batch/v1 kind: Job metadata: name: busybox spec: completions: 3 template: metadata: name: busybox spec: containers: - name: busybox image: busybox command: ["echo", "hello"] restartPolicy: Never
Bare Pods
所謂Bare Pods是指直接用PodSpec來創建的Pod(即不在ReplicaSets或者ReplicationCtroller的管理之下的Pods)。這些Pod在Node重啟后不會自動重啟,但Job則會創建新的Pod繼續任務。所以,推薦使用Job來替代Bare Pods,即便是應用只需要一個Pod。