searchusermenu
  • 发布文章
  • 消息中心
点赞
收藏
评论
分享
原创

Docker容器隔离技术

2023-08-10 07:15:13
23
0

在容器里执行top指令,会发现,它显示的信息是宿主机的CPU和内存数据,而不是当前容器的数据。造成该问题的原因在于,容器通过Cgroups来为容器进程设置资源限制,但是/proc 文件系统并不知道用户通过Cgroups给这个容器做了什么样的资源限制,/proc 文件系统不了解Cgroups限制的存在。

# 启动一个容器
teledb@teledb-XPS-8930:~$ docker run -it -m 256m --memory-swap 256m centos /bin/bash
[root@5dc9ff32e459 /]# top 查看发现并没有获取到正确的资源限制

执行top命令查看,发现容器没有获取到正确的资源限制

解决思路

宿主机上执行top指令,是从/proc/stats 目录下获取数据,所以容器不挂载宿主机的该目录即可。lxcfs可实现该功能,它将宿主机的/var/lib/lxcfs/proc/meminfo文件挂载到Docker容器的/proc/meminfo 位置后,容器中进程读取相应文件内容后,lxcfs的fuse实现会从容器对应的Cgroups中读取正确的内存限制,从而使应用获取正确的资源约束。

lxcfs安装

