1. 什么是 PID 命名空间?
在 Linux 系统中,PID(Process ID,进程号)是每个运行程序的唯一身份证。
● 默认情况(隔离):在标准的容器技术(如 Docker)中,每个容器都有自己独立的 PID 命名空间。这意味着,容器 A 里有一个 PID=1 的进程,容器 B 里也有一个 PID=1 的进程。它们互相看不见,互相不知道对方的存在,就像住在不同房间里的两个人,各自管自己的房间。
2. 什么是“共享” PID 命名空间?
在 Kubernetes 中,一个 Pod 里的所有容器被强制要求共享同一个 PID 命名空间。这就好比拆掉了房间之间的墙,把几个容器放进了同一个大房间(大沙盒)里。
在这个大房间里:
● PID 全局唯一:不再有两个 PID=1 的进程。整个 Pod 只有一个 PID=1,那就是我们之前提到的 pause 容器。
● 互相可见:容器 A 里的进程可以清楚地看到容器 B 里的进程,并且它们拥有各自真实的、全局递增的 PID(比如 2, 3, 4...)。
pause 容器作为 PID=1 的主进程,可以接管并回收整个 Pod 内所有容器产生的“僵尸进程”,防止系统资源泄漏。
那pod里面的各个容器的cmd的进程呢?对于每一个具体的业务容器(比如 Nginx 容器、Java 容器),你在 Dockerfile 或 K8s YAML 中配置的 CMD 或 command ,就是这个容器内部的主进程(PID=1), 从“整个 Pod”的视角来看:不是,它们只是“子进程”,
只有 pause 容器是绝对的“老大”(PID=1)。
● 各个容器的 CMD 进程,在这个共享的 PID 命名空间中,其实是 pause 进程的子进程(PID 可能是 2, 3, 4... 等等)。
一句话概括: 在整个 Pod 的底层架构中, pause 是主进程;但在每个容器的业务逻辑中, CMD 是主进程。