Kubernetes v1.14中Pid Limit功能实现分析

今天看到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
2
3
4
5
6
7
8
9
if utilfeature.DefaultFeatureGate.Enabled(kubefeatures.SupportPodPidsLimit) {
supportedSubsystems = append(supportedSubsystems, &cgroupfs.PidsGroup{})
}
if utilfeature.DefaultFeatureGate.Enabled(kubefeatures.SupportPodPidsLimit) && cgroupConfig.ResourceParameters.PodPidsLimit != nil {
libcontainerCgroupConfig.PidsLimit = *cgroupConfig.ResourceParameters.PodPidsLimit
}
if utilfeature.DefaultFeatureGate.Enabled(kubefeatures.SupportPodPidsLimit) && cgroupConfig.ResourceParameters.PodPidsLimit != nil {
libcontainerCgroupConfig.PidsLimit = *cgroupConfig.ResourceParameters.PodPidsLimit
}

好嘛,其实就是利用了pids这个cgroup https://www.kernel.org/doc/Documentation/cgroup-v1/pids.txt做了下限制,这个功能怎么这么久才加。。。

再回到#73651

1
2
3
4
5
6
7
8
9

// Process IDs are not a node allocatable, so we have to do this ad hoc
pidlimits, err := pidlimit.Stats()
if err == nil && pidlimits != nil && pidlimits.MaxPID != nil {
allocatablePIDs = resource.NewQuantity(int64(*pidlimits.MaxPID), resource.DecimalSI)
allocatablePIDs.Sub(resource.MustParse(pids))
}
return allocatableCPU, allocatableMemory, allocatablePIDs
} }

拿了下机器上总的数减去配置的数量,限制了所有pod总的pid数量,这样给kubelet一类的程序留下了配置的数量。

总结下有的时候弄久了有些事情反而忘记了,cgroup其实有个pids subsystem的。我还以为是类似于tcp_throttle一样是狼厂自研的呢。

另外提示个点:这个pids系统限制的是线程+进程数,可以理解成pstree -pl看到的数量。

与此同时又想到个点,记得之前matrix还做了容器内可以bind端口的限制,不过好像这个在现在的场景是用不到的。另外还有个利用subtreequota 什么的实现的disk space子系统来控制用量,不过这个现在大部分用我之前提过的方案解决了。