Docker基础之 Linux Namespace技术与Linux Cgroups技术详解:
一)、 Linux Namespace技术
- Namespace是linux系统的底层概念,在《内核层实现》,即有一些不同类型的命名空间被部署在核内,各个docker容器运行在同一个docker主进程并且共用同一个宿主机的系统内核,各docker容器运行在宿主机的用户空间,每个容器都要有类似于虚拟机一样的相互隔离的运行空间,但是容器技术是在一个进程内实现运行指定服务的运行环境,并且还可以保护宿主机内核不受其他进程的干扰和影响,比如文件系统空间、网络空间、进程空间等等,目前主要是通过以下六条技术实现容器运行空间的相互隔离;
![image](https://img2020.cnblogs.com/blog/2413448/202201/2413448-20220103141229970-1450139394.png)
1.UTS Namespace:
- 1.1 UTS Namespace(UNIX Timesharing System包含运行内核的名称、版本、底层体系结构类型等信息),用于系统标识,其中包含hostname和域名domainname,它使得一个容器拥有属于自己hostname标识,这个主机名标识独立于宿主机系统和其上的其他容器。
2.IPC Nmaespace:
- 2.1 IPC namespace 实现了进程间通信的隔离,包括常见的几种进程间通信机制,如信号量,消息队列和共享内存。我们知道,要完成 IPC,需要申请一个全局唯一的标识符,即 IPC 标识符,所以 IPC 资源隔离主要完成的就是隔离 IPC 标识符。
3.PID Namespace:
- 3.1 Linux 系统中,有一个PID为1的进程(init/systemd)是其他所有进程的父进程,那么在每个容器内也要有一个父进程来管理其下属的子进程,那么多个容器的进程通PID Namepace进程隔离(比如PID编号重复、容器内的主进程生成与回收子进程等)
4.Net work Namespace:
- 4.1 提供了网络相关系统资源的隔离,因此,每个Network Namespace都有自己的网络设备、IP地址、IP路由表、/proc/net目录、端口号等。网络命名空间使得容器从网络的角度来看是很有用的:每个容器可以有自己的(虚拟)网络设备和自己的应用程序,并与每个命名空间的端口号空间绑定;主机系统中合适的路由规则可以将网络数据包引导到与特定容器相关联的网络设备。因此,例如,可以在同一个主机系统上拥有多个容器化的网络服务器,每个服务器都绑定到其(每个容器)网络命名空间的80端口。
5.Mount Namespace:
- 5.1每个容器都要有独立的根文件系统,有独立的用户空间,以实现在容器里面启动服务并且使用容器的运行环境,即一个宿主机是ubuntu的服务器,可以再里面启动一个nginx服务,此nginx运行时使用的运行环境就是centos系统目录的运行环境,但是在容器里面是不能访问宿主机的资源,宿主机是使用了chroot技术把容器锁定到一个指定的运行目录里面并作为容器的根运行环境。
6.User Namespace:
- 6.1 User Namespace允许在各个宿主机的各个容器空间内创建相同的用户名以及相同的用户UID和GID,只是会把用户的作用范围限制在每个容器内,即A容器和B容器可以有相同的用户名称和ID的账户,但是此用户的有效范围仅是当前容器内,不能访问另一个容器内的文件系统。
二)、 Linux Cgroups技术
- CGroup 是 Control Groups 的缩写,是 Linux 内核提供的一种可以限制、记录、隔离进程组 (process groups) 所使用的物力资源 (如 cpu memory i/o 等等) 的机制。2007 年进入 Linux 2.6.24 内核,CGroups 不是全新创造的,它将进程管理从 cpuset 中剥离出来,作者是 Google 的 Paul Menage。CGroups 也是 LXC 为实现虚拟化所使用的资源管理手段。
1.CGroups 组成及功能:
- CGroup 是将任意进程进行分组化管理的 Linux 内核功能。CGroup 本身是提供将进程进行分组化管理的功能和接口的基础结构,I/O 或内存的分配控制等具体的资源管理功能是通过这个功能来实现的。这些具体的资源管理功能称为 CGroup 子系统或控制器。CGroup 子系统有控制内存的 Memory 控制器、控制进程调度的 CPU 控制器等。运行中的内核可以使用的 Cgroup 子系统由/proc/cgroup 来确认。
- CGroup 提供了一个 CGroup 虚拟文件系统,作为进行分组管理和各子系统设置的用户接口。要使用 CGroup,必须挂载 CGroup 文件系统。这时通过挂载选项指定使用哪个子系统。
- Cgroups提供了以下功能:
1.1限制进程组可以使用的资源数量(Resource limiting ):比如:memory子系统可以为进程组设定一个memory使用上限,一旦进程组使用的内存达到限额再申请内存,就会出发OOM(out of memory)。
1.2进程组的优先级控制(Prioritization )。比如:可以使用cpu子系统为某个进程组分配特定cpu share。
1.3记录进程组使用的资源数量(Accounting )。比如:可以使用cpuacct子系统记录某个进程组使用的cpu时间
1.4进程组隔离(Isolation)。比如:使用ns子系统可以使不同的进程组使用不同的namespace,以达到隔离的目的,不同的进程组有各自的进程、网络、文件系统挂载空间。
1.5进程组控制(Control)。比如:使用freezer子系统可以将进程组挂起和恢复。
主要功能:
1、限制资源使用,比如内存使用上限以及文件系统的缓存限制。
2、优先级控制,CPU利用和磁盘IO吞吐。
3、一些审计或一些统计,主要目的是为了计费。
4、挂起进程,恢复执行进程。
2.CGroups子系统
- 1.cpu 子系统,主要限制进程的 cpu 使用率。
- 2.cpuacct 子系统,可以统计 cgroups 中的进程的 cpu 使用报告。
- 3.cpuset 子系统,可以为 cgroups 中的进程分配单独的 cpu 节点或者内存节点。
- 4.memory 子系统,可以限制进程的 memory 使用量。
- 5.blkio 子系统,可以限制进程的块设备 io。
- 6.devices 子系统,可以控制进程能够访问某些设备。
- 7.net_cls 子系统,可以标记 cgroups 中进程的网络数据包,然后可以使用 tc 模块(traffic control)对数据包进行控制。
- 8.net_prio — 这个子系统用来设计网络流量的优先级。
- 9.freezer 子系统,可以挂起或者恢复 cgroups 中的进程。
- 10.ns 子系统,可以使不同 cgroups 下面的进程使用不同的 namespace。
- 11.hugetlb — 这个子系统主要针对于HugeTLB系统进行限制,这是一个大页文件系统。