pause 容器完整详解
核心概念 pause 是 K8s Pod 基础占位容器,优先启动,持有 Network/IPC 命名空间,负责 Pod 生命周期和僵尸进程回收。
1. pause 容器是什么
pause 是 k8s 内置的极简基础容器,镜像极小(几十KB),无业务逻辑,仅做底层基础设施支撑。
所有 Pod 创建时,kubelet 会最先启动 pause,再启动业务容器/sidecar;Pod 生命周期完全由 pause 控制,pause 退出则整个 Pod 销毁。
镜像地址默认:registry.k8s.io/pause:3.x
2. 核心四大作用(Pod 实现多容器共享的根基)
2.1. 统一持有 Pod 网络命名空间(最核心功能)
Linux 的 Network Namespace 有一个特性:如果命名空间内最后一个进程退出,该网络栈会被内核销毁。
- pause 是 Pod 网络栈的持有者,先创建 netns,创建一对 veth pair 连接宿主机;
- 业务容器、sidecar 只是加入 pause 的网络命名空间,不是新建;
- 哪怕业务容器全部重启、退出,pause 一直存活,网络栈、Pod IP、路由、iptables/eBPF 规则全部保留;
- 只要 pause 不挂,Pod IP 永远不变,网络连接不会中断。
同一 Pod 所有容器共享资源:
- 同一个 IP、同一个网卡 eth0
- 同一套路由表、DNS 配置
- 同一组端口(容器之间端口不能重复)
- 本地
localhost互通(sidecar 和主业务直接本地通信)
2.2. 共享 PID 命名空间(可选配置 shareProcessNamespace)
默认关闭,开启后:
所有容器共用一套 PID 树,能互相看到对方进程;
pause 作为 1 号进程,负责收割僵尸进程,避免容器内孤儿进程堆积占用资源。
2.3. 持有 IPC 命名空间
Pod 内所有容器共享 IPC 通信资源(消息队列、信号量、共享内存),容器间可以通过进程间通信交互。
2.4. 回收僵尸进程(容器孤儿进程托管)
Linux 规定:孤儿进程会被 PID=1 的进程收养。
pause 内部逻辑极简,循环调用 wait(),持续收割所有容器产生的僵尸进程,防止内核进程表泄漏、节点内存泄漏。
如果没有 pause,业务容器重启后残留僵尸进程无法清理,长期运行节点会出现进程爆满。
3. pause 极简内部源码逻辑
pause 是 C 语言编写,代码仅百行,核心逻辑:
- 忽略所有信号(SIGINT/SIGTERM 等),不会轻易退出;
- 死循环调用 wait(),持续等待子进程,回收僵尸;
- 不执行任何业务、不读写磁盘、不占用CPU;
- 仅做“占位守护进程”。
关键特性:pause 不会主动退出,只有两种情况销毁:
- 执行
kubectl delete pod,kubelet 发送终止信号; - kubelet 驱逐、节点关机,强制杀死 pause。
4. Pod 完整启动流程(pause 执行顺序)
- kubelet 调用 CNI 插件(Calico/Cilium),分配 Pod IP,创建 veth pair;
- 拉取 pause 镜像,启动 pause 容器,创建独立 netns/ipc ns;
- 将 veth 一端绑定到 pause 的网络命名空间;
- 依次启动业务容器、sidecar 容器,加入 pause 已创建的命名空间;
- 所有容器共享 pause 的网络、IPC 栈;
- 监控所有容器状态,只要 pause 存活,Pod 状态正常;
- 一旦 pause 进程被杀死,kubelet 判断 Pod 异常,立刻重建整个 Pod。
5. 为什么 sidecar 能和业务容器互通?完全依赖 pause
- pause 提前创建统一网络栈;
- 主业务、filebeat/istio-proxy 等 sidecar 都接入同一个 netns;
- 两者拥有相同 localhost、同一个IP,无需跨节点Service,本地端口直连;
示例:istio envoy sidecar 监听 15001 透明代理,业务容器流量直接走本地 envoy。
6. 常见疑问
6.1. 能不能删除/替换 pause?
不能。k8s Pod 模型强依赖 pause 托管命名空间,没有 pause 无法实现多容器共享网络。
6.2. pause 占用资源吗?
几乎无消耗:镜像几十KB,运行后内存占用几MB,CPU 长期 0%。
6.3. 为什么业务容器重启 Pod IP 不变?
网络栈属于 pause,业务容器只是加入命名空间,业务重启不影响 pause,IP、veth 设备保留。
6.4. 开启 shareProcessNamespace 后的变化
Pod 内所有容器可见彼此进程,pause 作为 PID 1 统一回收僵尸;
适合日志、监控类 sidecar 需要查看业务进程的场景。
7. pause 故障影响
- pause 意外被杀 → 整个 Pod 立即重建,所有容器重启;
- 无 pause 场景(理论不存在):任一容器退出就销毁网络栈,Pod IP 频繁变化,网络连接全部断开;
- 缺少僵尸进程回收:节点进程数持续上涨,最终内核卡死。
8. 面试精简总结
- pause 是 Pod 基础占位容器,优先启动,生命周期决定整个 Pod;
- 核心作用:持有 Network/IPC 命名空间,让Pod内多容器(业务+sidecar)共享同一个IP、本地互通;
- 次要作用:PID1进程收割僵尸进程,防止节点进程泄漏;
- 工作流程:先创建网络栈 → 再启动业务/sidecar;pause 不退出则Pod网络、IP永久保留;
- 无任何业务逻辑,资源消耗极低,是 k8s Pod 多容器模型的底层支撑。
关联文档