# yum install offline
[ceph@k8s-master lxcfs-4.0.7] sudo yum install -y --downloadonly --downloaddir=/data/tzj/rpm fuse fuse-lib fuse-devel
[ceph@k8s-master lxcfs-4.0.7] sudo yum localinstall /data/tzj/rpm/*.rpm

# make
[ceph@k8s-master lxcfs-4.0.7] cd docker/lxcfs-4.0.7/
[ceph@k8s-master lxcfs-4.0.7] ./configure
[ceph@k8s-master lxcfs-4.0.7] make
[ceph@k8s-master lxcfs-4.0.7] sudo make install

# test
[ceph@k8s-master lxcfs-4.0.7]$ lxcfs -v
4.0.7

隔离测试

[ceph@k8s-master docker] sudo mkdir -p /var/lib/lxcfs
[ceph@k8s-master docker] sudo lxcfs /var/lib/lxcfs
sudo: lxcfs: command not found
# bash -c error too,use root users
[root@k8s-master docker]# lxcfs /var/lib/lxcfs
Running constructor lxcfs_init to reload liblxcfs
mount namespace: 4
hierarchies:
  0: fd:   5: name=systemd
  1: fd:   6: perf_event
  2: fd:   7: memory
  3: fd:   8: cpu,cpuacct
  4: fd:   9: hugetlb
  5: fd:  10: blkio
  6: fd:  11: net_cls,net_prio
  7: fd:  12: cpuset
  8: fd:  13: pids
  9: fd:  14: freezer
 10: fd:  15: devices
Kernel supports swap accounting
api_extensions:
- cgroups
- sys_cpu_online
- proc_cpuinfo
- proc_diskstats
- proc_loadavg
- proc_meminfo
- proc_stat
- proc_swaps
- proc_uptime
- shared_pidns
- cpuview_daemon
- loadavg_daemon
- pidfds

再次运行docker容器

docker run -it centos /bin/bash

通过lxcfs运行

docker run -it -m 256m --memory-swap 256m \
      -v /var/lib/lxcfs/proc/cpuinfo:/proc/cpuinfo:rw \
      -v /var/lib/lxcfs/proc/diskstats:/proc/diskstats:rw \
      -v /var/lib/lxcfs/proc/meminfo:/proc/meminfo:rw \
      -v /var/lib/lxcfs/proc/stat:/proc/stat:rw \
      -v /var/lib/lxcfs/proc/swaps:/proc/swaps:rw \
      -v /var/lib/lxcfs/proc/uptime:/proc/uptime:rw \
      centos /bin/bash

执行top命令,成功获取到正确的资源限制

0条评论
0 / 1000
福尔摩斯军
8文章数
0粉丝数
福尔摩斯军
8 文章 | 0 粉丝
福尔摩斯军
8文章数
0粉丝数
福尔摩斯军
8 文章 | 0 粉丝
原创

Docker容器隔离技术

2023-08-10 07:15:13
23
0

在容器里执行top指令,会发现,它显示的信息是宿主机的CPU和内存数据,而不是当前容器的数据。造成该问题的原因在于,容器通过Cgroups来为容器进程设置资源限制,但是/proc 文件系统并不知道用户通过Cgroups给这个容器做了什么样的资源限制,/proc 文件系统不了解Cgroups限制的存在。

# 启动一个容器
teledb@teledb-XPS-8930:~$ docker run -it -m 256m --memory-swap 256m centos /bin/bash
[root@5dc9ff32e459 /]# top 查看发现并没有获取到正确的资源限制

执行top命令查看,发现容器没有获取到正确的资源限制

解决思路

宿主机上执行top指令,是从/proc/stats 目录下获取数据,所以容器不挂载宿主机的该目录即可。lxcfs可实现该功能,它将宿主机的/var/lib/lxcfs/proc/meminfo文件挂载到Docker容器的/proc/meminfo 位置后,容器中进程读取相应文件内容后,lxcfs的fuse实现会从容器对应的Cgroups中读取正确的内存限制,从而使应用获取正确的资源约束。

lxcfs安装

# yum install offline
[ceph@k8s-master lxcfs-4.0.7] sudo yum install -y --downloadonly --downloaddir=/data/tzj/rpm fuse fuse-lib fuse-devel
[ceph@k8s-master lxcfs-4.0.7] sudo yum localinstall /data/tzj/rpm/*.rpm

# make
[ceph@k8s-master lxcfs-4.0.7] cd docker/lxcfs-4.0.7/
[ceph@k8s-master lxcfs-4.0.7] ./configure
[ceph@k8s-master lxcfs-4.0.7] make
[ceph@k8s-master lxcfs-4.0.7] sudo make install

# test
[ceph@k8s-master lxcfs-4.0.7]$ lxcfs -v
4.0.7

隔离测试

[ceph@k8s-master docker] sudo mkdir -p /var/lib/lxcfs
[ceph@k8s-master docker] sudo lxcfs /var/lib/lxcfs
sudo: lxcfs: command not found
# bash -c error too,use root users
[root@k8s-master docker]# lxcfs /var/lib/lxcfs
Running constructor lxcfs_init to reload liblxcfs
mount namespace: 4
hierarchies:
  0: fd:   5: name=systemd
  1: fd:   6: perf_event
  2: fd:   7: memory
  3: fd:   8: cpu,cpuacct
  4: fd:   9: hugetlb
  5: fd:  10: blkio
  6: fd:  11: net_cls,net_prio
  7: fd:  12: cpuset
  8: fd:  13: pids
  9: fd:  14: freezer
 10: fd:  15: devices
Kernel supports swap accounting
api_extensions:
- cgroups
- sys_cpu_online
- proc_cpuinfo
- proc_diskstats
- proc_loadavg
- proc_meminfo
- proc_stat
- proc_swaps
- proc_uptime
- shared_pidns
- cpuview_daemon
- loadavg_daemon
- pidfds

再次运行docker容器

docker run -it centos /bin/bash

通过lxcfs运行

docker run -it -m 256m --memory-swap 256m \
      -v /var/lib/lxcfs/proc/cpuinfo:/proc/cpuinfo:rw \
      -v /var/lib/lxcfs/proc/diskstats:/proc/diskstats:rw \
      -v /var/lib/lxcfs/proc/meminfo:/proc/meminfo:rw \
      -v /var/lib/lxcfs/proc/stat:/proc/stat:rw \
      -v /var/lib/lxcfs/proc/swaps:/proc/swaps:rw \
      -v /var/lib/lxcfs/proc/uptime:/proc/uptime:rw \
      centos /bin/bash

执行top命令,成功获取到正确的资源限制

文章来自个人专栏
linux technology
8 文章 | 1 订阅
0条评论
0 / 1000
请输入你的评论
0
0