今天看到kubernetes发布了v1.14版本,发布说明中有个PID限制功能,引起了我的兴趣,2方面原因1:之前matrix有这个功能,但是k8s没有 2:有实际场景需求。那么来看下具体是怎么实现的
找到官方的release note链接,看到
Pid Limiting is Graduating to Beta (#757)
Prevents a pod from starving pid resource
Ability to isolate pid resources pod-to-pod and node-to-pod kubernetes/kubernetes: #73651kubernetes/enhancements: #757 [kep]
#757 是 https://github.com/kubernetes/enhancements/issues/757 是个需求描述,说要增加这个功能,不是实现。
#73651 https://github.com/kubernetes/kubernetes/pull/73651/files 实现了node层面的pid限制,提供了类似之前预留cpu的system-reserved功能,可以预留pid
还有个release note没写,需要自己找下#57973
https://github.com/kubernetes/kubernetes/pull/57973 这个实现了pod层面的pid限制
1 | if utilfeature.DefaultFeatureGate.Enabled(kubefeatures.SupportPodPidsLimit) { |
好嘛,其实就是利用了pids这个cgroup https://www.kernel.org/doc/Documentation/cgroup-v1/pids.txt做了下限制,这个功能怎么这么久才加。。。
再回到#73651
1 |
|
拿了下机器上总的数减去配置的数量,限制了所有pod总的pid数量,这样给kubelet一类的程序留下了配置的数量。
总结下有的时候弄久了有些事情反而忘记了,cgroup其实有个pids subsystem的。我还以为是类似于tcp_throttle一样是狼厂自研的呢。
另外提示个点:这个pids系统限制的是线程+进程数,可以理解成pstree -pl看到的数量。
与此同时又想到个点,记得之前matrix还做了容器内可以bind端口的限制,不过好像这个在现在的场景是用不到的。另外还有个利用subtreequota 什么的实现的disk space子系统来控制用量,不过这个现在大部分用我之前提过的方案解决了。