ToB企服应用市场:ToB评测及商务社交产业平台

标题: 容器技术所涉及Linux内核关键技术 [打印本页]

作者: 灌篮少年    时间: 前天 23:20
标题: 容器技术所涉及Linux内核关键技术
容器技术所涉及Linux内核关键技术

一、容器技术宿世此生

1.1 1979年 — chroot


1.2 2000年 — FreeBSD Jails


1.3 2001年 — Linux VServer


1.4 2004年 — Solaris容器


1.5 2005年 — OpenVZ


1.6 2006年 — Process容器


1.7 2007年 — Control Groups

Control Groups也就是谷歌实现的cgroups,其于2007年被添加至Linux内核当中。
1.8 2008年 — LXC


1.9 2011年 — Warden


1.10 2013年 — LMCTFY


Libcontainer项目最初由Docker公司建立,如今已经被归入开放容器基金会的管辖范畴。
1.11 2013年-Docker


二、NameSpace

2.1 NameSpace先容


2.2 Linux体系中NameSpace分类

定名空间描述作用备注进程定名空间隔离进程IDLinux通过定名空间管理进程号,同一个进程,在不同的定名空间进程号不同进程定名空间是一个父子结构,子空间对于父空间可见网络定名空间隔离网络装备、协议栈、端口等通过网络定名空间,实现网络隔离docker采用虚拟网络装备,将不同定名空间的网络装备毗连到一起IPC定名空间隔离进程间通讯进程间交互方法PID定名空间和IPC定名空间可以组合起来用,同一个IPC名字空间内的进程可以彼此看见,允许进行交互,不同空间进程无法交互挂载定名空间隔离挂载点隔离文件目次进程运行时可以将挂载点与体系分离,使用这个功能时,我们可以达到 chroot 的功能,而在安全性方面比 chroot 更高UTS定名空间隔离Hostname和NIS域名让容器拥有独立的主机名和域名,从而让容器看起来像个独立的主机目的是独立出主机名和网络信息服务(NIS)用户定名空间隔离用户和group ID每个容器内上的用户跟宿主主机上不在一个定名空间同进程 ID 一样,用户 ID 和组 ID 在定名空间内外是不一样的,并且在不同定名空间内可以存在雷同的 ID 2.3 NameSpace应用案例

   以net namespace为例
  

2.3.1 创建net定名空间

  1. 创建名称为msb的网络命名空间
  2. # ip netns add msb
复制代码
  1. 查看已创建的网络命名空间
  2. # ip netns ls
  3. msb
复制代码
2.3.2 删除net定名空间

  1. 删除已创建的网络命名空间
  2. # ip netns delete msb
复制代码
2.3.3 在net定名空间中执行命令

  1. 在网络命名空间中执行bash命令,如果想退出,需要使用exit
  2. # ip netns exec msb bash
复制代码
2.3.4 在net命令空间中执行查看网络毗连(网卡)命令

  1. 在网络命名空间中查看网络命名空间中的网卡信息
  2. # ip link
  3. 1: lo: <LOOPBACK> mtu 65536 qdisc noop state DOWN mode DEFAULT group default qlen 1000
  4.     link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
复制代码
  1. 在Linux主机系统中查看
  2. # ip netns exec msb ip link list
  3. 1: lo: <LOOPBACK> mtu 65536 qdisc noop state DOWN mode DEFAULT group default qlen 1000
  4.     link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
复制代码
2.3.5 退出当前的net定名空间

  1. 退出已进入的网络命名空间
  2. # exit
  3. exit
复制代码
2.3.6 在net定名空间中执行多条命令

  1. 在网络命名空间中查看路由表
  2. # route -n
  3. Kernel IP routing table
  4. Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
复制代码
  1. 在网络命名空间中查看防火墙规则
  2. # iptables -t nat -nL
  3. Chain PREROUTING (policy ACCEPT)
  4. target     prot opt source               destination         
  5. Chain INPUT (policy ACCEPT)
  6. target     prot opt source               destination         
  7. Chain OUTPUT (policy ACCEPT)
  8. target     prot opt source               destination         
  9. Chain POSTROUTING (policy ACCEPT)
  10. target     prot opt source               destination
复制代码
2.3.7 创建虚拟网卡

   同时创建一对虚拟网卡
  1. 创建虚拟网卡对
  2. # ip link add veth0 type veth peer name veth1
