程序 ID 限制和預留
Kubernetes v1.20 [stable]
Kubernetes 允許你限制 Pod 可以使用的程序 ID(PID)數量。你還可以為每個節點預留一定數量的可分配 PID,供作業系統和守護程序(而不是 Pod)使用。
程序 ID (PID) 是節點上的基本資源。很容易在不觸及任何其他資源限制的情況下達到任務限制,這可能會導致主機不穩定。
叢集管理員需要機制來確保在叢集中執行的 Pod 不會導致 PID 耗盡,從而阻止主機守護程式(例如kubelet 或kube-proxy,以及可能還有容器執行時)的執行。此外,重要的是要確保 Pod 之間的 PID 受到限制,以確保它們對同一節點上的其他工作負載影響有限。
注意
在某些 Linux 安裝上,作業系統將 PID 限制設定為一個較低的預設值,例如 `32768`。考慮提高 `/proc/sys/kernel/pid_max` 的值。你可以配置 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 限制。
注意
這意味著適用於 Pod 的限制可能因 Pod 排程位置而異。為簡單起見,如果所有節點都使用相同的 PID 資源限制和預留,則最為方便。節點 PID 限制
Kubernetes 允許你為系統使用預留一定數量的程序 ID。要配置預留,請在 kubelet 的 `--system-reserved` 和 `--kube-reserved` 命令列選項中使用引數 `pid=
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。
下一步
- 有關更多資訊,請參閱PID 限制增強文件。
- 要了解歷史背景,請閱讀Kubernetes 1.14 中用於穩定性改進的程序 ID 限制。
- 閱讀管理容器資源。
- 瞭解如何配置資源不足處理。