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