Job

Job 負責批量處理短暫的一次性任務 (short lived one-off tasks),即僅執行一次的任務,它保證批處理任務的一個或多個 Pod 成功結束。

API 版本對照表

Kubernetes 版本
Batch API 版本
默認開啓

v1.5+

batch/v1

Job 類型

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 的重試最大時間,超過這個時間不會繼續重試

一個簡單的例子:

固定結束次數的 Job 示例

Indexed Job

通常,當使用 Job 來運行分佈式任務時,用戶需要一個單獨的系統來在 Job 的不同 worker Pod 之間分配任務。比如,設置一個工作隊列,逐一給每個 Pod 分配任務。Kubernetes v1.21 新增的 Indexed Job 會給每個任務分配一個數值索引,並通過 annotation batch.kubernetes.io/job-completion-index 暴露給每個 Pod。使用方法爲在 Job spec 中設置 completionMode: Indexed

Pod 自動清理

TTL 控制器用來自動清理已經結束的 Pod,如處於 Complete 或 Failed 狀態的 Job。Pod 停止之後的 TTL 可以通過 .spec.ttlSecondsAfterFinished 來設置。

注意,該特性要求集群中各節點(包括控制節點)的時間一致,比如在所有節點中運行 NTP 服務。

暫停和重啓 Job

從 v1.21 開始,可通過 .spec.suspend 暫停和重啓 Job:

當 Job 暫停後,Job conditions 中會新增一條 Job 暫停的事件:

Bare Pods

所謂 Bare Pods 是指直接用 PodSpec 來創建的 Pod(即不在 ReplicaSets 或者 ReplicationCtroller 的管理之下的 Pods)。這些 Pod 在 Node 重啓後不會自動重啓,但 Job 則會創建新的 Pod 繼續任務。所以,推薦使用 Job 來替代 Bare Pods,即便是應用只需要一個 Pod。

參考文檔

Last updated