LINUX内核中运用的namespace、OverlayFS、cgroup技术

1.namespace

Linux Namespace是一种内核级别隔离系统资源的方法,来实现资源隔离的目的,可实现系统资源隔离的列表如下:(/proc/$$/ns)

Mnt: 隔离文件系统挂载点

UTS: 隔离主机名和域名信息

IPC: 隔离进程间通信

PID: 隔离进程的ID

net: 隔离网络资源

User: 隔离用户和用户组的ID

用户可以在/proc/$$/ns文件下看到本进程所属的Namespace的文件信息

[root@localhost ~]# ll /proc/$$/ns
total 0
lrwxrwxrwx 1 root root 0 Jun 11 19:43 ipc -> ipc:[4026531839]
lrwxrwxrwx 1 root root 0 Jun 11 19:43 mnt -> mnt:[4026531840]
lrwxrwxrwx 1 root root 0 Jun 11 19:43 net -> net:[4026531956]
lrwxrwxrwx 1 root root 0 Jun 11 19:43 pid -> pid:[4026531836]
lrwxrwxrwx 1 root root 0 Jun 11 19:43 user -> user:[4026531837]
lrwxrwxrwx 1 root root 0 Jun 11 19:43 uts -> uts:[4026531838]
 

案例网络操作:

1.创建一个名称“linux"的网络名称空间,并启动。

[root@localhost 为"oldboyedu~]# ip netns add linux

[root@localhost ~]# ll /var/run/netns/linux 

[root@localhost ~]# ip netns exec linux ip a

[root@localhost ~]# ip netns exec oldboyedu-linux ifconfig lo up

2.主机创建网络设备对,将"veth200"设备放到到自定义的"linux"网络名称空间,并配置IP地址。

[root@localhost ~]# ip link add veth100 type veth peer name veth200 
[root@localhost ~]# ip link set veth200 netns oldboyedu-linux
[root@localhost ~]# ip netns exec oldboyedu-linux ifconfig veth200 172.31.100.200/24 up

[root@localhost ~]# ifconfig veth100 172.31.100.100/24 up

3.配置完成后可以互通,添加网关,可跨网段ping通

[root@localhost ~]# ping 172.31.100.200

[root@localhost ~]# ip netns exec oldboyedu-linux ping 172.31.100.100

[root@localhost ~]# ip netns exec oldboyedu-linux ping 10.0.0.102

[root@localhost ~]# ip netns exec oldboyedu-linux route add default gw 172.31.100.100

[root@localhost ~]# ip netns exec oldboyedu-linux ping 10.0.0.10

2.OverlayFS

OverlayFS是一种堆叠文件系统,它依赖并建立在其它的文件系统之上(例如ext4fs和xfs等),并不直接参与磁盘空间结构的划分,仅仅将原来系统文件中的文件或者目录进行"合并一起",最后向用户展示"合并"的文件是在同一级的目录, 这就是联合挂载技术, 相对于AUFS (<1.12 早期使用的存储技术), OverlayFS速度更快,实现更简单。

Linux内核为Docker提供的OverlayFS驱动有两种:Overlay和Overlay2。而Overlay2是相对于Overlay的一种改进,在Inode利用率方面比Overlay更有效。

但是Overlay有环境需求:
    (1)Docker版本17.06.02+;
    (2)宿主机文件系统需要是EXT4或XFS格式;
    
    
OverlayFS实现方式:
    OverlayFS通过三个目录:lower目录、upper目录、以及work目录实现。
        lower:
            一般对应的是只读数据。
        upper:
            可以进行读写操作的目录。
        work:
            目录为工作基础目录,挂载后会自动创建一个work子目录(实际测试手动卸载后该目录并不会被删除)
            该目录主要是存储一些临时存放的结果或中间数据的工作目录。
            
    值得注意的是,在使用过程中其内容用户不可见,最后联合挂载完成给用户呈现的统一视图称为merged目录。
    
OverlayFS结构分为三个层: LowerDir、Upperdir、MergedDir 
    LowerDir (只读)
        只读的image layer,其实就是rootfs。
        在使用Dockfile构建镜像的时候, Image Layer可以分很多层,所以对应的lowerdir会很多(源镜像)。 
        Lower 包括两个层:
            (1)系统的init
                1)容器在启动以后, 默认情况下lower层是不能够修改内容的, 但是用户有需求需要修改主机名与域名地址, 那么就需要添加init层中的文件(hostname, resolv.conf,hosts,mtab等文件), 用于解决此类问题;
                2)修改的内容只对当前的容器生效, 而在docker commit提交为镜像时候,并不会将init层提交。
                3)init文件存放的目录为/var/lib/docker/overlay2/<init_id>/diff
            (2)容器的镜像层
                不可修改的数据。
                
    Upperdir (读写)
        upperdir则是在lowerdir之上的一层, 为读写层。容器在启动的时候会创建, 所有对容器的修改, 都是在这层。比如容器启动写入的日志文件,或者是应用程序写入的临时文件。

    MergedDir (展示)
        merged目录是容器的挂载点,在用户视角能够看到的所有文件,都是从这层展示的。

3. CGroup

cgroup 是 Linux 内核的一个功能,用来限制、控制与分离一个进程组的资源(如CPU、内存、磁盘输入输出等)。当我们将可用系统资源按特定百分比分配给 cgroup 时,剩余的资源可供系统上的其他 cgroup 或其他进程使用。在Linux系统中能够控制的资源列表如下:

    cpu:
        主要限制进程的cpu使用率。
    cpuacct:
        可以统计cgroups中的进程的cpu使用报告。
    cpuset:
        可以为cgroups中的进程分配单独的cpu节点或者内存节点。
    memory:
        可以限制进程的memory使用量。
    blkio:
        可以限制进程的块设备io。
    devices:
        可以控制进程能够访问某些设备。
    net_cls:
        可以标记cgroups中进程的网络数据包,然后可以使用tc模块(traffic control)对数据包进行控制。
    net_prio:
        这个子系统用来设计网络流量的优先级
    freezer:
        可以挂起或者恢复cgroups中的进程。
    ns:
        可以使不同cgroups下面的进程使用不同的namespace
    hugetlb:
        这个子系统主要针对于HugeTLB系统进行限制,这是一个大页文件系统。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值