Lxcfs资源视图隔离
1. 资源视图隔离
容器中的执行top、free等命令展示出来的CPU,内存等信息是从/proc目录中的相关文件里读取出来的。而容器并没有对/proc,/sys等文件系统做隔离,因此容器中读取出来的CPU和内存的信息是宿主机的信息,与容器实际分配和限制的资源量不同。
/proc/cpuinfo
/proc/diskstats
/proc/meminfo
/proc/stat
/proc/swaps
/proc/uptime为了实现让容器内部的资源视图更像虚拟机,使得应用程序可以拿到真实的CPU和内存信息,就需要通过文件挂载的方式将cgroup的真实的容器资源信息挂载到容器内/proc下的文件,使得容器内执行top、free等命令时可以拿到真实的CPU和内存信息。
2. Lxcfs简介
lxcfs是一个FUSE文件系统,使得Linux容器的文件系统更像虚拟机。lxcfs是一个常驻进程运行在宿主机上,从而来自动维护宿主机cgroup中容器的真实资源信息与容器内/proc下文件的映射关系。
lxcfs的命令信息如下:
#/usr/local/bin/lxcfs -h
Usage:
lxcfs [-f|-d] -u -l -n [-p pidfile] mountpoint
-f running foreground by default; -d enable debug output
-l use loadavg
-u no swap
Default pidfile is /run/lxcfs.pid
lxcfs -hlxcfs的源码:https://github.com/lxc/lxcfs
3. Lxcfs原理
lxcfs实现的基本原理是通过文件挂载的方式,把cgroup中容器相关的信息读取出来,存储到lxcfs相关的目录下,并将相关目录映射到容器内的/proc目录下,从而使得容器内执行top,free等命令时拿到的/proc下的数据是真实的cgroup分配给容器的CPU和内存数据。
原理图

映射目录
cpu
/proc/cpuinfo
/var/lib/lxcfs/{container_id}/proc/cpuinfo
内存
/proc/meminfo
/var/lib/lxcfs/{container_id}/proc/meminfo
/proc/diskstats
/var/lib/lxcfs/{container_id}/proc/diskstats
/proc/stat
/var/lib/lxcfs/{container_id}/proc/stat
/proc/swaps
/var/lib/lxcfs/{container_id}/proc/swaps
/proc/uptime
/var/lib/lxcfs/{container_id}/proc/uptime
/proc/loadavg
/var/lib/lxcfs/{container_id}/proc/loadavg
/sys/devices/system/cpu/online
/var/lib/lxcfs/{container_id}/sys/devices/system/cpu/online
4. 使用方式
4.1. 安装lxcfs
环境准备
源码编译安装
或者通过rpm包安装
查看是否安装成功
4.2. 运行lxcfs
运行lxcfs主要执行两条命令。
可以通过systemd运行。
lxcfs.service文件:
运行命令
4.3. 挂载容器内/proc下的文件目录
/proc下的文件目录4.4. 验证容器内CPU和内存
5. 使用k8s集群部署
使用k8s集群部署与systemd部署方式同理,需要解决2个问题:
在每个node节点上部署lxcfs常驻进程,lxcfs需要通过镜像来运行,可以通过daemonset来部署。
实现将lxcfs维护的目录自动挂载到pod内的
/proc目录。
具体可参考:https://github.com/denverdino/lxcfs-admission-webhook
5.1. lxcfs-image
star.sh
5.2. daemonset
lxcfs-admission-webhook实现了一个动态的准入webhook,更准确的讲是实现了一个修改性质的webhook,即监听pod的创建,然后对pod执行patch的操作,从而将lxcfs与容器内的目录映射关系植入到pod创建的yaml中从而实现自动挂载。
具体部署参考:install.sh
执行命令
参考:
https://github.com/lxc/lxcfs
https://linuxcontainers.org/lxcfs/
https://github.com/denverdino/lxcfs-admission-webhook
https://kubernetes.io/docs/reference/access-authn-authz/extensible-admission-controllers/
最后更新于
这有帮助吗?