进程 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>。您指定的值声明将分别为整个系统和 Kubernetes 系统守护进程预留指定数量的进程 ID。

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。

后续步骤

上次修改时间:2023 年 11 月 16 日上午 12:35 PST:修复 [en] 文档中的一些拼写错误。(5f3f34b39b)