Kubernetes系列(2)—— 深入理解Pod

我們知道,容器編排是整個Kubernetes的核心所在,而Pod又是編排的核心所在,所以,理解好Pod,才能理解整個Kubernetes的編排。

下面我們重點對于Pod做個詳細的解析。


一.Docker簡介

在詳細進行Pod分析之前,有必要對Docker做個簡要的歸納,因為對于Kubernetes來說,docker容器才是真正需要去管理的對象,離開了容器空談編排,無異于空中樓閣。

那么我們首先來簡單梳理一下容器&Docker相關的知識點:

1.基本概念

? 直譯為“集裝箱”,作用在于將貨物打包,并且能夠做到相互隔離。

1. Kubernetes Container

????國內有個高大上的譯名為“容器”,相信如果你周末報個小班,跟你女朋友說,我去學集裝箱。。。

? 軟件開發/部署經歷的3個階段:

物理機——VM——容器

物理機時代,很多人甚至很多團隊共同使用一套開發環境,這使得對于資源的使用經常出現爭搶的情況,而且對于系統的配置會因為項目需要經常變更,導致其他人員出現各種問題。且一旦開發環境出現機器故障,需要一個很長的修復時間,甚至需要整個環境重新配置,嚴重情況下會出現數據丟失等等

VM時代,很好的解決了上述的物理機問題,將一臺物理機隔離開,每個人有獨立的工作空間,不會相互干擾,但是由于每個VM需要一個底層的操作系統支撐,導致我們每個物理機上能隔離開的VM不會太多,一臺性能好的物理機能隔離出10幾個虛擬機已經是很優秀的配置了。

容器時代,Docker的出現,很好的解決了VM對于操作系統強依賴的問題,Docker的隔離機制使得底層的操作系統在容器間可以共享,并且在共享操作系統的文件被修改時不會影響到不相干的容器。

2. Kubernetes VM VS Container

? Docker的架構圖:

3. Kubernetes Docker Architecture

在Docker里面我們需要清楚3個重要的概念:

4. Kubernetes Container & Images

? Image(鏡像):?由文件系統疊加而成,最底端是一個文件引導系統,即bootfs。Docker用戶不會與引導文件系統有直接的交互。Docker鏡像的第二層是root文件系統rootfs,通常是一種或多種操作系統,例如ubuntu等。在Docker中,文件系統永遠都是只讀的,在每次修改時,都是進行拷貝疊加從而形成最終的文件系統。Docker稱這樣的文件為鏡像。

4. Kubernetes Image

鏡像的特征是:所有層都是只讀的,除了最底層,其他層都有一個指針指向下一層。

? Container(容器):定義和鏡像(image)幾乎一模一樣,也是一堆層的統一視角,唯一區別在于容器的最上面那一層是可讀可寫的。

5. Kubernetes Container

? Repo(倉庫):Docker官方維護一個Common的專門存放Image的倉庫,也可以創建自己的私有倉庫用以保存自己的鏡像。

6. Kubernetes Repo

2.常用指令:

? docker create <image-id>:用于創建容器,為指定的鏡像(image)添加了一個可讀寫層,構成了一個新的容器。注意,這個容器并沒有運行。

? docker start <container-id>:為容器文件系統創建了一個進程隔離空間。注意,每一個容器只能夠有一個進程隔離空間。

? docker run <image-id>:docker create +?docker start

? docker ps –a :列出所有存在的容器(運行態和非運行態)

? docker images –a:列出了所有的鏡像,也可以說是列出了所有的可讀層。如果你想要查看某一個image-id下的所有層,可以使用docker history來查看。

? docker commit <container-id>:將容器的可讀寫層轉換為一個只讀層,這樣就把一個容器轉換成了不可變的鏡像。


二.Pod的基本用法

1.動態創建Pod

在使用Docker時,可以使用docker run命令創建并啟動一個容器,在Kubernetes系統里面,對于長時間運行的容器是有要求的:主程序需要一直在前臺執行,如果我們在docker里啟用后臺執行程序,那么在kublet創建包含這個容器的Pod之后運行完該命令,即認為Pod執行結束,將立刻銷毀Pod。一旦我們使用ReplicationController,則系統會監測到Pod已經終止,會根據Pod的replicas的副本數量生成一個新的Pod,而一旦創建出新的Pod,就將在執行完后臺啟動命令后,陷入無限循環中。這就是Kubernetes需要我們自己創建的Docker鏡像以一個前臺命令作為啟動命令的原因。

Pod的基本用法為:

? Pod可以由1個或多個容器組合而成,例如:

7.kubernetes Pod(1個容器)

這個frontend Pod在啟動成功以后,將啟動一個Docker容器

? 另一個場景是,當frontend和redis兩個容器應用為緊耦合關系時,應該組成一個整體對外提供服務:配置文件為:test.yaml

8.kubernetes Pod(2個容器)

屬于一個Pod的多個容器應用之間相互訪問時僅需通過localhost就可以通信。也就是說,我們在容器name:frontend的php網頁中嵌入:“localhost:6379”即可以對redis-master進行訪問。

運行下列指令即可創建:

9.create pods

2.靜態Pod:

靜態Pod是由kublet進行管理的僅存在于特定Node上的Pod,他們不能通過API S而ver進行管理,無法與RC、Deployment進行關聯,并且kubelet無法對其進行健康檢查。

創建靜態Pod有兩種方式:配置文件方式和Http方式,這邊不多做贅述~


三、Pod容器共享Volume

在同一個Pod中多個容器能夠共享Pod級別的Volume。Volume可以被定義為各種類型,多個容器各自進行掛載操作,將一個Volume掛載為容器內部需要的目錄:

10.Pod中多個容器共享volume

此處設置的Volume名為app-logs,類型為emptyDir,掛載到tomcat容器內的/usr/local/tomcat/logs目錄,同時掛載到logreader容器內的/log目錄。如果tomcat往該volume下寫文件的同時,logreader就可以開始讀取文件了。

?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容