namespace与cgroups

  • 0. Guest OS 和 Host OS、一些基础信息
  • 1.namespace
  • 2.cgroups


0. Guest OS 和 Host OS、一些基础信息

  • Host OS(主人操作系统)就是安装在你硬件设备上的系统,而Guest OS(客人操作系统)则是安装在虚拟机(VM)上面的系统。
  • “敏捷”和“高性能”是容器相较于虚拟机最大的优势,也是它能够在 PaaS 这种更细粒度的资源管理平台上大行其道的重要原因。
  • 容器和虚拟机的区别

1.namespace

  • 从进程论容器一节中我们可以知道,他的隔离机制就是启动容器时,启动一堆namespace参数,来做到一个隔离的目的
  • 缺点:隔离不彻底
    1、由于容器共享的是宿主机的内核,所以它仍然是宿主机上一个独立的进程。所以在window上运行Linux容器或者低版本的linux上运行高版本的linux容器是不行的。
    2、时间的修改。容器使用的宿主机的内核,修改容器内部的时间会将宿主机的时间也修改掉。很多资源对象不能被namespace掉。相对于虚拟机来说自由度低,需要考虑什么能做什么不能做。

2.cgroups

  • 1、为什么要使用容器限制
    由于本身容器是宿主机下的一个进程,所有进程之间都是竞争关系,如果没有使用 资源限制,那么系统资源就可能会被其他进程占用或者容器进程将系统资源全部占用的情况。
  • 2、cgroups概念与作用
    Linux Cgroups 的全称是 Linux Control Group。它最主要的作用,就是限制一个进程组能够使用的资源上限,包括 CPU、内存、磁盘、网络带宽等等。此外,Cgroups 还能够对进程进行优先级设置、审计,以及将进程挂起和恢复等操作。
  • 3、限制作用
    在 Linux 中,Cgroups 给用户暴露出来的操作接口是文件系统,即它以文件和目录的方式组织在操作系统的 /sys/fs/cgroup 路径下。
mount -t cgroup   ##通过命令展示

在 /sys/fs/cgroup 下面有很多诸如 cpuset、cpu、 memory 这样的子目录,也叫子系统。这些都是我这台机器当前可以被 Cgroups 进行限制的资源种类。而在子系统对应的资源种类下,你就可以看到该类资源具体可以被限制的方法。

比如,对 CPU 子系统来说,我们就可以看到如下几个配置文件,这个指令是:

$ ls /sys/fs/cgroup/cpu
cgroup.clone_children cpu.cfs_period_us cpu.rt_period_us  cpu.shares notify_on_release
cgroup.procs      cpu.cfs_quota_us  cpu.rt_runtime_us cpu.stat  tasks

比如说限制CPU的一个具体操作示例

#1、进入/sys/fs/cgroup/cpu
#2、创建一个目录,这个目录又可以称为是一个控制组,下面会自动生成一些默认的资源限制文件,如cfs_period、cfs_quota、tasks等
#3、设置限制
$ echo 20000 > /sys/fs/cgroup/cpu/container/cpu.cfs_quota_us
#4、将被限制的进程写入tasks,上面的设置就会对该进程生效。因为容器也是一个特殊进程。
$ echo 226 > /sys/fs/cgroup/cpu/container/tasks 
#5、也可以通过命令去设置参数,比如下面的命令
$ docker run -it --cpu-period=100000 --cpu-quota=20000 ubuntu /bin/bash
  • 4、cgroups缺点:对/proc目录下的处理不到位。容器里面top查看到的是宿主机的信息。/proc存储的是正在运行的进程状态信息。
    解决方法:lxcfs
  • LXCFS,是一个开源的FUSE(用户态文件系统),支持LXC容器,同时支持Docker容器。启动以后会在指定目录中维护 /proc目录中的文件同名的文件,从而保证容器读取数据时读取到lxcfs维护的/proc文件中状态数据。
  • LXCFS提供procfs中的信息:
    /proc/cpuinfo
    /proc/diskstats
    /proc/meminfo
    /proc/stat
    /proc/swaps
    /proc/uptime
    /proc/slabinfo
    /sys/devices/system/cpu/online
wget https://copr-be.cloud.fedoraproject.org/results/ganto/lxd/epel-7-x86_64/00486278-lxcfs/lxcfs-2.0.5-3.el7.centos.x86_64.rpm  ##下载rpm包
yum install lxcfs-2.0.5-3.el7.centos.x86_64.rpm    ##安装
lxcfs /var/lib/lxcfs &    ##启动

容器中使用s3fs_系统资源