进程 ID 限制和预留
Kubernetes v1.20 [稳定版]
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 数量。例如,如果您的节点主机操作系统设置为使用最大 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 限制。
注意
这意味着应用于 Pod 的限制可能因 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。
下一步
- 请参阅 PID 限制增强文档,以获取更多信息。
- 有关历史背景,请阅读 Kubernetes 1.14 中的进程 ID 限制以提高稳定性。
- 阅读 为容器管理资源。
- 了解如何 配置资源不足处理。