进程 ID 限制和预留

特性状态: Kubernetes v1.20 [稳定]

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 分开。 这类似于您可以如何为操作系统和 Pod 及其容器之外的其他设施保留 CPU、内存或其他资源。

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 限制而进入不稳定状态。 驱逐信号值会定期计算,并且不强制执行限制。

PID 限制 - 每个 Pod 和每个节点设置硬限制。 一旦达到限制,工作负载在尝试获取新的 PID 时将开始遇到故障。 这可能会或可能不会导致 Pod 的重新调度,具体取决于工作负载如何对这些故障做出反应以及如何为 Pod 配置活动和就绪探针。 但是,如果正确设置了限制,则可以保证当一个 Pod 行为不当时,其他 Pod 的工作负载和系统进程不会耗尽 PID。

下一步

上次修改时间为太平洋标准时间 2023 年 11 月 16 日凌晨 12:35:修复 [en] 文档中的一些拼写错误。(5f3f34b39b)