[Docker]Namespace与Cgroups

发布时间 2023-04-13 15:21:50作者: SkyBiuBiu

什么是 Namespace?

Namespace 是 Linux 容器技术的一个重要概念,其作用是对运行于其中的进程提供隔离,确保容器和宿主机之间是完全隔离的。Namespace 在 Linux 内核中已经存在了很长一段时间,最初的设计目的是为了更好地支持多用户场景下的文件系统挂载。自那以后,Namespace 已经得到了进一步的扩展和应用,成为了实现容器隔离的主要技术之一。

Namespace 技术的核心思想是将一个进程的视角从全局视图中调整到一个更加狭窄的、虚拟化的空间中,使其认为自己是运行在一个独立的环境中,从而实现进程间的隔离。这种隔离范围不仅包括文件系统、网络、进程编号空间等,还包括主机名、用户等信息。通过使用 Namespace 技术,可以达到企业级隔离和完全隔离的效果。

Namespace 的类型

Linux 中有以下 7 种不同的 namespace,每种 namespace 对于容器技术的实现具有不同的作用和意义:

  1. PID Namespace:PID Namespace 用于隔离容器内的进程编号空间,使得在不同的 PID Namespace 中运行的进程看起来像是在独立的进程空间中运行,而不会彼此混淆。

  2. Mount Namespace:Mount Namespace 用于隔离文件系统挂载点,使得不同的容器之间可以拥有自己独立的文件系统结构,不会相互影响。容器中的文件系统会被 chroot 到指定的目录中,并使用各自的 Mount Namespace 维护文件系统状态。

  3. IPC Namespace:IPC Namespace 用于隔离某些进程间通信(IPC)资源,包括 System V IPC 和 POSIX IPC。在不同的 IPC Namespace 中运行的进程无法相互通信,从而实现了进程间通信隔离。

  4. Net Namespace:Net Namespace 用于隔离网络设备、网络栈、端口和路由信息等。不同的 Net Namespace 中可以拥有自己独立的网络资源,可以实现不同容器的互访与隔离。

  5. UTS Namespace:UTS Namespace 用于隔离主机名和域名等系统识别信息。为不同的容器分配不同的容器名,从而避免名称冲突,提高了容器之间的独立性。

  6. User Namespace:User Namespace 用于隔离用户和用户组的编号空间。(UID 和 GID)。在容器中运行的进程可以拥有唯一的 UID 和 GID,这样做可以避免容器进程干扰宿主机进程,提高容器进程的独立性。

  7. Cgroup Namespace:Cgroup Namespace 用于对应不同的控制组层次结构,可以在应用级别隔离应用程序的资源。每个应用程序会视为一个单独的控制组层级,控制组中运行的进程仅可访问该控制组的资源。

综上所述,Linux 中有 7 种不同的 namespace,每种 namespace 都有自身的独特作用,将容器中的进程、文件系统、网络等资源隔离封装,保证了容器环境之间的相对独立性,从而为容器提供了更高的安全性和可靠性。

Namespace 的实现和使用

在使用 Namespace 时,需要使用系统调用来创建和管理 Namespace。可以使用 clone() 系统调用创建一个新的 Namespace,并使用 setns() 系统调用将一个进程移动到另一个 Namespace 中。这些系统调用提供了官方的程序接口,使得程序员可以在 Linux 内核空间中使用 Namespace 技术,实现容器隔离。

在 Docker 中,Namespace 技术被广泛应用。Docker 使用 Namespace 来提供容器内部的隔离,隔离文件系统、网络设备、进程编号、进程之间通信等等。同时,Docker 还支持用户自定义的 Namespace 类型,因此用户可以根据自己的需求创建自己的 Namespace。

什么是 Cgroups?

Cgroups (control groups) 是 Linux 系统中的一种容器内核技术,它可以限制进程组使用的资源数量和分配,并将它们隔离到一个或多个分层的分组中,以实现对进程、任务或用户组的资源限制。

Cgroups 可以限制多种计算机资源,包括CPU、内存、网络带宽、磁盘I / O等,并允许系统管理员调整和控制该进程组的资源限制。这使得 Cgroups 成为用于容器隔离的关键技术,并可以帮助保护系统免受不安全或恶意代码的破坏。

Cgroups 的特征

Cgroups 是一种强大的容器内核技术,并具有以下特征:

  • 层次结构:Cgroups 可以组合为一个有层次结构的组的集合,并且可以在层次结构中设置各种限制条件,这使得限制和资源管理更加透明和灵活。

  • 动态管理:Cgroups 允许在运行时动态地添加、删除、和更改各个控制组和组中的进程和资源。

  • 用户定义:Cgroups 允许用户定义各种限制条件,以适应特定应用场景,使得 Cgroups 更加适应各种不同的应用。

Cgroups 的使用

Cgroups 是 Linux 内核的一部分,可以通过系统调用(syscalls)实现 Cgroups。在 Cgroups 启用之后,它会根据其自定义的规则来动态地限制诸如 CPU、内存、I/O 等系统资源的进程组。

在使用 Cgroups 时,可能需要先安装 cgroup-tools 和 libcgroup 工具。这些工具提供了访问 Cgroups 功能的实用程序,使得用户可以管理、观察和测试资源限制条件。

在 Docker、Kubernetes 等容器平台中,Cgroups 正在被广泛使用。通过将不同的容器放在 Cgroups 分组中,这些容器之间可以保持资源隔离和独立性,并可以在 OS 级别上分配计算机资源,这提供了更好的容器隔离和性能管理,也成为当前流行的容器的核心技术之一。

总结

Namespace 是 Linux 中的一个重要概念,也是容器技术的核心。它可以将一个进程的视角从系统全局视图调整到一个虚拟化的空间中,实现进程的隔离和保护。Linux 提供了几种不同类型的 Namespace,每种 Namespace 都具有不同的用途和作用。在构建容器时,我们需要使用这些不同类型的 Namespace 来隔离非必要的应用程序和文件系统,提高容器的安全性和可靠性。

Cgroups 是一种强大的容器内核技术,与 Linux 内核一起提供资源管理和限制的功能,可以实现限制进程的资源使用和分配,并保持它们隔离在一个或多个分层的分组中。在 Docker、Kubernetes 等容器平台中,Cgroups 正在被广泛应用,可以帮助实现更好的容器隔离和性能管理。

参考连接