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

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。