我們知道横辆,容器編排是整個(gè)Kubernetes的核心所在,而Pod又是編排的核心所在龄糊,所以,理解好Pod炫惩,才能理解整個(gè)Kubernetes的編排。
下面我們重點(diǎn)對(duì)于Pod做個(gè)詳細(xì)的解析他嚷。
一.Docker簡(jiǎn)介
在詳細(xì)進(jìn)行Pod分析之前,有必要對(duì)Docker做個(gè)簡(jiǎn)要的歸納,因?yàn)閷?duì)于Kubernetes來(lái)說(shuō)卸耘,docker容器才是真正需要去管理的對(duì)象,離開了容器空談編排蚣抗,無(wú)異于空中樓閣。
那么我們首先來(lái)簡(jiǎn)單梳理一下容器&Docker相關(guān)的知識(shí)點(diǎn):
1.基本概念
? 直譯為“集裝箱”翰铡,作用在于將貨物打包,并且能夠做到相互隔離锭魔。
????國(guó)內(nèi)有個(gè)高大上的譯名為“容器”,相信如果你周末報(bào)個(gè)小班迷捧,跟你女朋友說(shuō),我去學(xué)集裝箱漠秋。。巡社。
? 軟件開發(fā)/部署經(jīng)歷的3個(gè)階段:
物理機(jī)——VM——容器
物理機(jī)時(shí)代,很多人甚至很多團(tuán)隊(duì)共同使用一套開發(fā)環(huán)境晌该,這使得對(duì)于資源的使用經(jīng)常出現(xiàn)爭(zhēng)搶的情況,而且對(duì)于系統(tǒng)的配置會(huì)因?yàn)轫?xiàng)目需要經(jīng)常變更朝群,導(dǎo)致其他人員出現(xiàn)各種問(wèn)題。且一旦開發(fā)環(huán)境出現(xiàn)機(jī)器故障姜胖,需要一個(gè)很長(zhǎng)的修復(fù)時(shí)間,甚至需要整個(gè)環(huán)境重新配置右莱,嚴(yán)重情況下會(huì)出現(xiàn)數(shù)據(jù)丟失等等
VM時(shí)代,很好的解決了上述的物理機(jī)問(wèn)題慢蜓,將一臺(tái)物理機(jī)隔離開,每個(gè)人有獨(dú)立的工作空間晨抡,不會(huì)相互干擾氛悬,但是由于每個(gè)VM需要一個(gè)底層的操作系統(tǒng)支撐,導(dǎo)致我們每個(gè)物理機(jī)上能隔離開的VM不會(huì)太多如捅,一臺(tái)性能好的物理機(jī)能隔離出10幾個(gè)虛擬機(jī)已經(jīng)是很優(yōu)秀的配置了。
容器時(shí)代镜遣,Docker的出現(xiàn),很好的解決了VM對(duì)于操作系統(tǒng)強(qiáng)依賴的問(wèn)題悲关,Docker的隔離機(jī)制使得底層的操作系統(tǒng)在容器間可以共享,并且在共享操作系統(tǒng)的文件被修改時(shí)不會(huì)影響到不相干的容器坚洽。
? Docker的架構(gòu)圖:
在Docker里面我們需要清楚3個(gè)重要的概念:
? Image(鏡像):?由文件系統(tǒng)疊加而成讶舰,最底端是一個(gè)文件引導(dǎo)系統(tǒng),即bootfs跳昼。Docker用戶不會(huì)與引導(dǎo)文件系統(tǒng)有直接的交互。Docker鏡像的第二層是root文件系統(tǒng)rootfs鹅颊,通常是一種或多種操作系統(tǒng),例如ubuntu等墓造。在Docker中,文件系統(tǒng)永遠(yuǎn)都是只讀的觅闽,在每次修改時(shí),都是進(jìn)行拷貝疊加從而形成最終的文件系統(tǒng)蛉拙。Docker稱這樣的文件為鏡像。
鏡像的特征是:所有層都是只讀的孕锄,除了最底層,其他層都有一個(gè)指針指向下一層畸肆。
? Container(容器):定義和鏡像(image)幾乎一模一樣,也是一堆層的統(tǒng)一視角恼除,唯一區(qū)別在于容器的最上面那一層是可讀可寫的曼氛。
? Repo(倉(cāng)庫(kù)):Docker官方維護(hù)一個(gè)Common的專門存放Image的倉(cāng)庫(kù),也可以創(chuàng)建自己的私有倉(cāng)庫(kù)用以保存自己的鏡像舀患。
2.常用指令:
? docker create <image-id>:用于創(chuàng)建容器,為指定的鏡像(image)添加了一個(gè)可讀寫層聊浅,構(gòu)成了一個(gè)新的容器。注意低匙,這個(gè)容器并沒(méi)有運(yùn)行。
? docker start <container-id>:為容器文件系統(tǒng)創(chuàng)建了一個(gè)進(jìn)程隔離空間碳锈。注意,每一個(gè)容器只能夠有一個(gè)進(jìn)程隔離空間售碳。
? docker run <image-id>:docker create +?docker start
? docker ps –a :列出所有存在的容器(運(yùn)行態(tài)和非運(yùn)行態(tài))
? docker images –a:列出了所有的鏡像,也可以說(shuō)是列出了所有的可讀層贸人。如果你想要查看某一個(gè)image-id下的所有層,可以使用docker history來(lái)查看艺智。
? docker commit <container-id>:將容器的可讀寫層轉(zhuǎn)換為一個(gè)只讀層,這樣就把一個(gè)容器轉(zhuǎn)換成了不可變的鏡像十拣。
二.Pod的基本用法
1.動(dòng)態(tài)創(chuàng)建Pod
在使用Docker時(shí),可以使用docker run命令創(chuàng)建并啟動(dòng)一個(gè)容器父晶,在Kubernetes系統(tǒng)里面哮缺,對(duì)于長(zhǎng)時(shí)間運(yùn)行的容器是有要求的:主程序需要一直在前臺(tái)執(zhí)行尝苇,如果我們?cè)赿ocker里啟用后臺(tái)執(zhí)行程序,那么在kublet創(chuàng)建包含這個(gè)容器的Pod之后運(yùn)行完該命令埠胖,即認(rèn)為Pod執(zhí)行結(jié)束,將立刻銷毀Pod直撤。一旦我們使用ReplicationController,則系統(tǒng)會(huì)監(jiān)測(cè)到Pod已經(jīng)終止谋竖,會(huì)根據(jù)Pod的replicas的副本數(shù)量生成一個(gè)新的Pod承匣,而一旦創(chuàng)建出新的Pod,就將在執(zhí)行完后臺(tái)啟動(dòng)命令后锤悄,陷入無(wú)限循環(huán)中。這就是Kubernetes需要我們自己創(chuàng)建的Docker鏡像以一個(gè)前臺(tái)命令作為啟動(dòng)命令的原因零聚。
Pod的基本用法為:
? Pod可以由1個(gè)或多個(gè)容器組合而成,例如:
這個(gè)frontend Pod在啟動(dòng)成功以后,將啟動(dòng)一個(gè)Docker容器
? 另一個(gè)場(chǎng)景是隶症,當(dāng)frontend和redis兩個(gè)容器應(yīng)用為緊耦合關(guān)系時(shí),應(yīng)該組成一個(gè)整體對(duì)外提供服務(wù):配置文件為:test.yaml
屬于一個(gè)Pod的多個(gè)容器應(yīng)用之間相互訪問(wèn)時(shí)僅需通過(guò)localhost就可以通信蚂会。也就是說(shuō),我們?cè)谌萜鱪ame:frontend的php網(wǎng)頁(yè)中嵌入:“l(fā)ocalhost:6379”即可以對(duì)redis-master進(jìn)行訪問(wèn)胁住。
運(yùn)行下列指令即可創(chuàng)建:
2.靜態(tài)Pod:
靜態(tài)Pod是由kublet進(jìn)行管理的僅存在于特定Node上的Pod,他們不能通過(guò)API S而ver進(jìn)行管理措嵌,無(wú)法與RC芦缰、Deployment進(jìn)行關(guān)聯(lián),并且kubelet無(wú)法對(duì)其進(jìn)行健康檢查让蕾。
創(chuàng)建靜態(tài)Pod有兩種方式:配置文件方式和Http方式,這邊不多做贅述~
三探孝、Pod容器共享Volume
在同一個(gè)Pod中多個(gè)容器能夠共享Pod級(jí)別的Volume。Volume可以被定義為各種類型顿颅,多個(gè)容器各自進(jìn)行掛載操作缸濒,將一個(gè)Volume掛載為容器內(nèi)部需要的目錄:
此處設(shè)置的Volume名為app-logs,類型為emptyDir庇配,掛載到tomcat容器內(nèi)的/usr/local/tomcat/logs目錄,同時(shí)掛載到logreader容器內(nèi)的/log目錄绍些。如果tomcat往該volume下寫文件的同時(shí),logreader就可以開始讀取文件了柬批。