基于LXCFS的Docker容器procps软件包升级方案(一)——LXCFS用户态文件系统


由于Docker本身的隔离性不够彻底,容器内部pROC文件系统中可以看到Host宿主机上的pROC信息。而Linux系统Props软件包中的top和free等命令就是通过读取pROC下的文件计算资源使用情况。因此,原生Docker容器中的top和free命令失去了它的作用。

而由于习惯性等原因,在Docker容器中使用top、free等命令仍然是一个较为普遍存在的需求,为了解决这一问题,提出了如下这样一个方案。该方案并不仅用于容器内top/free等命令,也可用于容器内自定义Agent对容器资源进行监控等,其核心都是在于pROC文件系统的替换。

首先要解决的是,Docker容器中的pROC文件系统实际上就是它所在的宿主机的pROC文件的问题。经过一番百(谷)度(歌),找到一个LXCFS项目。

LXCFS是基于FUSE实现而成的一套用户态文件系统,和其他文件系统最本质的区别在于,文件系统通过用户态程序和内核FUSE模块交互完成。Linux内核从2.6.14版本开始通过FUSE模块支持在用户空间实现文件系统。通过LXCFS的源码可以看到,LXCFS主要通过调用底层FUSE的lib库Libfuse和内核模块FUSE交互实现成一个用户态的文件系统。此外,LXCFS涉及到对Cgroup文件系统的管理则是通过CGManager用户态程序实现(为了提升性能,从0.11版本开始,LXCFS自身实现了CGFS用以替换第三方的cgroup manager,目前已经合入Upstream)。(这一段全是摘录自网上的文章,嘿嘿嘿,感兴趣的请自行百(谷)度(歌))

接下来介绍下LXCFS的编译安装,每个宿主机上都要安装,步骤都一样,如下:
git clone git://github.com/lxc/lxcfs
cd lxcfs
./bootstrap.sh
./configure
 make
sudo mkdir -p /var/lib/lxcfs
sudo ./lxcfs -s -f -o allow_other /var/lib/lxcfs/

最后一步启动的后如果报找不到liblxcfs.so文件,执行
cp /root/lxcfs-master/.libs/liblxcfs.so /usr/lib/lxcfs/liblxcfs.so

笔者同时写了一个脚本,后台启动LXCFS并检测进程状态自动拉起,内容如下:
#!/bin/bash
a=`ps -ef|grep /var/lib/lxcfs|grep -v grep|wc -l`
if [ $a -eq 0 ];then
b=`mount|grep /var/lib/lxc|wc -l`
if [ $b -ne 0 ];then
    umount /var/lib/lxcfs/
fi
rm -rf /var/lib/lxcfs/*
cd /root/lxcfs-master/
nohup  ./lxcfs -s -f -o allow_other /var/lib/lxcfs/ > /root/lxcfs_startup.log  2>&1 &
fi

添加到crontab中
[root@localhost ~]# crontab -l
* * * * * /bin/bash /root/lxcfs_auto_pullup.sh

启动容器,挂载LXCFS到容器中的/docker/proc下(一开始打算直接挂掉在到容器的/proc路径,然而由于Docker本身的限制并没有实现)给容器分配8G内存并绑定12号和13号CPU,如下:
docker run -itd  -m 8192m  --cpuset-cpus (12,13)  -v /var/lib/lxcfs/proc/:/docker/proc/centos:6.6 bash

进到容器里面,查看一下/docker/proc路径下的文件,如下
[root@ad5b4a2dff42 ~]# ll /docker/proc/
total 0
-r--r--r-- 1 root root 0 Oct 22 16:33 cpuinfo
-r--r--r-- 1 root root 0 Oct 22 16:33 diskstats
-r--r--r-- 1 root root 0 Oct 22 16:33 meminfo
-r--r--r-- 1 root root 0 Oct 22 16:33 stat
-r--r--r-- 1 root root 0 Oct 22 16:33 swaps
-r--r--r-- 1 root root 0 Oct 22 16:33 uptime

[root@ad5b4a2dff42 ~]# cat /docker/proc/cpuinfo |grep processor
processor       : 0
processor       : 1

[root@ad5b4a2dff42 ~]# cat /docker/proc/meminfo |grep "MemTotal\|MemFree\|MemAvailable"
MemTotal:        8388608 kB
MemFree:         7179764 kB
MemAvailable:    7179764 kB

显然,能看到的是给该容器分配的8G内存和2核CPU,而不是整个宿主机的资源。

0 个评论

要回复文章请先登录注册