Linux: Namespaces

 7th March 2021 at 8:41pm

Linux 内核提供了 namespaces 机制,用于在不同进程(组)间做资源的隔离。容器技术依赖于 namespaces 机制。

常用的可以隔离的类别,即 namespace 的类型有:

NamespaceIsolates
Mount (mnt)Mount points
Process ID (pid)Process IDs
Network (net)Network devices, stacks, ports, etc.
Inter-process communication (ipc)System V IPC, POSIX message queues
UTSHostname and NIS domain name
User ID (user)User and group IDs

比如你为某个进程设置了新的 User ID namespace,那么这个进程运行时不能看到系统默认的用户(user)和组(group),而只能看到在它这个进程其中配置的用户和组。如果有另外一个进程也设置了这个 namespace,这两个进程能看到同一套用户。

/proc/<pid>/ns 下能看到该进程所使用的 namespace。

注意每个命名空间都只有一种类型。并没有一种命名空间包含了多种类型。因此:

  • 对于 Docker 容器,不同的容器间隔离了 mount、pid、ipc 等,是因为每个容器都有自己单独的若干个命名空间
  • 对于 k8s pod 里面的多个容器,它们绑定了同样的一套命名空间,使得彼此间的侦听的端口可以互相访问、进程互相可见等