巧妙的在pod启动前将进程丢到pod的cgroup中

给CFS实现FlexVolumePlugin的时候,有个问题,由于CFS的Client是运行在物理机上的,Client本身的资源是不受控制的。本意打算给所有Client套一个cgroup统一控制,但是后面仔细考虑了下,每个client是给不同的pod使用,并且client的资源使用和业务的写入读取速度以及数据量相关,所以考虑还是把client丢到业务pod的cgroup中,受业务pod的资源限制统一管理。

这里其实一个麻烦点是:volumemanager是在pause的container启动前就已经进行的,所以脚本执行的时候还没有cgroup目录生成,,然后FlexVolume的程序是要提前退出的,那么我们只能先启动这个进程,然后压后台等容器生成咯。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
putPidToCgroup() {
cat > cgroup.sh <<"EOF"
#!/bin/bash
PID=$1
POD_UID=$2
for i in `seq 1 10`;do
PAUSE_ID=$(docker ps | grep $POD_UID | grep pause | awk '{print $1}')
if [ x"$PAUSE_ID" == x ];then
sleep 10
else
CGROUP_PARENT=$(docker inspect $PAUSE_ID 2>/dev/null | jq -r .[0].HostConfig.CgroupParent )
if [ X"${CGROUP_PARENT}" != X"" ];then
echo $PID >> "/sys/fs/cgroup/cpu"$CGROUP_PARENT/tasks
echo $PID >> "/sys/fs/cgroup/memory"$CGROUP_PARENT/tasks
break
fi
fi
done
EOF
chmod +x cgroup.sh
nohup ./cgroup.sh $1 $2 &>/dev/null &
}