Linux下利用LXCFS增强docker容器隔离性和资源可见性

一、前言

 

容器实现的基础是NameSpace和Cgroups。

  • NameSpace实现了对容器(进程)的隔离,NameSpace技术实际上修改了应用进程看待整个计算机“视图”,也就是作用域,即它的“视线”被操作系统做了限制,只能“看到”某些指定的内容,实现方式类似于将全局变量修改为了局部变量。
  • Cgroups实现了对容器(进程)资源的限制,但是在容器内部依然缺省挂载了宿主机的procfs的/proc目录,其中包含:meminfo,cpuinfo,stat,uptime等资源信息。一些监控工具如 free/top 会依赖上述文件获取资源配置和使用情况。

示例:为容器配置了200m内存,使用free显示却是1G内存(宿主机的实际内存)

 

二、LXCFS介绍

 

社区中常用的做法是利用lxcfs来提供容器中的资源可见性。lxcfs是一个开源的FUSE(用户态文件系统)实现来支持LXC容器。

LXCFS通过用户态文件系统,在容器中提供下列 procfs 的文件:

/proc/cpuinfo
/proc/diskstats
/proc/meminfo
/proc/stat
/proc/swaps
/proc/uptime

比如,把宿主机的 /var/lib/lxcfs/proc/memoinfo 文件挂载到Docker容器的/proc/meminfo位置后。容器中进程读取相应文件内容时,LXCFS的FUSE实现会从容器对应的Cgroup中 读取正确的内存限制。从而使得应用获得正确的资源约束设定。

 

三、实验环境(rhel7.3版本)

1.selinux和firewalld状态为disabled

2.各主机信息如下:

主机ip
server1(安装好docker)172.25.83.1

 

四、Docker环境下LXCFS使用

 

1、下载lxfs的rpm包:lxcfs-2.0.5-3.el7.centos.x86_64.rpm并进行安装

[root@server1 ~]# yum install lxcfs-2.0.5-3.el7.centos.x86_64.rpm -y
  • 安装完lxcfs之后,会在/var/lib目录下生成lxcfs目录。只是/var/lib/lxcfs目录中没有内容。

 

2、启动lxcfs

[root@server1 ~]# lxcfs /var/lib/lxcfs/ &   #按回车结束,千万不要用Crtl+c,因为Ctrl+c会将该进程杀死。
[1] 3940
[root@server1 ~]# hierarchies:
  0: fd:   5: freezer
  1: fd:   6: perf_event
  2: fd:   7: pids
  3: fd:   8: blkio
  4: fd:   9: devices
  5: fd:  10: cpuacct,cpu
  6: fd:  11: net_prio,net_cls
  7: fd:  12: cpuset
  8: fd:  13: hugetlb
  9: fd:  14: memory
 10: fd:  15: name=systemd

  • 启动lxcfs之后,会在/var/lib/lxcfs目录下生成cgroup目录和proc目录

  • 使用"ps  ax"命令,查看lxcfs的进程

 

3、在docker中测试

[root@server1 ~]# docker run -it --name vm5 -m 200m \
> -v /var/lib/lxcfs/proc/cpuinfo:/proc/cpuinfo \
> -v /var/lib/lxcfs/proc/diskstats:/proc/diskstats \
> -v /var/lib/lxcfs/proc/meminfo:/proc/meminfo \
> -v /var/lib/lxcfs/proc/stat:/proc/stat \
> -v /var/lib/lxcfs/proc/swaps:/proc/swaps \
> -v /var/lib/lxcfs/proc/uptime:/proc/uptime \
> ubuntu
root@8457f7057af0:/# free -m   #我们可以看到总内存为200m,表示配置成功
             total       used       free     shared    buffers     cached
Mem:           200          1        198          6          0          0
-/+ buffers/cache:          0        199
Swap:          200          0        200

 


有人可能会有这样的疑问:为什么不直接把/var/lib/lxcfs/proc目录挂载到容器内的/proc目录下呢?

我进行过尝试,直接把/var/lib/lxcfs/proc目录挂载到容器内的/proc目录下,运行容器会报错,那为什么会报错呢,原因是什么呢?

答:

这是因为容器内的/proc目录下本身是有内容的,是系统的进程信息等等,如果直接把/var/lib/lxcfs/proc目录挂载到容器内的/proc目录下,会覆盖容器内/proc目录下的内容,而/proc目录下记录的是容器的进程信息等等内容,是不能被覆盖的,所以不能直接把/var/lib/lxcfs/proc目录挂载到容器内的/proc目录下。


  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值