本文已超過一年。較舊的文章可能包含過時的內容。請檢查頁面中的資訊自發布以來是否已變得不正確。
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 會被視為已完成。索引會公開給每個 Pod,位於batch.kubernetes.io/job-completion-index
註解和JOB_COMPLETION_INDEX
環境變數中。
您可以開始使用具有 Indexed 完成模式的 Job(或簡稱 Indexed Job)來輕鬆啟動並行 Job。然後,每個工作節點 Pod 可以根據索引靜態分配資料分割。這讓您無需設定佇列系統,甚至無需修改二進位檔案!
建立 Indexed Job
若要建立 Indexed Job,您只需將 completionMode: Indexed
新增至 Job 規格,並使用 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 中的每一個都獲得了不同的完成索引。為了使用者的方便,控制平面設定了 JOB_COMPLETION_INDEX
環境變數,但您可以選擇設定您自己的或將索引公開為檔案。
請參閱用於靜態工作分配的並行處理的 Indexed Job,以取得逐步指南和更多範例。
未來計畫
SIG Apps 預想可能有更多完成模式可以為 Job API 啟用更多使用案例。我們歡迎您在 kubernetes/kubernetes 中開啟 issue,提出您的建議。
特別是,我們正在考慮 IndexedAndUnique
模式,其中索引不僅作為註解提供,而且是 Pod 名稱的一部分,類似於 StatefulSet。這應有助於緊密耦合的 Pod 之間的 Pod 間通訊。您可以加入開放 issue 中的討論。
總結
Indexed Job 可讓您在並行 Job 的工作節點之間靜態分割工作。SIG Apps 希望此功能有助於將更多批次工作負載遷移到 Kubernetes。