Lxcfs资源视图隔离

1. 资源视图隔离

容器中的执行topfree等命令展示出来的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 -h

lxcfs的源码:https://github.com/lxc/lxcfs

3. Lxcfs原理

lxcfs实现的基本原理是通过文件挂载的方式,把cgroup中容器相关的信息读取出来,存储到lxcfs相关的目录下,并将相关目录映射到容器内的/proc目录下,从而使得容器内执行top,free等命令时拿到的/proc下的数据是真实的cgroup分配给容器的CPU和内存数据。

原理图

lxcfs

映射目录

类别
容器内目录
宿主机lxcfs目录

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下的文件目录

4.4. 验证容器内CPU和内存

5. 使用k8s集群部署

使用k8s集群部署与systemd部署方式同理,需要解决2个问题:

  1. 在每个node节点上部署lxcfs常驻进程,lxcfs需要通过镜像来运行,可以通过daemonset来部署。

  2. 实现将lxcfs维护的目录自动挂载到pod内的/proc目录。

具体可参考:https://github.com/denverdino/lxcfs-admission-webhook

5.1. lxcfs-image

Dockerfile

star.sh

5.2. daemonset

lxcfs-daemonset.yaml

lxcfs-admission-webhook实现了一个动态的准入webhook,更准确的讲是实现了一个修改性质的webhook,即监听pod的创建,然后对pod执行patch的操作,从而将lxcfs与容器内的目录映射关系植入到pod创建的yaml中从而实现自动挂载。

deployment

具体部署参考: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/

最后更新于

这有帮助吗?