Pause容器理(li)解pod
在(zai)k8s中(zhong)pod是(shi)最小單元(yuan)
pod和容器的關系
pod類似一(yi)個組容(rong)器的集(ji)合,這些(xie)容(rong)器之間共享一(yi)份存儲,網(wang)絡等資源。

一(yi)個pod下面除去(qu)主業務容(rong)(rong)(rong)(rong)器還有一(yi)個容(rong)(rong)(rong)(rong)器:pause容(rong)(rong)(rong)(rong)器。這是一(yi)個特殊的(de)容(rong)(rong)(rong)(rong)器,它又叫infra容(rong)(rong)(rong)(rong)器,是每個pod都會(hui)自(zi)動(dong)創建(jian)的(de)容(rong)(rong)(rong)(rong)器,它不屬于用戶自(zi)定義容(rong)(rong)(rong)(rong)器。
pause容器
pause容器鏡像
使用 docker insepct [CONTAAINER_ID] 查看一下 pause 容(rong)器(qi)的詳情信(xin)息,可以發現(xian) pause 容(rong)器(qi)使用(yong)的鏡像為(wei)
registry.cn-hangzhou.aliyuncs.com/google_containers/pause:3.6
該鏡像非(fei)常小,只有 484KB,由(you)于它(ta)總是(shi)處(chu)于 Pause (暫時)狀態,所以取名叫 pause。
pod 在 kubelet 的創建過程
- kubelet 在接收到 pod 的創建指令后,通過容器運行時(如 containerd、CRI-O)創建 POD 沙箱(Sanbox)
- 運行時首先啟動 pause 容器(infra 容器),該容器十分輕量它幾乎不消耗資源只是長期睡眠
- 隨后業務容器啟動加入(JoinNamespace 操作)到 pause 容器持有的 namespace 中
pause 容器的作用
它僅作為 namespace 的持(chi)有者,確保業(ye)務容器崩潰不會導致(zhi)整個命名空間崩潰。
為什么需要 pause 容器?
- 命名空間生命周期管理:
如果沒有pause容器,當業務容器退出時,其持有的命名空間也會被銷毀,導致Pod內其他容器無法穩定共享資源(如網絡)。pause容器作為靜態錨點,確保命名空間持續存在。 - 資源清理:
當Pod被刪除時,kubelet會先殺死pause容器,從而自動釋放所有關聯的命名空間和資源(避免孤兒進程或殘留資源)。
例如:你在 kubectl exec 到 pod 內部,通過 ip a 看到的地址是由 pause 容器持有的。
它會持有哪些資源?
網絡命名空間(Network Namespace)最核心的資源
這(zhe)是(shi) pause 容器最重(zhong)要的職責。
- 它是什么?:
一個完全隔離的網絡堆棧,包括獨立的網卡設備(如 eth0)、IP 地址、端口范圍、路由表和 iptables/Netfiter 規則。 - 如何持有?:
pause 容器啟動后,容器運行時會為它創建一個新的網絡命名空間(除非使用 hostNetwork)。CNI 插件隨后被調用、負載在這個命名空間內配置網絡(分配 IP、創建網卡設置路由等)。 - 為什么重要?:
所有后續加入該 Pod 的業務容器,都會共享這個由 pause 容器持有的網絡命名空間。因此,整個 Pod 只有一個 IP 地址,所有容器通過 localhost 相互通信,且不會發生端口沖突。
IPC 命名空間(IPC NameSpace)
- 它是什么?:隔離 System V 進程間通信(IPC)資源和 POSIX 消息隊列。這允許 Pod 內的容器使用共享內存段或信號量等機制進行通信。
- 如何持有?:如果 Pod 的 spec.shareProcessNamespace 字段未設置或設置為 false,pause 容器會持有一個獨立的 IPC 命名空間供 POD 內容器共享。
PID 命名空間(PID Namespace)-條件性持有
- 它是什么?:隔離進程 ID 編號空間。不同 PID 命名空間中的進程可以有相同的 PID。
- 如何持有?:這取決于 pod 配置。
- 如果 spec.shareProccessNamespace 未設置或者設置為 false(默認),則每個容器包括 pause 自己都有自己的 PId 命名空間。此時 pause 容器不持有共享的 PID 命名空間。
- 反之 pause 容器會創建一個 Pod 級別的 PID 命名空間。在這個模式下 pause 容器是 PID 1 的進程,所有容器中的進程都是它的子進程,你可以在一個容器中看到 Pod 內所有其它容器的進程。
掛載命名空間(Mount Namespace)- 間接關聯
- 雖然每個容器都有自己的掛載命名空間以實現文件系統隔離,但 pause 容器通常不直接持有一個共享的掛載命名空間。Pod 級別的存儲(如 emptyDir 卷)是通過在每個容器的命名空間內單獨掛載來實現共享的,而不是通過共享同一個掛載命名空間。
總結
| 資源類型 | 是否由 Pause 容器持有? | 說明 |
|---|---|---|
| 網絡命名空間 | 是 | 核心職責。持有整個 Pod 的唯一 IP 和網絡棧。 |
| IPC 命名空間 | 是 | 持有 Pod 級別的 IPC 資源,供容器間通信。 |
| PID 命名空間 | 條件性是 | 僅在 shareProcessNamespace: true時持有,成為 PID 1。 |
| 掛載命名空間 | 通常否 | 每個容器獨立,通過卷(Volume)機制共享存儲。 |
| UTS 命名空間 | 是 | 持有 Pod 的主機名(spec.hostname)。 |
| 用戶命名空間 | 可能 | 如果配置了用戶命名空間隔離,它也會是持有者。 |
