容器技术
- 容器与虚拟机的差异
1)虚拟机的原理:通过额外的虚拟化层,将虚拟机中运行的操作系统指令翻译成宿主机系统能够执行的系统调用然后操作具体的硬件。
优点:实现虚拟机和宿主机操作系统的异构,如在Linux系统上运行Windows的虚拟机
缺点:依赖于硬件的支持,特别是CPU虚拟化的支持
2)容器技术的原理:完全建立在操作系统内核特性之上,是一种与运行硬件无关的虚拟化技术。
优点:由于没有转换异构指令的虚拟化层,因此运行效率高于虚拟机。
缺点:只能实现与宿主机操作系统相同系统的虚拟化。
3)在实际使用中,常常将两者相结合,以实现“跨不同操作系统”运行容器的目的。
- Namespace & CGroup
Linux系统中的容器技术主要是利用内核的Namespace特性和CGroup特性实现了服务进程组的资源隔离和配额。
Namespace:
实现内核级虚拟化(容器)服务,让同一个Namespace下的进程可以感知彼此的变化,同时又能确保对外界的进程一无所知,以达到独立和隔离的目的。
CGroup:
Linux内核提供的一种可以限制、记录、隔离进程组所使用的物理资源(包括CPU、内存、磁盘I/O速度等)的机制,也是容器管理虚拟化系统资源的手段。
- Namespace
通过查看 /proc 目录下以进程ID作为名称的子目录中的信息,能了解该进程的一组Namespace ID
root@Ubuntu14:/proc# ls -l /proc/1009/ns total 0 lrwxrwxrwx 1 root root 0 Jun 20 14:00 cgroup -> cgroup:[4026531835] lrwxrwxrwx 1 root root 0 Jun 20 14:00 ipc -> ipc:[4026531839] lrwxrwxrwx 1 root root 0 Jun 20 14:00 mnt -> mnt:[4026531840] lrwxrwxrwx 1 root root 0 Jun 20 14:00 net -> net:[4026531957] lrwxrwxrwx 1 root root 0 Jun 20 14:00 pid -> pid:[4026531836] lrwxrwxrwx 1 root root 0 Jun 20 14:00 user -> user:[4026531837] lrwxrwxrwx 1 root root 0 Jun 20 14:00 uts -> uts:[4026531838] root@Ubuntu14:/proc#
每个进程都具有这样的7个属性。
CGroup Namespace:(cgroup)
提供基于CGroup的隔离能力。
使不同进程组看到的CGroup规则各不相同。
IPC Namespace:(ipc)
提供基于System V进程信道的隔离能力。
IPC(Inter-Process Communication)是Linux中的一种标准的进程间通信方式,包括共享内存、信号量、消息队列等具体方法。
IPC隔离使得只有在同一命名空间下的进程才能相互通信。
Mount Namespace:(mnt)
提供基于磁盘挂载点和文件系统的隔离能力。
为隔离空间创建独立的mount节点树。
在文件系统隔离的作用下,容器中的进程将无法访问到容器以外的任何文件。必要时,可通过挂载额外目录的方式和主机共享文件系统。
Network Namespace:(net)
提供基于网络栈的隔离能力。
让每个容器通过命名空间来隔离和管理自己的网卡配置。
虚拟网卡最终可以通过某些方式(NAT、VxLan、SDN等)连接到实际的物理网卡上,从而实现像普通主机一样的网络通信。
PID Namespace:(pid)
提供基于进程的隔离能力。
进程隔离使得在容器内的首个进程成为所在命名空间中PID值为1的进程。
PID为1的进程很特殊,它作为所有进程的根父进程,有很多特权,如屏蔽信号、接管孤儿进程等。
User Namespace:(user)
提供基于用户的隔离能力。
同一系统用户在不同的命名空间可拥有不同的UID和GID,它们之间存在一定的映射关系。
因此,在特定命名空间中,UID为0的用户并不一定是root系统管理员。
该特性限制了容器的用户权限,有利于保护主机系统的安全。
UTS Namespace:(uts)
提供基于主机名的隔离能力。
每个独立容器空间中的程序可以有不同的主机名称信息。
该主机名不唯一,允许重复。因此,它虽然可以在网络中用于通信会定位服务,但并不是可靠的方法。
- CGroup
查看任意进程在 /proc 目录下的内容,可以看到下面这样一个名为cgroup的文件
root@Ubuntu14:/proc# cat /proc/1009/cgroup 13:pids:/ 12:hugetlb:/ 11:net_prio:/ 10:perf_event:/ 9:net_cls:/ 8:freezer:/ 7:devices:/ 6:memory:/ 5:blkio:/ 4:cpuacct:/ 3:cpu:/ 2:cpuset:/ 1:name=systemd:/ root@Ubuntu14:/proc#
这当中的每个挂载点都是一个CGroup子系统的根目录,例如上图中进程所属的cpuset子系统路径为 "/",实际上就是指 "/sys/fs/cgroup/cpuset" 这个目录,其余子系统的位置可以此类推。
在Linux 4.7.1内核中,已经支持了10类不同的子系统,分别如下所示:
1)hugetlb: 限制进程对大页内存(Hugepage)的使用
2)memory: 限制进程对内存和Swap的使用,并生成每个进程使用的内存资源报告
3)pids: 限制每个CGroup中能够创建的进程总数
4)cpuset: 在多核系统中为进程分配独立CPU和内存
5)devices: 允许或拒绝进程访问特定设备
6)net_cls 和 net_prio: 标记每个网络包,并控制网卡优先级
7)cpu 和 cpuacct: 限制进程对CPU的用量,并生成每个进程所使用的CPU报告
8)freezer: 挂起或恢复特定的进程
9)blkio: 为进程对块设备(如磁盘、USB等)限制输入/输出
10)perf_event: 监测属于特定的CGroup的所有线程以及运行在特定CPU上的线程
posted on 2018-06-25 14:32 Karlkiller 阅读(2841) 评论(0) 编辑 收藏 举报