程序 ID 限制和預留

特性狀態: Kubernetes v1.20 [stable]

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

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

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

你可以配置 kubelet 來限制給定 Pod 可以消耗的 PID 數量。例如,如果你的節點主機作業系統的最大 PID 數設定為 `262144`,並且預計託管少於 `250` 個 Pod,你可以給每個 Pod 分配 `1000` 個 PID 的預算,以防止用盡該節點可用的 PID 總數。如果管理員想對 PID 進行超額分配,類似於 CPU 或記憶體,他們也可以這樣做,但會增加一些風險。無論哪種方式,單個 Pod 都無法使整個機器崩潰。這種資源限制有助於防止簡單的 fork bomb 影響整個叢集的執行。

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

你還可以為節點開銷預留一定數量的 PID,這與分配給 Pod 的 PID 分開。這類似於你如何為作業系統和 Pod 及其容器之外的其他設施預留 CPU、記憶體或其他資源。

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

節點 PID 限制

Kubernetes 允許你為系統使用預留一定數量的程序 ID。要配置預留,請在 kubelet 的 `--system-reserved` 和 `--kube-reserved` 命令列選項中使用引數 `pid=`。你指定的值聲明瞭指定數量的程序 ID 將分別預留給整個系統和 Kubernetes 系統守護程序。

Pod PID 限制

Kubernetes 允許你限制 Pod 中執行的程序數量。你可以在節點級別指定此限制,而不是將其配置為特定 Pod 的資源限制。每個節點可以有不同的 PID 限制。
要配置該限制,你可以向 kubelet 指定命令列引數 `--pod-max-pids`,或者在 kubelet 配置檔案中設定 `PodPidsLimit`。

基於 PID 的驅逐

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

PID 限制(每個 Pod 和每個節點)設定了硬限制。一旦達到限制,工作負載在嘗試獲取新的 PID 時將開始遇到故障。這可能導致 Pod 的重新排程,也可能不導致,這取決於工作負載對這些故障的反應以及 Pod 的活躍度和就緒度探針的配置方式。然而,如果限制設定正確,你可以保證當一個 Pod 行為異常時,其他 Pod 工作負載和系統程序不會耗盡 PID。

下一步

上次修改時間:2024 年 12 月 19 日下午 2:20 PST:更新 pid-limiting.md (41ce0549dd)