重要概念:Pod內的容器都是平等的關系,共享Network Namespace、共享文件
pause容器的最主要的作用:創建共享的網絡名稱空間,以便於其它容器以平等的關系加入此網絡名稱空間
pause進程是pod中所有容器的父進程(即第一個進程);
關於 Pod 最重要的一個事實是:它只是一個邏輯概念。
Pod 在 Kubernetes 項目里還有更重要的意義,那就是:容器設計模式;
那么,Pod 又是怎么被“創建”出來的呢?
答案是:Pod,其實是一組共享了某些資源的容器。
具體的說:Pod 里的所有容器,共享的是同一個 Network Namespace,並且可以聲明共享同一個 Volume。
假如:一個有 A、B 兩個容器的 Pod,不就是等同於一個容器(容器 A)共享另外一個容器(容器 B)的網絡和 Volume 的玩兒法么?
這好像通過 docker run --net --volumes-from 這樣的命令就能實現嘛,比如:
但是,如果真這樣做的話,容器 B 就必須比容器 A 先啟動,這樣一個 Pod 里的多個容器就不是對等關系,而是拓撲關系了。
所以,在 Kubernetes 項目里,Pod 的實現需要使用一個中間容器,這個容器叫作 Infra 容器(初始化容器)。
在這個 Pod 中,Infra 容器永遠都是第一個被創建的容器,而其他用戶定義的容器,則通過 Join Network Namespace 的方式,與 Infra 容器關聯在一起。
這樣的組織關系,可以用下面這樣一個示意圖來表達:
如上圖所示,這個 Pod 里有兩個用戶容器 A 和 B,還有一個 Infra 容器。
很容易理解,在 Kubernetes 項目里,Infra 容器一定要占用極少的資源,所以它使用的是一個非常特殊的鏡像,叫作:k8s.gcr.io/pause。
這個鏡像是一個用匯編語言編寫的、永遠處於“暫停”狀態的容器,解壓后的大小也只有 100~200 KB 左右。
而在 Infra 容器“Hold 住(創建)”Network Namespace 后,用戶容器就可以加入到 Infra 容器的 Network Namespace 當中了。
這也就意味着,對於 Pod 里的容器 A 和容器 B 來說:
-
它們可以直接使用 localhost 進行通信;
-
它們看到的網絡設備跟 Infra 容器看到的完全一樣;
-
一個 Pod 只有一個 IP 地址,也就是這個 Pod 的 Network Namespace 對應的 IP 地址;
-
當然,其他的所有網絡資源,都是一個 Pod 一份,並且被該 Pod 中的所有容器共享;
-
Pod 的生命周期只跟 Infra 容器一致,而與容器 A 和 B 無關。