`
maosheng
  • 浏览: 551370 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

容器技术的基石: cgroup、namespace和联合文件系统

阅读更多
Docker 是基于 Linux Kernel 的 Namespace 、 Cgroups 和 联合文件系统实现的技术实现的。

Docker 是利用 Linux 的 Namespace 、Cgroups 和 联合文件系统三大机制来保证实现的, 所以它的原理是使用 Namespace 做主机名、网络、PID 等资源的隔离,使用 Cgroups 对进程或者进程组做资源(例如:CPU、内存等)的限制,联合文件系统用于镜像构建和容器运行环境。

一、Namespace:

Namespace 是 Linux 内核的一项功能,该功能对内核资源进行分区,以使一组进程看到一组资源,而另一组进程看到另一组资源。Namespace 的工作方式通过为一组资源和进程设置相同的 Namespace 而起作用,但是这些 Namespace 引用了不同的资源。这些资源可以是进程 ID、主机名、用户 ID、文件名、与网络访问相关的名称和进程间通信。

简单来说,Namespace 是 Linux 内核的一个特性,该特性可以实现在同一主机系统中,对进程 ID、主机名、用户 ID、文件名、网络和进程间通信等资源的隔离。Docker 利用 Linux 内核的 Namespace 特性,实现了每个容器的资源相互隔离,从而保证容器内部只能访问到自己 Namespace 的资源。

最新的 Linux 5.6 内核中提供了 8 种类型的 Namespace:

Namespace 名称                         作用                           内核版本
Mount(mnt)                         隔离挂载点                     2.4.19
Process ID (pid)                   隔离进程 ID                     2.6.24
Network (net)                         隔离网络设备,端口号等             2.6.29
Interprocess Communication (ipc) 隔离 System V IPC 和 POSIX message queues 2.6.19
UTS Namespace(uts)                 隔离主机名和域名             2.6.19
User Namespace (user)                 隔离用户和用户组                3.8
Control group (cgroup) Namespace 隔离 Cgroups 根目录                4.6
Time Namespace                         隔离系统时间                        5.6


Linux 内核提供了8种 Namespace,但是最新版本的 Docker 只使用了其中的前6 种,分别为Mount Namespace、PID Namespace、Net Namespace、IPC Namespace、UTS Namespace、User Namespace。

Mount Namespace 是 Linux 内核实现的第一个 Namespace,从内核的 2.4.19 版本开始加入。它可以用来隔离不同的进程或进程组看到的挂载点。通俗地说,就是可以实现在不同的进程中看到不同的挂载目录。使用 Mount Namespace 可以实现容器内只能看到自己的挂载信息,在容器内的挂载操作不会影响主机的挂载目录。

PID Namespace 的作用是用来隔离进程。在不同的 PID Namespace 中,进程可以拥有相同的 PID 号,利用 PID Namespace 可以实现每个容器的主进程为 1 号进程,而容器内的进程在主机上却拥有不同的PID。例如一个进程在主机上 PID 为 122,使用 PID Namespace 可以实现该进程在容器内看到的 PID 为 1。

UTS Namespace 主要是用来隔离主机名的,它允许每个 UTS Namespace 拥有一个独立的主机名。例如我们的主机名称为 docker,使用 UTS Namespace 可以实现在容器内的主机名称为 lagoudocker 或者其他任意自定义主机名。

IPC Namespace 主要是用来隔离进程间通信的。例如 PID Namespace 和 IPC Namespace 一起使用可以实现同一 IPC Namespace 内的进程彼此可以通信,不同 IPC Namespace 的进程却不能通信。

User Namespace 主要是用来隔离用户和用户组的。一个比较典型的应用场景就是在主机上以非 root 用户运行的进程可以在一个单独的 User Namespace 中映射成 root 用户。使用 User Namespace 可以实现进程在容器内拥有 root 权限,而在主机上却只是普通用户。

Net Namespace 是用来隔离网络设备、IP 地址和端口等信息的。Net Namespace 可以让每个进程拥有自己独立的 IP 地址,端口和网卡信息。例如主机 IP 地址为 172.16.4.1 ,容器内可以设置独立的 IP 地址为 192.168.1.1。

当 Docker 新建一个容器时, 它会创建这六种 Namespace,然后将容器中的进程加入这些 Namespace 之中,使得 Docker 容器中的进程只能看到当前 Namespace 中的系统资源。

正是由于 Docker 使用了 Linux 的这些 Namespace 技术,才实现了 Docker 容器的隔离,可以说没有 Namespace,就没有 Docker 容器。

Docker 正是结合了这六种 Namespace 的功能,才诞生了 Docker 容器。

二、Cgroups:

Cgroups(全称:control groups)是 Linux 内核的一个功能,它可以实现限制和隔离进程或者进程组的资源(如 CPU、内存、磁盘 IO 等)

Docker 是基于 Linux 内核的 Namespace 技术实现资源隔离的,所有的容器都共享主机的内核

cgroups 主要提供了如下功能。

1、资源限制: 限制资源的使用量,例如我们可以通过限制某个业务的内存上限,从而保护主机其他业务的安全运行。

2、优先级控制:不同的组可以有不同的资源( CPU 、磁盘 IO 等)使用优先级。

3、审计:计算控制组的资源使用情况。

4、控制:控制进程的挂起或恢复。

cgroups功能的实现依赖于三个核心概念:子系统、控制组、层级树。

子系统(subsystem):是一个内核的组件,一个子系统代表一类资源调度控制器。例如内存子系统可以限制内存的使用量,CPU 子系统可以限制 CPU 的使用时间。

控制组(cgroup):表示一组进程和一组带有参数的子系统的关联关系。例如,一个进程使用了 CPU 子系统来限制 CPU 的使用时间,则这个进程和 CPU 子系统的关联关系称为控制组。

层级树(hierarchy):是由一系列的控制组按照树状结构排列组成的。这种排列方式可以使得控制组拥有父子关系,子控制组默认拥有父控制组的属性,也就是子控制组会继承于父控制组。比如,系统中定义了一个控制组 c1,限制了 CPU 可以使用 1 核,然后另外一个控制组 c2 想实现既限制 CPU 使用 1 核,同时限制内存使用 2G,那么 c2 就可以直接继承 c1,无须重复定义 CPU 限制。

cgroups 的三个核心概念中,子系统是最核心的概念,因为子系统是真正实现某类资源的限制的基础。

cgroups 不仅可以实现资源的限制,还可以为我们统计资源的使用情况,容器监控系统的数据来源也是 cgroups 提供的。


三、联合文件系统:

联合文件系统,又叫 UnionFS,是一种通过创建文件层进程操作的文件系统,因此,联合文件系统非常轻快。Docker 使用联合文件系统为容器提供构建层,使得容器可以实现写时复制以及镜像的分层构建和存储。常用的联合文件系统有 AUFS、Overlay 和 Devicemapper 等.











分享到:
评论

相关推荐

    李泽帆:Cgroup的过去、现状和开发计划

    该文档来自于Docker Meetup深圳站的活动,Linux内核Maintainer李泽帆带来了关于cgroups内核特性的话题。

    Docker底层技术Namespace Cgroup应用详解

    有两个伪文件系统:/proc和/sys/ UTS:允许每个container拥有独立的hostname(主机名)和domainname(域名),使其在网络上可以被视作一个独立的节点而非Host上的一个进程。 IPC:contaner中进程交互还是采用linux...

    Docker底层服务之NameSpace、Cgroup、存储、网络.docx

    Docker底层服务之NameSpace、Cgroup、存储、网络Docker底层服务之NameSpace、Cgroup、存储、网络Docker底层服务之NameSpace、Cgroup、存储、网络Docker底层服务之NameSpace、Cgroup、存储、网络Docker底层服务之...

    Linux Cgroup 技术 与 智能手机系统 IO 优化

    演示了 Docker 虚拟化的基础技术之一:Linux Cgroup 以及 该技术在智能手机 IO 优化方面的潜在应用。 2015/04/26 @ 泰晓沙龙 第二期

    2015 Container技术峰会-容器核心技术剖析-田琪

    京东资深架构师田琪在OpenCloud 2015大会Container专场的演讲PPT:容器核心技术剖析,主要涉及容器整体生态系统架构,容器底层核心技术如:cgroup,namespace,devicemapper等内核机制原理与实现,docker上层对其如何...

    cgroupv2.js:cgroup v2 Node.js绑定

    控制组提供了文件系统API(cgroupfs),以便用户可以通过文件读写操作来管理cgroup。 该Node.js绑定仅使用fs/promises模块中的readFile和writeFile函数。 为什么要使用异步API? 由于cgroupfs不是磁盘上的文件系统...

    cgroup原理和实现

    cgroup原理和实现,Cgroups 是 control groups 的缩写,是 Linux 内核提供的一种可以限制、记录、隔离进程组 (process groups)所使用的物理资源(如:cpu,memory,IO 等等)的机制。最初由 google 的 工程师提出,后来被...

    容器教程培训视频.zip

    9容器技术发展历史及容器管理具 10 docker版本介绍mp4 11docker部署YUM源获取mp4 12 docker安装及服务启动,mp4 13容器镜像获取mp4 14运行个容器mp4 15 dockerdaemon配置远程及本地管理mp4 16 dockel命令行命令...

    Docker底层服务之NameSpace、Cgroup、存储、网络.zip

    Docker底层服务之NameSpace、Cgroup、存储、网络.zip Docker底层服务之NameSpace、Cgroup、存储、网络.zip

    node-cgroup-metrics:NodeJs模块,用于从容器内部读取cgroup指标

    CGROUP-METRICS 用于读取指标的节点模块。 从/sys/fs/cgroup/读取。 内存指标: 从路径/sys/fs/cgroup/memory/memory读取: ... cpuacct.usage :自此cgroup获得的容器开始以来的总CPU时间(以纳秒为单位)

    通过cgroup来限制KVM虚拟机使用的cpu和内存性能调优实践

    控制群组(control group)(在此指南中简写为 ...通过使用 cgroup,系统管理员在分配、排序、拒绝、管理和监控系统资源等方面,可以进行精细化控制。硬件资源可以在应用程序和用户间智能分配,从而增加整体效率。

    docker_cgroup_info:获取 docker 容器的 cgroup 信息

    用于检查 docker 容器的最小工具用法 usage: docker_info.py [-h] [--cgroup_name CGROUP_NAME] [--verbose VERBOSE] [--list LIST] [--url URL]一般安装 virtualenv env. env/bin/activatepip install -r ...

    redhat下基于容器安全的几个关键技术点

    redhat提供的基于容器安全,在namespace、Cgroup等技术层面,简述容器安全性的策略。

    Linux下cgroup

    Linux下cgroup以及namespces相关知识,包括资源隔离与限制等

    Linux运维-运维课程MP4频-05容器-08Cgroup限制进程对memory使用案例.mp4

    Linux运维-运维课程MP4频-05容器-08Cgroup限制进程对memory使用案例.mp4

    resource-stealing:跨cgroup窃取cpu份额以加快容器映像提取

    在将Pod调度到节点后,容器运行时会下载许多映像,然后将其解压缩并设置本地文件系统,此外还会执行许多其他例程。 这需要时间。 在拉出映像之前,分配给容器的CPU份额数量将对容器不可用。 cgroups资源窃取的想法...

    linux 系统源码全面剖析

    虚拟文件系统 MINIX文件系统 通用块层 直接I/O 原生异步I/O inotify源码分析 进程间通信 信号处理机制 共享内存 网络 Socket接口 Unix Domain Socket TUN/TAP设备原理与实现 LVS原理与实现 - 原理篇 LVS原理与实现 -...

    cgroupspy:用于管理cgroup的Python库

    cgroupspy有两种表示cgroups文件系统的方法 作为树-这是表示它们的最基本,最通用的方法。 您基本上是从cgroups根目录中的所有目录构造它的。 分组树-可以在同一级别访问具有相同名称的所有cgroup分区。 例如-内存...

Global site tag (gtag.js) - Google Analytics