暂无图片
暂无图片
1
暂无图片
暂无图片
暂无图片

容器技术的核心:Namespace和Cgroups

watson 2024-07-25
143
容器技术是一种轻量级的虚拟化技术,它允许多个隔离的进程在同一个操作系统内核上运行,而不需要像传统虚拟化技术那样运行多个完整的操作系统。容器技术的核心是Linux内核的两个特性:NamespaceCgroups

Namespace

Namespace提供了一种隔离机制,使得每个容器都有自己独立的进程空间。Linux支持多种类型的 Namespace,包括:

  1. PID Namespace:隔离进程ID,每个容器内的进程ID是独立的。

  2. Network Namespace:隔离网络设备、网络栈、端口等,每个容器有独立的网络环境。

  3. IPC Namespace:隔离进程间通信,如信号量、消息队列等。

  4. Mount Namespace:隔离文件系统挂载点,每个容器有自己的文件系统视图。

  5. UTS Namespace:隔离主机名和域名。

  6. User Namespace:隔离用户和用户组,允许容器内的用户映射到宿主机上的用户。

通过这些 Namespace,容器内的进程就像是在独立的系统上运行一样,互不干扰。


Namespace隔离内容系统调用参数
UTS主机名与域名CLONE_NEWUTS
IPC信号量、消息队列和共享内存CLONE_NEWIPC
Network网络设备、网络栈、端口等CLONE_NEWNET
PID进程编号CLONE_NEWPID
Mount挂载点(文件系统)CLONE_NEWNS
User用户和用户组CLONE_NEWUSER

图片


Cgroups

在Linux系统中,CGroups(Control Groups)是一项强大的内核功能,它允许系统管理员对进程组(即一组进程)使用的物理资源进行限制、记录、隔离和优先级分配。CGroups是构建包括Docker在内的现代容器技术的基础,同时也是Linux系统资源管理的关键工具。

CGroups简介

CGroups由Google工程师开发,自Linux内核2.6.24版本开始引入。它通过将进程分组并对这些组应用资源限制和优先级设置,实现了对系统资源的精细管理。CGroups包含多个子系统,每个子系统管理一类资源,如CPU、内存、输入/输出等。

CGroups的版本

CGroups有两个主要版本:v1和v2。v1版本在功能上比较分散,而v2版本旨在解决v1的一些问题,提供更统一的资源管理方式。Linux内核4.5以上版本开始支持CGroupsv2。

CGroups的关键概念

  • 任务(Task):在CGroups中,任务指的是系统的一个进程。

  • 控制组(Control Group):一组按照特定标准划分的进程,资源控制以控制组为单位。

  • 层级(Hierarchy):控制组可以组织成层级结构,形成控制组树。

  • 子系统(Subsystem):子系统是资源控制器,如CPU子系统控制CPU时间分配。

几种比较常用的 CGroups 子系统:

CPU 子系统,用来限制一个控制组(一组进程,你可以理解为一个容器里所有的进程)可使用的最大 CPU。memory 子系统,用来限制一个控制组最大的内存使用量。pids 子系统,用来限制一个控制组里最多可以运行多少个进程。cpuset 子系统, 这个子系统来限制一个控制组里的进程可以在哪几个物理 CPU 上运行。

CGroups的资源限制

CGroups可以限制进程组使用的资源数量,如内存子系统可以设定内存使用上限,超出限额时触发OOM(Out of Memory)。

CGroups的优先级控制

通过为进程组分配CPU时间片和硬盘IO带宽,实际上控制了进程的运行优先级。

CGroups的资源统计

CGroups可以统计资源使用量,如CPU使用时长、内存用量等,适用于计费和资源监控。

CGroups的进程控制

CGroups可以对进程组执行挂起、恢复等操作。

CGroups在Docker中的应用

Docker使用CGroups来限制容器的资源使用,确保容器不会消耗过多系统资源。通过CGroups,Docker可以:

  • 限制容器的CPU使用率

  • 控制容器的内存使用,包括物理内存和交换分区。

  • 设置磁盘IO的优先级和限制。

CGroupsv2的优势

与CGroupsv1相比,CGroupsv2提供了统一的层次结构设计,更安全的子树委派,以及更新的功能特性,如压力阻塞信息(PSI)和跨多个资源的增强资源分配管理和隔离。



要记住的key point

Namespace 帮助容器来实现各种计算资源的隔离,

Cgroups 主要限制的是容器能够使用的某种资源量。



最后,插个话题:

容器和虚拟机的区别

虚拟机(VM)运行一个成熟的“guest”操作系统,通过hypervisor对主机资源进行虚拟访问。一般来说,vm会产生大量开销,超出应用程序逻辑所消耗的开销。使用虚拟机好处是:提供了更为彻底的隔离和完整的操作系统功能,适合需要运行复杂应用和不同操作系统环境的场景。


容器在Linux上本地运行,并与其他容器共享主机的内核。它运行一个独立的进程,占用的内存不比其他的filesystem多,因此它是轻量级的。容器对比虚拟机的优势是:容器提供了一种轻量级、高效的虚拟化解决方案,适合快速迭代和大规模部署


图片

「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论