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

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/shihao99/article/details/78337669

由于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,而不是整个宿主机的资源。

猜你喜欢

转载自blog.csdn.net/shihao99/article/details/78337669
今日推荐