程序 ID 限制與預留

功能狀態: Kubernetes v1.20 [stable]

Kubernetes 允許您限制 Pod 可以使用的程序 ID (PID) 數量。您也可以為每個 節點 預留一些可分配的 PID,供作業系統和守護程式(而非 Pod)使用。

程序 ID (PID) 是節點上的基本資源。即使未達到任何其他資源限制,也很容易達到任務限制,這可能會導致主機不穩定。

叢集管理員需要機制來確保叢集中執行的 Pod 不會引起 PID 耗盡,進而阻止主機守護程式(例如 kubeletkube-proxy,以及可能還有容器執行期)執行。此外,務必在 Pod 之間限制 PID,以確保它們對同一節點上的其他工作負載影響有限。

您可以設定 kubelet 以限制給定 Pod 可以消耗的 PID 數量。例如,如果您的節點主機作業系統設定為最多使用 262144 個 PID,並且預期託管少於 250 個 Pod,則可以為每個 Pod 提供 1000 個 PID 的預算,以防止用完該節點的可用 PID 總數。如果管理員想要過度承諾類似於 CPU 或記憶體的 PID,他們也可以這樣做,但會有一些額外風險。無論如何,單一 Pod 將無法使整部機器當機。這種資源限制有助於防止簡單的 fork 炸彈影響整個叢集的運作。

每個 Pod 的 PID 限制允許管理員保護一個 Pod 免受另一個 Pod 的影響,但不能確保排程到該主機上的所有 Pod 都無法影響整個節點。每個 Pod 的限制也不會保護節點代理程式本身免於 PID 耗盡。

您也可以為節點額外負擔預留一定數量的 PID,與分配給 Pod 的 PID 分開。這類似於您可以預留 CPU、記憶體或其他資源,供作業系統和 Pod 及其容器外部的其他設施使用的方式。

PID 限制是 計算資源 請求和限制的重要同級功能。但是,您以不同的方式指定它:您不是在 Pod 的 .spec 中定義 Pod 的資源限制,而是將限制設定為 kubelet 上的設定。目前不支援 Pod 定義的 PID 限制。

節點 PID 限制

Kubernetes 允許您為系統使用預留一些程序 ID。若要設定預留,請在 kubelet 的 --system-reserved--kube-reserved 命令列選項中使用參數 pid=<number>。您指定的值宣告指定數量的程序 ID 將分別為系統整體和 Kubernetes 系統守護程式預留。

Pod PID 限制

Kubernetes 允許您限制 Pod 中執行的程序數量。您在節點層級指定此限制,而不是將其設定為特定 Pod 的資源限制。每個節點都可以有不同的 PID 限制。
若要設定限制,您可以將命令列參數 --pod-max-pids 指定給 kubelet,或在 kubelet 組態檔 中設定 PodPidsLimit

基於 PID 的驅逐

您可以設定 kubelet 以在 Pod 行為異常並消耗異常數量的資源時開始終止 Pod。此功能稱為驅逐。您可以為各種驅逐訊號設定資源不足處理。使用 pid.available 驅逐訊號來設定 Pod 使用的 PID 數量的閾值。您可以設定軟性與硬性驅逐策略。但是,即使使用硬性驅逐策略,如果 PID 數量成長非常快,節點仍然可能因達到節點 PID 限制而進入不穩定狀態。驅逐訊號值會定期計算,並且不強制執行限制。

每個 Pod 和每個節點的 PID 限制設定了硬性限制。一旦達到限制,工作負載在嘗試取得新的 PID 時將開始遇到失敗。這可能會或可能不會導致重新排程 Pod,具體取決於工作負載如何對這些失敗做出反應,以及 Pod 的存活度與就緒度探針如何設定。但是,如果限制設定正確,您可以保證當一個 Pod 行為異常時,其他 Pod 工作負載和系統程序不會耗盡 PID。

下一步

上次修改時間為 2023 年 11 月 16 日 00:35 AM PST:修正 [en] 文件中的一些錯字。(5f3f34b39b)