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

PID 限制是 计算资源 请求和限制的重要兄弟。但是,您以不同的方式指定它:而不是在 Pod 的 .spec 中定义 Pod 的资源限制,而是将限制配置为 kubelet 的设置。目前不支持 Pod 定义的 PID 限制。

节点 PID 限制

Kubernetes 允许您为系统使用保留一定数量的进程 ID。要配置保留,请在 --system-reserved--kube-reserved 命令行选项中使用参数 pid=<number> 为 kubelet。您指定的值声明指定数量的进程 ID 将分别为整个系统和 Kubernetes 系统守护程序保留。

Pod PID 限制

Kubernetes 允许您限制 Pod 中运行的进程数量。您在节点级别指定此限制,而不是将其配置为特定 Pod 的资源限制。每个节点都可以有不同的 PID 限制。
要配置限制,您可以为 kubelet 指定命令行参数 --pod-max-pids,或在 kubelet 配置文件 中设置 PodPidsLimit

基于 PID 的驱逐

您可以配置 kubelet,当 Pod 行为异常并消耗异常数量的资源时开始终止它。此功能称为驱逐。您可以 配置资源不足处理 以获取各种驱逐信号。使用 pid.available 驱逐信号来配置 Pod 使用的 PID 数量的阈值。您可以设置软驱逐和硬驱逐策略。但是,即使使用硬驱逐策略,如果 PID 数量增长非常快,节点仍然可能通过达到节点 PID 限制而进入不稳定状态。驱逐信号值是定期计算的,并不强制执行限制。

PID 限制 - 每个 Pod 和每个节点设置硬限制。一旦达到限制,工作负载在尝试获取新的 PID 时将开始出现故障。这可能会或可能不会导致 Pod 重新调度,具体取决于工作负载对这些故障的反应方式以及 Pod 的存活性和就绪性探测的配置方式。但是,如果正确设置了限制,您可以保证其他 Pod 工作负载和系统进程在某个 Pod 行为异常时不会用完 PID。

下一步

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