进程 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 限制。
- 阅读管理容器资源。
- 了解如何配置资源不足处理。