进程 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 bomb 影响整个集群的运行。

Per-Pod PID 限制允许管理员保护一个 Pod 免受另一个 Pod 的影响,但不能确保调度到该主机上的所有 Pod 都不会影响整个节点。Per-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 的驱逐

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

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

接下来

最后修改于 2024 年 12 月 19 日 太平洋标准时间下午 2:20:更新 pid-limiting.md (41ce0549dd)