pause 容器
Pause 容器,又叫 Infra 容器,本文将探究该容器的作用与原理。
我们知道在 kubelet 的配置中有这样一个参数:
KUBELET_POD_INFRA_CONTAINER=--pod-infra-container-image=registry.access.redhat.com/rhel7/pod-infrastructure:latest
- 1
上面是 openshift 中的配置参数,kubernetes 中默认的配置参数是:
KUBELET_POD_INFRA_CONTAINER=--pod-infra-container-image=gcr.io/google_containers/pause-amd64:3.0
- 1
Pause 容器,是可以自己来定义,官方使用的 gcr.io/google_containers/pause-amd64:3.0 容器的代码见 Github,使用 C 语言编写。
2. Pause 容器特点
镜像非常小,目前在 700KB 左右
永远处于 Pause (暂停) 状态
3. Pause 容器背景
像 Pod 这样一个东西,本身是一个逻辑概念。那在机器上,它究竟是怎么实现的呢?这就是我们要解释的一个问题。
既然说 Pod 要解决这个问题,核心就在于如何让一个 Pod 里的多个容器之间最高效的共享某些资源和数据。
因为容器之间原本是被 Linux Namespace 和 cgroups 隔开的,所以现在实际要解决的是怎么去打破这个隔离,然后共享某些事情和某些信息。这就是 Pod 的设计要解决的核心问题所在。
所以说具体的解法分为两个部分:网络和存储。
Pause 容器就是为解决 Pod 中的网络问题而生的。
值得注意的是,kubernetes在PID命名空间共享方面已经经历了多次反复修改。如果启用了PID命名空间共享,那么pause容器就可以帮你回收丧尸进程,这一配置目前只在Kubernetes 1.7+中可用
。在Docker 1.13.1+及Kubernetes 1.7运行环境下,这一选项是默认开启的。
你也可以使用kubelet标志禁用它(--docker-disable-share-pid=true
)。但是这一配置又在Kubernetes 1.8中被修改,现在它在默认情况下是禁用的,除非使用kubelet标志(--docker-disable-share-pid=false
)启用它。请参阅关于在这个GitHub问题中添加对PID命名空间共享的讨论。
如果没有启用PID命名空间共享,那么Kubernetes pod中的每个容器都有自己的PID 1,并且每个容器都需要自己捕获僵尸进程。很多时候这不是一个问题,因为应用程序不会生成其他进程,但是僵尸进程占用内存是一个经常被忽略的问题。因此,由于PID命名空间共享使我们能够在相同pod中的容器之间发送信号,本人非常希望PID命名空间共享成为Kubernetes中的默认值。