# Pod中的基础容器

Kubernetes 中以 Pod 为最小的不可分割单元，而 Pod 又是容器的集合。

通常情况下，我们在创建 Pod 时，可以指定其包含的一个或多个容器定义，不同的容器之间可以共享命名空间（通常情况下，默认共享网络命名空间）。

{% hint style="info" %}
使用 Docker 命令创建共享网络命名空间的容器可以使用 `--net=container:{container_name}` 即可使该容器与另一个容器共享同一个网络命名空间，两个容器之间可以通过**换回口**互相通信。

当然也可以使用 `--ipc=container:{container_name}` 共享 IPC 命名空间；使用 `--pid=container:{container_name}` 共享 PID 命名空间；使用 `--uts=container:{container_name}` 共享 UTS 命名空间；使用 `--userns=container:{container_name}` 共享 User 命名空间；
{% endhint %}

**在 Pod 中会有一个基础容器 (pause)，被称为 Pod infrastructure container，所以当用户创建包含 1 个容器的 Pod 时，实际该 Pod 创建了 2 个容器。**

![一个双容器Pod实际有三个运行的容器](https://2906552408-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-M6Ub8CloS5kJszh6xSR%2Fsync%2F198112bacd133efe060227a2af4466b5f9b7035e.png?generation=1588594615903966\&alt=media)

一个 Pod 中的其他容器（业务容器）与基础容器默认情况下共享**网络命名空间**和**IPC命名空间**，在新版 Kubernetes 中可以通过指定 `pod.spec.shareProcessNamespace=true` 令其与基础容器共享**PID命名空间**。

## 基础容器作用

基础容器与业务容器共享命名空间主要有以下两个作用：

1. 为所有业务容器提供命名空间基础；
2. 管理业务容器中的进程，接管僵尸进程（开启了 `pod.spec.shareProcessNamespace` 的情况下）；

### 提供命名空间基础

为何要提供命名空间基础？

因为当业务容器由于某些原因运行失败或退出时，Pod 需要将该容器重启并重新提供服务，但是容器重启后，网络等信息会重新申请并更新，因此这里令其使用基础容器的网络命名空间，因为基础容器的生命周期是与 Pod 一致的，因此业务容器无论如何重启，都可以使用与原来一致的网络信息。

### 管理进程

如何管理进程？

由于 Pod 在启动时，会先启动基础容器，即 pause 容器，该容器中仅运行一个程序，即 `/pause`，该程序会一直循环查找是否有需要其回收的僵尸进程。

当启动完基础容器后，再启动业务容器，此时业务容器中的所有进程都是 `/pause` 的子进程，也就实现了基础容器管理进程的功能。
