使用 Cgroups 限制 Kubernetes Pod 进程数
· 14 min read
Kubernetes 里面的 Pod 资源是最小的计算单元,抽象了一组(一个或多个)容器。容器也是 Linux 系统上的进程,但基于 Namespace 和 Cgroups(Control groups) 等技术实现了不同程度的隔离。 简单来说 Namespace 可以让每个进程有独立的 PID, IPC 和网络空间。Cgroups 可以控制进程的资源占用,比如 CPU ,内存和允许的最大进程数等等。
今天主要介绍如何通过 Cgroups 里面的 pids 控制器限制 Kubernetes Pod 容器的最大进程数量。
场景介绍
之前遇到过这样一个问题,我们的服务会调用执行外部的命令,每调用一次外部命令就会 fork 产生子进程。但是由于代码上的 bug ,没有及时对子进程回收,然后这个容器不断 fork 产生子进程,耗尽了宿主机的进程表空间,最终导致整个系统不响应,影响了其它的服务。
这种问题除了让开发人员修复 bug 外,也需要在系统层面对进程数量进行限制。所以,如果一个容器里面运行的服务会 fork 产生子进程,就很有必要使用 Cgroups 的 pids 控制器限制这个容器能运行的最大进程数量。