Chuyển đến nội dung chính

第 18 課:功課和 CRONJOB

使用作業進行批次(單一、平行、索引、工作佇列)、具有時區支援的 CronJobs (GA K8s 1.27)。用於一組相關作業的 JobSet(CNCF 專案)-非常適合 AI/ML 訓練管道。

🔒 DevSecOps — 第 18 課 第 18 課:作業與 CRONJOBS

KUBERNETES:從基礎到進階

模組 5:工作負載管理__HTMLTAG_60___

xdev.asia

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 工作負載變得越來越流行的情況下。