使用lxcfs容器为其他docker容器提供proc隔离能力

背景

容器可以通过cgoup和namespace对容器使用的资源进行一定程度的隔离,可以对pid,net,mount fs,cpu和内存进行隔离。但是一般意义上,容器内部看到的/proc/文件系统下的信息全部是宿主机上的信息。在容器内部可以看到容器可以使用的内存、cpu和宿主机完全一致,这对于java容器会引入很严重的问题。因为在常规PaaS系统上,为了保证每个容器不会过度消耗宿主机内存资源,在容器启动时都会带上--memory-limit参数,这个参数限制了容器里所有进程能够使用的内存和,如果容器内部使用的内存超限,在默认配置下会触发os的oom-killer将容器内部进程杀死。Java运行的Jvm,它起来后会申请大量的内存用于Jvm管理的内存。而申请的基础就是Jvm所在机器上/proc/meminfo看到的内存大小信息。所以在PaaS系统上,老式Jvm常常会导致自己被Os的oom-killer杀死。
解决办法有两种:

  • 升级Jvm:采用能够意识到容器的jum版本

1.Jvm9上,使用parameters -xx:unlockExperimentalVMOptions and -xx:+UseCGoupMemoryLimitForHeap
2.升级到Jvm10,Jvm10是能够意识到容器的jvm
3.使用(特殊的openjdk容器镜像){https://hub.docker.com/r/fabric8/java-jboss-openjdk8-jdk}镜像,此镜像容器使用50%容器内存限制给jvm使用

  • 采用lxcfs方式对容器的/proc系统进行修改——这既是本文介绍的方法

lxcfs介绍

lxcfs是一种基于fuse实现的用户态文件系统,最刚开在ubuntu上使用,现在可以使用在centos,federa上。它使用c开发,依赖于fuse包。
为容器提供如下目录:

  • /proc/cpuinfo
  • /proc/meminfo
  • /proc/diskstats
  • /proc/swaps
  • /proc/uptime

当容器里进程访问到这些目录后,lxcfs将转换到进程所在的cgroup(也就是进程所在容器的宿主机cgoup里)读取memlimit,swaplimit ,cpuset,disk和uptime。由此提供容器独特视角的/proc/xx信息。
下图为lxcfs的架构


lxcfs架构

主机lxcfs为docker容器提供proc隔离

lxcfs安装(编译)

网上常见的lxcfs都是采用下载lxcfs-2.0.x rpm方式安装。其实lxcfs工程只依赖于fuse包,如果需要从github代码编译还需要安装:automake,autoconf包,当然gcc这些必须的。可以直接从github下载最新的lxcfs代码进行编译即可。
笔者使用的centos7.4系统,安装了fuse-devel、fuse-libs和fuse包。
Step1: 在代码根目录执行

bootstrap.sh
./configure
make

执行完毕之后在代码根目录出现了一个lxcfs的elf文件,要运行它需要将.libs/liblxcfs.so拷贝到指定目录上去
通过下面命令运行lxcfs

Mkdir /home/zxy/lxcfs-workdir
./lxcfs /home/zxy/lxcfs-workdir

运行起来以后,可以到/home/zxy/lxcfs-workdir下看到两个目录:
cgroup和proc目录
此时证明lxcfs已经成功了。
首先需要内核支持fuse,可以到/boot/下查看config文件中fuse是否配置为Y或者M

容器启动时刻可以通过下面命令为每个容器保证一个独立的/proc

docker  run --rm -name zxy-lxcfs-targe -m 64m --cpuset-cpus 1 -v /home/zxy/lxcfs-workdir/meminfo:/proc/meminfo \
-v /home/zxy/lxcfs-workdir/swaps:/proc/swaps \
-v /home/zxy/lxcfs-workdir/cpuinfo:/proc/cpuinfo \
-v /home/zxy/lxcfs-workdir/diskinfo:/proc/diskinfo \
-v /home/zxy/lxcfs-workdir/uptime:/proc/uptime -it centos:latest /bin/bash

容器启动后使用free命令可以看到容器存储只有64M,通过cat /proc/cpuinfo看到只有一个cpu,通过uptime看到启动时间为刚启动。

lxcfs容器为docker容器提供proc隔离

首先第一步需要主机上编译完成lxcfs。
lxcfs容器生成方法很简单,既可以采用docker build从centos镜像创建一个lxcfs;也可以采用docker cp方法将lxcfs和liblxcfs.so拷贝到centos容器内部,将fuse动态库也用同样的方式拷贝到centos容器内部,然后docker commit 将修改过centos容器提交为一个镜像。笔者采用后者方式生产一个lxcfs镜像。
通过下面命令启动此镜像

Docker run --privileged=true --pie=host -v /sys/fs/cgroup:/sys/fs/cgroup:ro -v /home/zxy/lxcfs-workdir:/var/lib/lxcfs:rshared --it centos-lxcfs /home/lxcfs /var/lib/lxcfs

此容器运行后,可以在宿主机上检查/home/zxy/lxcfs-workdir有无cgroup和proc目录证明lxcfs有无正常启动。
如果正常可以上上一小节中介绍的方法,启动其他docker容器,此时其他docker容器内部看到的/proc/就变为
lxcfs修改后的了。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,496评论 6 501
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,407评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,632评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,180评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,198评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,165评论 1 299
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,052评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,910评论 0 274
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,324评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,542评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,711评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,424评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,017评论 3 326
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,668评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,823评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,722评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,611评论 2 353

推荐阅读更多精彩内容