Linux 中的 cgroup 和 namespace 详解

145 阅读3分钟

在现代容器技术(如 Docker、Kubernetes)中,cgroupnamespace 是实现资源隔离和安全的两大核心机制。它们为容器提供了独立的运行环境和资源限制,是云原生架构的基础。本文将详细介绍它们的原理、类型及应用场景。


一、Namespace(命名空间)

Namespace 是 Linux 内核提供的一种资源隔离机制。它允许将系统资源(如进程、网络、文件系统等)划分为多个独立的空间,每个空间内的资源互不干扰。这样,容器可以拥有自己的“视角”,看不到或影响不到其他容器和宿主机的资源。

常见的 Namespace 类型

  1. PID Namespace
    隔离进程编号。容器内只能看到自己的进程,宿主机上的进程不可见。

  2. NET Namespace
    隔离网络资源。每个容器拥有独立的网络接口、IP 地址和路由表。

  3. MNT Namespace
    隔离文件系统挂载点。容器可以有自己的根文件系统和挂载卷。

  4. UTS Namespace
    隔离主机名和域名。容器可以设置自己的主机名,不影响宿主机。

  5. IPC Namespace
    隔离进程间通信资源(如信号量、消息队列、共享内存)。

  6. USER Namespace
    隔离用户和权限。容器内可以映射不同的用户 ID,实现权限隔离。

应用场景

  • 容器技术(Docker、LXC、Kubernetes)
  • 虚拟化和多租户环境
  • 安全沙箱

二、cgroup(Control Groups)

cgroup 是 Linux 内核提供的资源限制和管理机制。它允许将进程分组,并对每个组分配、限制和监控 CPU、内存、磁盘 IO、网络带宽等资源。

cgroup 的主要功能

  1. 资源限制
    限制某组进程可用的 CPU、内存等资源,防止资源争抢。

  2. 资源分配
    为不同进程组分配不同的资源份额,实现优先级调度。

  3. 资源监控
    实时统计和监控进程组的资源使用情况。

  4. 进程管理
    支持动态添加、移除进程到 cgroup,实现灵活管理。

应用场景

  • 容器资源隔离与限制
  • 多租户资源管理
  • 系统性能优化与监控

三、cgroup 和 namespace 的结合

容器技术正是通过 namespace 实现资源隔离,通过 cgroup 实现资源限制。二者结合,使得每个容器都像一个独立的小型虚拟机,既安全又高效。

举例:

  • Docker 启动容器时,会为其分配独立的 namespace(进程、网络、文件系统等),并用 cgroup 限制其 CPU、内存等资源。
  • Kubernetes 管理的 Pod,每个都运行在独立的 namespace 和 cgroup 下,实现多租户和高可用。

四、总结

  • namespace 负责“看不到”,让容器拥有独立的系统视角。
  • cgroup 负责“用不到”,限制容器能用的资源。
  • 二者是 Linux 容器技术的核心,支撑了现代云原生架构的安全、隔离和高效运行。

参考资料: