Kubernetes 1.31:Pod 失敗策略正式發佈

這篇文章描述了Pod 失敗策略,它在 Kubernetes 1.31 中升級為穩定版本,以及如何在您的 Jobs 中使用它。

關於 Pod 失敗策略

當您在 Kubernetes 上執行工作負載時,Pod 可能會因各種原因而失敗。理想情況下,像 Jobs 這樣的工作負載應該能夠忽略暫時性、可重試的失敗,並繼續運行直到完成。

為了允許這些暫時性失敗,Kubernetes Jobs 包含 backoffLimit 欄位,讓您可以指定在 Job 執行期間願意容忍的 Pod 失敗次數。但是,如果您為 backoffLimit 欄位設定一個很大的值,並且僅僅依賴這個欄位,您可能會注意到不必要的操作成本增加,因為 Pod 會過度重新啟動,直到達到 backoffLimit 為止。

當運行跨越數千個節點的大規模 Jobs,其中包含數千個長時間運行的 Pod 時,這會變得特別成問題。

Pod 失敗策略擴展了退避限制機制,以幫助您透過以下方式降低成本

  • 讓您能夠控制在發生不可重試的 Pod 失敗時立即讓 Job 失敗。
  • 讓您能夠忽略可重試錯誤,而無需增加 backoffLimit 欄位。

例如,您可以使用 Pod 失敗策略在更經濟實惠的競價型機器上運行您的工作負載,方法是忽略由優雅節點關閉引起的 Pod 失敗。

該策略允許您根據失敗 Pod 中的容器結束代碼或 Pod 狀況來區分可重試和不可重試的 Pod 失敗。

運作方式

您在 Job 規格中指定 Pod 失敗策略,表示為規則列表。

對於您定義的每個規則,根據以下其中一個屬性定義符合需求

  • 容器結束代碼:onExitCodes 屬性。
  • Pod 狀況:onPodConditions 屬性。

此外,對於每個規則,您可以指定以下其中一個操作,以便在 Pod 符合規則時執行

  • Ignore:不將失敗計入 backoffLimitbackoffLimitPerIndex
  • FailJob:讓整個 Job 失敗並終止所有正在運行的 Pod。
  • FailIndex:讓與失敗 Pod 對應的索引失敗。此操作適用於每個索引的退避限制功能。
  • Count:將失敗計入 backoffLimitbackoffLimitPerIndex。這是預設行為。

當正在運行的 Job 中發生 Pod 失敗時,Kubernetes 會按照指定的順序將失敗 Pod 的狀態與 Pod 失敗策略規則列表進行比對,並針對第一個符合的規則採取相應的操作。

請注意,在指定 Pod 失敗策略時,您還必須使用 restartPolicy: Never 設定 Job 的 Pod 範本。這可以防止 kubelet 和 Job 控制器在計算 Pod 失敗次數時發生競爭條件。

Kubernetes 發起的 Pod 中斷

為了允許將 Pod 失敗策略規則與 Kubernetes 發起的中斷引起的失敗進行比對,此功能引入了 DisruptionTarget Pod 狀況。

Kubernetes 會將此狀況新增至任何 Pod,無論它是否由 Job 控制器管理,只要該 Pod 因可重試的中斷情境而失敗。DisruptionTarget 狀況包含以下其中一個原因,這些原因對應於這些中斷情境

在所有其他中斷情境中,例如由於超出Pod 容器限制而導致的驅逐,Pod 不會收到 DisruptionTarget 狀況,因為中斷很可能是由 Pod 引起的,並且會在重試時再次發生。

範例

下面的 Pod 失敗策略程式碼片段示範了一個範例用法

podFailurePolicy:
  rules:
  - action: Ignore
    onPodConditions:
    - type: DisruptionTarget
  - action: FailJob
    onPodConditions:
    - type: ConfigIssue
  - action: FailJob
    onExitCodes:
      operator: In
      values: [ 42 ]

在此範例中,Pod 失敗策略執行以下操作

  • 忽略任何具有內建 DisruptionTarget 狀況的失敗 Pod。這些 Pod 不計入 Job 退避限制。
  • 如果任何失敗 Pod 具有自訂使用者提供的 ConfigIssue 狀況 (由自訂控制器或 Webhook 新增),則讓 Job 失敗。
  • 如果任何容器以結束代碼 42 退出,則讓 Job 失敗。
  • 將所有其他 Pod 失敗計入預設 backoffLimit (或 backoffLimitPerIndex,如果使用)。

瞭解更多

基於 Pod 失敗策略引入的概念,以下額外工作正在進行中

參與其中

這項工作由批次處理工作組贊助,並與SIG AppsSIG NodeSIG Scheduling 社群密切合作。

如果您有興趣參與此領域的新功能開發,我們建議您訂閱我們的 Slack 頻道並參加定期社群會議。

致謝

我要感謝多年來參與此專案的每個人 - 這是一段旅程,也是社群的共同努力!下面的列表是我盡力嘗試記住和表彰做出貢獻的人。謝謝你們!