Pod中的基础容器

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

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

使用 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 命名空间;

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

一个双容器Pod实际有三个运行的容器

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

基础容器作用

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

  1. 为所有业务容器提供命名空间基础;

  2. 管理业务容器中的进程,接管僵尸进程(开启了 pod.spec.shareProcessNamespace 的情况下);

提供命名空间基础

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

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

管理进程

如何管理进程?

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

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

Last updated

Was this helpful?