复制代码
  1. 在物理机上查看
  2. # ip a s
  3. ......
  4. 10: veth1@veth0: <BROADCAST,MULTICAST,M-DOWN> mtu 1500 qdisc noop state DOWN group default qlen 1000
  5.     link/ether de:44:f8:b7:12:65 brd ff:ff:ff:ff:ff:ff
  6. 11: veth0@veth1: <BROADCAST,MULTICAST,M-DOWN> mtu 1500 qdisc noop state DOWN group default qlen 1000
  7.     link/ether 46:5e:89:8c:cb:b3 brd ff:ff:ff:ff:ff:ff
复制代码
2.3.8 迁移虚拟网卡到定名空间中

   这两个网卡还都属于“default”或“global”定名空间,和物理网卡一样。把此中一个网卡转移到定名空间msb中。
  1. 把创建的veth1网卡添加到msb网络命名空间中
  2. # ip link set veth1 netns msb
复制代码
  1. 在Linux系统命令行查看网络命名空间中的网络
  2. # ip netns exec msb ip link
  3. 1: lo: <LOOPBACK> mtu 65536 qdisc noop state DOWN mode DEFAULT group default qlen 1000
  4.     link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
  5. 10: veth1@if11: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN mode DEFAULT group default qlen 1000
  6.     link/ether de:44:f8:b7:12:65 brd ff:ff:ff:ff:ff:ff link-netnsid 0
复制代码
2.3.9 定名空间中迁出虚拟网卡

  1. 在Linux系统命令行把虚拟网卡veth1从网络命名空间删除
  2. # ip netns exec msb ip link delete veth1
复制代码
  1. 在Linux系统命令行查看结果
  2. # ip netns exec msb ip link
  3. 1: lo: <LOOPBACK> mtu 65536 qdisc noop state DOWN mode DEFAULT group default qlen 1000
  4.     link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
复制代码
2.3.10 配置虚拟网卡IP地址

  1. 再次创建虚拟网卡,添加到msb网络命名空间,并设置IP地址
  2. # ip link add veth0 type veth peer name veth1
  3. # ip link set veth1 netns msb
  4. # ip netns exec msb ip addr add 192.168.50.2/24 dev veth1
复制代码
  1. 在Linux系统命令行查看网络状态
  2. # ip netns exec msb ip addr
  3. 1: lo: <LOOPBACK> mtu 65536 qdisc noop state DOWN group default qlen 1000
  4.     link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
  5. 12: veth1@if13: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN group default qlen 1000
  6.     link/ether fe:20:ac:a8:13:4c brd ff:ff:ff:ff:ff:ff link-netnsid 0
  7.     inet 192.168.50.2/24 scope global veth1
  8.        valid_lft forever preferred_lft forever
复制代码
  1. 启动虚拟网卡,veth1与lo全部要启动
  2. # ip netns exec msb ip link set veth1 up
  3. # ip netns exec msb ip link set lo up
复制代码
  1. 为物理机veth0添加IP地址
  2. # ip a s
  3. ......
  4. 15: veth0@if14: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN group defau
  5. lt qlen 1000
  6.     link/ether 2e:b4:40:c8:73:dc brd ff:ff:ff:ff:ff:ff link-netnsid 0
复制代码
  1. # ip addr add 192.168.50.3/24 dev veth0
  2. # ip a s veth0
  3. 15: veth0@if14: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN group default qlen 1000
  4.     link/ether 2e:b4:40:c8:73:dc brd ff:ff:ff:ff:ff:ff link-netnsid 0
  5.     inet 192.168.50.3/24 scope global veth0
  6.        valid_lft forever preferred_lft forever
复制代码
  1. # ip link set veth0 up
复制代码
  1. 在宿主机上ping msb中的veth1
  2. # ping 192.168.50.2
  3. PING 192.168.50.2 (192.168.50.2) 56(84) bytes of data.
  4. 64 bytes from 192.168.50.2: icmp_seq=1 ttl=64 time=0.102 ms
  5. 64 bytes from 192.168.50.2: icmp_seq=2 ttl=64 time=0.068 ms
  6. 64 bytes from 192.168.50.2: icmp_seq=3 ttl=64 time=0.068 ms
复制代码
  1. 在msb中的veth1 ping 宿主机上veth0
  2. # ip netns exec msb ping 192.168.50.3
  3. PING 192.168.50.3 (192.168.50.3) 56(84) bytes of data.
  4. 64 bytes from 192.168.50.3: icmp_seq=1 ttl=64 time=0.053 ms
  5. 64 bytes from 192.168.50.3: icmp_seq=2 ttl=64 time=0.031 ms
  6. 64 bytes from 192.168.50.3: icmp_seq=3 ttl=64 time=0.029 ms
