我們知道,容器編排是整個Kubernetes的核心所在,而Pod又是編排的核心所在,所以,理解好Pod,才能理解整個Kubernetes的編排。
下面我們重點對于Pod做個詳細的解析。
一.Docker簡介
在詳細進行Pod分析之前,有必要對Docker做個簡要的歸納,因為對于Kubernetes來說,docker容器才是真正需要去管理的對象,離開了容器空談編排,無異于空中樓閣。
那么我們首先來簡單梳理一下容器&Docker相關的知識點:
1.基本概念
? 直譯為“集裝箱”,作用在于將貨物打包,并且能夠做到相互隔離。
????國內有個高大上的譯名為“容器”,相信如果你周末報個小班,跟你女朋友說,我去學集裝箱。。。
? 軟件開發/部署經歷的3個階段:
物理機——VM——容器
物理機時代,很多人甚至很多團隊共同使用一套開發環境,這使得對于資源的使用經常出現爭搶的情況,而且對于系統的配置會因為項目需要經常變更,導致其他人員出現各種問題。且一旦開發環境出現機器故障,需要一個很長的修復時間,甚至需要整個環境重新配置,嚴重情況下會出現數據丟失等等
VM時代,很好的解決了上述的物理機問題,將一臺物理機隔離開,每個人有獨立的工作空間,不會相互干擾,但是由于每個VM需要一個底層的操作系統支撐,導致我們每個物理機上能隔離開的VM不會太多,一臺性能好的物理機能隔離出10幾個虛擬機已經是很優秀的配置了。
容器時代,Docker的出現,很好的解決了VM對于操作系統強依賴的問題,Docker的隔離機制使得底層的操作系統在容器間可以共享,并且在共享操作系統的文件被修改時不會影響到不相干的容器。
? Docker的架構圖:
在Docker里面我們需要清楚3個重要的概念:
? Image(鏡像):?由文件系統疊加而成,最底端是一個文件引導系統,即bootfs。Docker用戶不會與引導文件系統有直接的交互。Docker鏡像的第二層是root文件系統rootfs,通常是一種或多種操作系統,例如ubuntu等。在Docker中,文件系統永遠都是只讀的,在每次修改時,都是進行拷貝疊加從而形成最終的文件系統。Docker稱這樣的文件為鏡像。
鏡像的特征是:所有層都是只讀的,除了最底層,其他層都有一個指針指向下一層。
? Container(容器):定義和鏡像(image)幾乎一模一樣,也是一堆層的統一視角,唯一區別在于容器的最上面那一層是可讀可寫的。
? Repo(倉庫):Docker官方維護一個Common的專門存放Image的倉庫,也可以創建自己的私有倉庫用以保存自己的鏡像。
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個或多個容器組合而成,例如:
這個frontend Pod在啟動成功以后,將啟動一個Docker容器
? 另一個場景是,當frontend和redis兩個容器應用為緊耦合關系時,應該組成一個整體對外提供服務:配置文件為:test.yaml
屬于一個Pod的多個容器應用之間相互訪問時僅需通過localhost就可以通信。也就是說,我們在容器name:frontend的php網頁中嵌入:“localhost:6379”即可以對redis-master進行訪問。
運行下列指令即可創建:
2.靜態Pod:
靜態Pod是由kublet進行管理的僅存在于特定Node上的Pod,他們不能通過API S而ver進行管理,無法與RC、Deployment進行關聯,并且kubelet無法對其進行健康檢查。
創建靜態Pod有兩種方式:配置文件方式和Http方式,這邊不多做贅述~
三、Pod容器共享Volume
在同一個Pod中多個容器能夠共享Pod級別的Volume。Volume可以被定義為各種類型,多個容器各自進行掛載操作,將一個Volume掛載為容器內部需要的目錄:
此處設置的Volume名為app-logs,類型為emptyDir,掛載到tomcat容器內的/usr/local/tomcat/logs目錄,同時掛載到logreader容器內的/log目錄。如果tomcat往該volume下寫文件的同時,logreader就可以開始讀取文件了。