本文發表於一年多前。舊文章可能包含過時內容。請檢查頁面中的資訊自發布以來是否已變得不正確。

介紹 Indexed Jobs

將非並行 Job 容器化後,無需修改二進位制檔案即可輕鬆在 Kubernetes 上執行。在大多數情況下,執行並行分散式 Job 時,您必須設定一個單獨的系統來在工作程序之間劃分工作。例如,您可以設定一個任務佇列,以將一個工作項分配給每個 Pod,或者將多個工作項分配給每個 Pod,直到佇列清空

Kubernetes 1.21 版本引入了一個新欄位來控制 Job 的完成模式,這是一個配置選項,允許您控制 Pod 的完成如何影響 Job 的整體進度,目前有兩種可能的選項:

  • NonIndexed(預設):當成功完成的 Pod 數量等於 .spec.completions 中指定的數量時,Job 被視為完成。換句話說,每個 Pod 的完成都是同質的。在引入完成模式之前建立的任何 Job 都隱式地是 NonIndexed。
  • Indexed:當從 0 到 .spec.completions-1 的每個索引都有一個成功完成的 Pod 相關聯時,Job 被視為完成。該索引在 batch.kubernetes.io/job-completion-index 註解和 JOB_COMPLETION_INDEX 環境變數中暴露給每個 Pod。

您可以開始使用具有索引完成模式的 Job,簡稱索引式 Job,以輕鬆啟動並行 Job。然後,每個工作 Pod 可以根據索引靜態分配資料分割槽。這省去了您設定佇列系統甚至修改二進位制檔案的麻煩!

建立索引式 Job

要建立索引式 Job,您只需在 Job 規範中新增 completionMode: Indexed,並使用 JOB_COMPLETION_INDEX 環境變數即可。

apiVersion: batch/v1
kind: Job
metadata:
  name: 'sample-job'
spec:
  completions: 3
  parallelism: 3
  completionMode: Indexed
  template:
    spec:
      restartPolicy: Never
      containers:
      - command:
        - 'bash'
        - '-c'
        - 'echo "My partition: ${JOB_COMPLETION_INDEX}"'
        image: 'docker.io/library/bash'
        name: 'sample-load'

請注意,完成模式是 1.21 版本中的一個 alpha 功能。要在您的叢集中使用它,請確保在 API 伺服器控制器管理器上啟用 IndexedJob 功能門

當您執行示例時,您將看到建立的三個 Pod 中的每個 Pod 都會獲得一個不同的完成索引。為了使用者的方便,控制平面設定了 JOB_COMPLETION_INDEX 環境變數,但您可以選擇設定自己的將索引作為檔案暴露

有關分步指南和更多示例,請參見使用靜態工作分配進行並行處理的索引式 Job

未來計劃

SIG Apps 設想可能會有更多的完成模式,從而為 Job API 提供更多的用例。我們歡迎您在 kubernetes/kubernetes 中提出問題並提供建議。

特別是,我們正在考慮一種 IndexedAndUnique 模式,其中索引不僅作為註解提供,而且是 Pod 名稱的一部分,類似於 StatefulSet。這應該有助於緊密耦合的 Pod 之間的 Pod 間通訊。您可以加入開放問題中的討論。

總結

索引式 Job 允許您在並行 Job 的工作節點之間靜態劃分工作。SIG Apps 希望此功能能夠促進更多批處理工作負載遷移到 Kubernetes。