Kubernetes 中的作業和 CronJobs__HTMLTAG_66___
在 Kubernetes 中,Deployments 和 StatefulSets 專為持續運行的工作負載而設計 — 它們始終嘗試維護一定數量的 Pod。但許多現實世界的任務不需要永遠運行:處理一批資料、運行資料庫遷移、訓練 ML 模型或發送大量電子郵件。這就是 Jobs 和 CronJobs 發揮作用的地方。
1。什麼是職位?批次工作負載和運行至完成
Kubernetes 中的
A Job 建立一個或多個 Pod,其目標是完成一項特定任務。與 Deployment 不同,Job 追蹤成功完成的數量 — 當完成足夠多的 Pod 時,Job 被視為完成。
重要工作功能:
-
___HTMLTAG_86__HTMLTAG_87___運行至完成:Pod 完成運行並退出,代碼 0 表示成功
___HTMLTAG_90__HTMLTAG_91___自動重試:如果 Pod 失敗,作業會根據
backoffLimit___HTMLTAG_94__HTMLTAG_95___ 自動建立新 Pod
___HTMLTAG_96__HTMLTAG_97___追蹤完成情況:作業知道所需總數中已經完成了多少
___HTMLTAG_100__HTMLTAG_101___平行性:多個 Pod 可以並行運作以提高吞吐量
簡單作業範例 — 計算 Pi:
程式碼區塊_0
注意 restartPolicy: Never — 對於作業,只能使用 Never 或OnFailure,不使用始終.
2。作業完成模式
Kubernetes 支援三種作業完成模式,適合不同的用例。
2.1 非索引(預設)
當成功完成的次數夠多時,作業即完成。 Pod 是無序的 — 它們都執行相同的工作,而且該工作需要足夠的 完成 Pod 才能成功。
程式碼區塊_1
2.2 索引作業
___HTMLTAG_129__HTMLTAG_130___索引作業 是一項非常強大的功能 — 每個 Pod 透過環境變數 JOB_COMPLETION_INDEX 接收從 0 到 ML13-131313-135 的索引____這非常適合 資料分區:每個 Pod 處理定義的資料部分.
程式碼區塊_2
Kubernetes 自動將變數 JOB_COMPLETION_INDEX 注入每個 Pod。 Pod 0 處理分區 0,Pod 1 處理分區 1,依此類推。 — 即使 Pod 重新啟動也不會重複。
2.3 工作佇列
使用工作佇列模式,多個 Pod 從一個佇列(Redis、RabbitMQ、SQS)取得任務。當佇列為空且沒有更多 Pod 正在處理時,作業完成。
程式碼區塊_3
3。作業參數詳細資料
了解作業參數可協助您針對每個使用案例進行最佳化:
___HTMLTAG_152__HTMLTAG_153___完成:需要成功完成的 Pod 總數。預設值為 1.
___HTMLTAG_156__HTMLTAG_157___並行度:同時運行的最大 Pod 數量。預設值為 1.
___HTMLTAG_160__HTMLTAG_161___backoffLimit:作業標記為失敗之前的重試次數。預設值為 6.
___HTMLTAG_164__HTMLTAG_165___activeDeadlineSeconds:允許作業運行的最長時間(秒)。超出 → 作業終止。
___HTMLTAG_168__HTMLTAG_169___ttlSecondsAfterFinished:完成後 N 秒刪除作業(和 Pod)。
程式碼區塊_4
4。 Pod 故障策略(K8s 1.31+)
從 Kubernetes 1.31 開始,Pod 故障策略 允許您定義 Pod 失敗時的精細行為 — 並不總是建議重試。
程式碼區塊_5
操作可用來:
___HTMLTAG_184__HTMLTAG_185___FailJob:立即停止整個作業,標記失敗
___HTMLTAG_188__HTMLTAG_189___忽略:不計入 backoffLimit,建立新 Pod
___HTMLTAG_192__HTMLTAG_193___Count:照常計入 backoffLimit(預設行為)
5。作業 TTL — 自動清理
作業及其 Pod 完成後將永遠保留,無需清理機制。使用 ttlSecondsAfterFinished 自動刪除:
程式碼區塊_6
您也可以修補現有作業: kubectl patch job old-job -p '{"spec":{"ttlSecondsAfterFinished":0}}' — 這會立即刪除作業。
6。 CronJobs — 排程任務
___HTMLTAG_209__HTMLTAG_210___CronJob 使用熟悉的 cron 語法定期自動建立作業。
程式碼區塊_7
6.1 CronJob 時區支援 (GA K8s 1.27)
在 K8s 1.27 之前,所有 CronJobs 都使用控制器的 UTC。從 K8s 1.27 開始, timeZone 欄位是 GA — 您可以根據 IANA 時區資料庫指定任何時區:
程式碼區塊_8
熱門時區:
___HTMLTAG_222__HTMLTAG_223___亞洲/胡志明 — 越南 (UTC+7)
___HTMLTAG_226__HTMLTAG_227___亞洲/新加坡 — 新加坡 (UTC+8)
___HTMLTAG_230__HTMLTAG_231___美國/紐約 — 美國東部
___HTMLTAG_234__HTMLTAG_235___歐洲/倫敦 — 英國
___HTMLTAG_238__HTMLTAG_239___UTC — 協調世界時
6.2 並發策略
需要決定的重要事項:如果計劃執行新作業時舊作業尚未完成該怎麼辦?
-
___HTMLTAG_248__HTMLTAG_249___允許(預設):即使舊作業正在運行,也建立新作業 - 請注意競爭條件
___HTMLTAG_252__HTMLTAG_253___禁止:跳過新作業,舊作業仍繼續
___HTMLTAG_256__HTMLTAG_257___取代:刪除舊作業,建立新作業來取代
7。 JobSet — 用於分散式作業的 CNCF 項目
HTMLTAG_263__HTMLTAG_264___JobSet 是一個 CNCF 專案(目前處於沙盒階段),旨在協調多個相關作業。這是 分散式 ML 訓練管道__HTMLTAG_267.
的理想工具作業集設定:
___程式碼區塊_9___7.1 分散式機器學習訓練作業集
場景:使用參數伺服器架構訓練模型 — 一組 pod 作為參數伺服器(儲存梯度),另一組作為工作執行緒(計算)。
程式碼區塊_10
7.2 JobSet 的突出特點__HTMLTAG_276___
___HTMLTAG_278__HTMLTAG_279___失敗策略傳播:如果集合中的作業失敗,整個作業集可以重新啟動或一起失敗 - 沒有「孤立」作業__HTMLTAG_281___
___HTMLTAG_282__HTMLTAG_283___基於 DNS 的通訊:JobSet 中的作業自動具有 DNS 記錄以相互通訊 ({jobset-name}-{job-name}-{job-index}-{podpod-index.{HTMLU____787____ML____ML-
___HTMLTAG_288__HTMLTAG_289___獨佔拓撲:確保同一作業的 Pod 調度在同一機架/節點上(減少網路延遲)
___HTMLTAG_292__HTMLTAG_293___啟動順序__HTMLTAG_294___:僅在PS準備好後啟動worker
7.3 作業集追蹤
程式碼區塊_11
8。摘要:何時使用什麼?
___HTMLTAG_302__HTMLTAG_303___SimpleJob:一項任務,執行一次 — 使用基本作業
___HTMLTAG_306__HTMLTAG_307___無順序並行處理:具有完成+並行性的非索引作業
___HTMLTAG_310__HTMLTAG_311___資料分區:索引作業 — 每個 Pod 處理指定的分區
___HTMLTAG_314__HTMLTAG_315___基於佇列的處理:工作佇列Job + Redis/RabbitMQ
___HTMLTAG_318__HTMLTAG_319___排程任務:支援時區的 CronJob
___HTMLTAG_322__HTMLTAG_323___分散式訓練/HPC:用於多重作業協調的作業集
Jobs 和 CronJobs 是 Kubernetes 上每個批次系統的基礎。了解完成模式和失敗策略有助於您建立可靠的管道,尤其是在 AI/ML 工作負載變得越來越流行的情況下。
{jobset-name}-{job-name}-{job-index}-{podpod-index.{HTMLU____787____ML____ML-
___HTMLTAG_288__HTMLTAG_289___獨佔拓撲:確保同一作業的 Pod 調度在同一機架/節點上(減少網路延遲)
___HTMLTAG_292__HTMLTAG_293___啟動順序__HTMLTAG_294___:僅在PS準備好後啟動worker
7.3 作業集追蹤
程式碼區塊_11
8。摘要:何時使用什麼?
-
___HTMLTAG_302__HTMLTAG_303___SimpleJob:一項任務,執行一次 — 使用基本作業
___HTMLTAG_306__HTMLTAG_307___無順序並行處理:具有完成+並行性的非索引作業
___HTMLTAG_310__HTMLTAG_311___資料分區:索引作業 — 每個 Pod 處理指定的分區
___HTMLTAG_314__HTMLTAG_315___基於佇列的處理:工作佇列Job + Redis/RabbitMQ
___HTMLTAG_318__HTMLTAG_319___排程任務:支援時區的 CronJob
___HTMLTAG_322__HTMLTAG_323___分散式訓練/HPC:用於多重作業協調的作業集
Jobs 和 CronJobs 是 Kubernetes 上每個批次系統的基礎。了解完成模式和失敗策略有助於您建立可靠的管道,尤其是在 AI/ML 工作負載變得越來越流行的情況下。