复制代码
  1. 如果需要访问本机的其它网段,可手动添加如下默认路由条目。
  2. # ip netns exec msb ip route add default via 192.168.50.3
复制代码
  关于怎样ping通外网主机,可设置路由转发完成。
  三、CGroups

3.1 CGroups先容



3.2 CGroups功能


3.3 CGroups应用案例

3.3.1 安装及开启服务

  1. [root@localhost ~]# yum -y install libcgroup
  2. [root@localhost ~]# systemctl start cgconfig.service        
  3. [root@localhost ~]# systemctl enable cgconfig.service
复制代码
3.3.2 限定进程使用CPU

3.3.2.1 查看cpu shares

  1. 查看资源限制子系统
  2. [root@localhost ~]# lssubsys
  3. cpuset
  4. cpu,cpuacct
  5. memory
  6. devices
  7. freezer
  8. net_cls,net_prio
  9. blkio
  10. perf_event
  11. hugetlb
  12. pids
  13. 查看子系统配置文件所在位置
  14. [root@localhost ~]# ls /sys/fs/cgroup/
  15. blkio  cpuacct      cpuset   freezer  memory   net_cls,net_prio  perf_event  systemd
  16. cpu    cpu,cpuacct  devices  hugetlb  net_cls  net_prio          pids
  17. [root@localhost ~]# ls /sys/fs/cgroup/cpu
  18. cgroup.clone_children  cpuacct.stat          cpu.cfs_quota_us   cpu.stat
  19. cgroup.event_control   cpuacct.usage         cpu.rt_period_us   notify_on_release
  20. cgroup.procs           cpuacct.usage_percpu  cpu.rt_runtime_us  release_agent
  21. cgroup.sane_behavior   cpu.cfs_period_us     cpu.shares         tasks
  22. 查看CPU时间分片,用于保证分组所得到的CPU分片总量。
  23. [root@localhost ~]# cat /sys/fs/cgroup/cpu/cpu.shares
  24. 1024
复制代码
3.3.2.2 使用CPU子体系创建2个group分组

  1. [root@localhost ~]# vim /etc/cgconfig.conf
  2. group lesscpu {
  3.         cpu{
  4.                 cpu.shares=200;
  5.         }       
  6. }
  7. group morecpu {
  8.         cpu{
  9.                 cpu.shares=800;
  10.         }       
  11. }
  12. [root@localhost ~]# systemctl restart cgconfig
复制代码
准备一个脚本
  1. #!/bin/bash
  2. a=1
  3. while true
  4. do
  5.         a=$[$a+1]
  6. done
复制代码
将将要运行的应用步调分配到指定分组(请使用单CPU呆板,三个终端验证)
  1. 终端1# cgexec -g cpu:lesscpu sh /tmp/1.sh
  2. 终端2# cgexec -g cpu:morecpu sh /tmp/1.sh
  3. 终端3# top
复制代码
PS: 如果主机有多CPU,为了验证效果,可以进行如下操作
  1. # lscpu
  2. # echo 0 > /sys/devices/system/cpu/cpu0/online
  3. # echo 1 > /sys/devices/system/cpu/cpu1/online
复制代码
200;
}
}
group morecpu {
cpu{
cpu.shares=800;
}
}
[root@localhost ~]# systemctl restart cgconfig
  1. 准备一个脚本~~~powershell#!/bin/bash
  2. a=1
  3. while true
  4. do
  5.         a=$[$a+1]
  6. done
复制代码
将将要运行的应用步调分配到指定分组(请使用单CPU呆板,三个终端验证)
  1. 终端1# cgexec -g cpu:lesscpu sh /tmp/1.sh
  2. 终端2# cgexec -g cpu:morecpu sh /tmp/1.sh
  3. 终端3# top
复制代码
PS: 如果主机有多CPU,为了验证效果,可以进行如下操作
  1. # lscpu
  2. # echo 0 > /sys/devices/system/cpu/cpu0/online
  3. # echo 1 > /sys/devices/system/cpu/cpu1/online
复制代码
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。




欢迎光临 ToB企服应用市场:ToB评测及商务社交产业平台 (https://dis.qidao123.com/) Powered by Discuz! X3.4