Kubelet 开启 PodPidsLimit
背景
避免某应用泄露问题导致整个集群不可用,将针对集群中的Pod最大只能运行4096个进程。
实现
kubelet 中追加以下参数
# cat /etc/sysconfig/kubelet
KUBELET_EXTRA_ARGS="--pod-max-pids=4096"重启生效
# systemctl restart kubelet验证
# kubectl get --raw /api/v1/nodes/主机名/proxy/configz | jq .kubeletconfig.podPidsLimit验证实例
在集群中创建以下Pod应用
apiVersion: v1
kind: Pod
metadata:
name: pids-stress-test
spec:
restartPolicy: Never
containers:
- name: pids-stress
image: registry.cn-shenzhen.aliyuncs.com/shuhui/busybox:1.37.0
command:
- /bin/sh
- -c
- |
echo "=== PID上限测试 ==="
echo "当前 pids.max: $(cat /sys/fs/cgroup/pids/pids.max 2>/dev/null)"
echo ""
echo "开始消耗进程数..."
i=0
while true; do
i=$((i+1))
(
# 模拟常驻进程
sleep infinity
) &
echo "已创建进程数: $i"
sleep 0.001
done查看日志
# k logs -f pids-stress-test
...
已创建进程数: 4090
已创建进程数: 4091
已创建进程数: 4092
已创建进程数: 4093
已创建进程数: 4094
/bin/sh: can't fork: Resource temporarily unavailable可以看到,触发阈值后Pod立马被中断
另一种验证
# kubectl get pods pids-stress-test -o yaml | grep -E 'uid|qos'
uid: a65a278d-6960-4b78-99c3-bd1e6a460541
qosClass: BestEffort
# systemctl |grep a65a278d |grep -i BestEffort
kubepods-besteffort-poda65a278d_6960_4b78_99c3_bd1e6a460541.slice loaded active active libcontainer container kubepods-besteffort-poda65a278d_6960_4b78_99c3_bd1e6a460541.slice找到对应的systemd控制名称后,使用以下来验证
# systemctl cat kubepods-besteffort-poda65a278d_6960_4b78_99c3_bd1e6a460541.slice | grep -i tasksmax
# /run/systemd/transient/kubepods-besteffort-poda65a278d_6960_4b78_99c3_bd1e6a460541.slice.d/50-TasksMax.conf
TasksMax=4096提示:发现已经追加了在kubelet中声明的4096!
通过对应cgroup来验证
# find /sys/fs/cgroup/ -name "*a65a278d*"
/sys/fs/cgroup/kubepods.slice/kubepods-besteffort.slice/kubepods-besteffort-poda65a278d_6960_4b78_99c3_bd1e6a460541.slice
[root@kube-m-01 stress]# cat /sys/fs/cgroup/kubepods.slice/kubepods-besteffort.slice/kubepods-besteffort-poda65a278d_6960_4b78_99c3_bd1e6a460541.slice/pids.max
4096