在现代容器技术(如 Docker、Kubernetes)中,cgroup 和 namespace 是实现资源隔离和安全的两大核心机制。它们为容器提供了独立的运行环境和资源限制,是云原生架构的基础。本文将详细介绍它们的原理、类型及应用场景。
一、Namespace(命名空间)
Namespace 是 Linux 内核提供的一种资源隔离机制。它允许将系统资源(如进程、网络、文件系统等)划分为多个独立的空间,每个空间内的资源互不干扰。这样,容器可以拥有自己的“视角”,看不到或影响不到其他容器和宿主机的资源。
常见的 Namespace 类型
-
PID Namespace
隔离进程编号。容器内只能看到自己的进程,宿主机上的进程不可见。 -
NET Namespace
隔离网络资源。每个容器拥有独立的网络接口、IP 地址和路由表。 -
MNT Namespace
隔离文件系统挂载点。容器可以有自己的根文件系统和挂载卷。 -
UTS Namespace
隔离主机名和域名。容器可以设置自己的主机名,不影响宿主机。 -
IPC Namespace
隔离进程间通信资源(如信号量、消息队列、共享内存)。 -
USER Namespace
隔离用户和权限。容器内可以映射不同的用户 ID,实现权限隔离。
应用场景
- 容器技术(Docker、LXC、Kubernetes)
- 虚拟化和多租户环境
- 安全沙箱
二、cgroup(Control Groups)
cgroup 是 Linux 内核提供的资源限制和管理机制。它允许将进程分组,并对每个组分配、限制和监控 CPU、内存、磁盘 IO、网络带宽等资源。
cgroup 的主要功能
-
资源限制
限制某组进程可用的 CPU、内存等资源,防止资源争抢。 -
资源分配
为不同进程组分配不同的资源份额,实现优先级调度。 -
资源监控
实时统计和监控进程组的资源使用情况。 -
进程管理
支持动态添加、移除进程到 cgroup,实现灵活管理。
应用场景
- 容器资源隔离与限制
- 多租户资源管理
- 系统性能优化与监控
三、cgroup 和 namespace 的结合
容器技术正是通过 namespace 实现资源隔离,通过 cgroup 实现资源限制。二者结合,使得每个容器都像一个独立的小型虚拟机,既安全又高效。
举例:
- Docker 启动容器时,会为其分配独立的 namespace(进程、网络、文件系统等),并用 cgroup 限制其 CPU、内存等资源。
- Kubernetes 管理的 Pod,每个都运行在独立的 namespace 和 cgroup 下,实现多租户和高可用。
四、总结
- namespace 负责“看不到”,让容器拥有独立的系统视角。
- cgroup 负责“用不到”,限制容器能用的资源。
- 二者是 Linux 容器技术的核心,支撑了现代云原生架构的安全、隔离和高效运行。
参考资料: