深入掌握Pod
? 本章將對(duì)Kubernetes如何發(fā)布與管理容器應(yīng)用進(jìn)行詳細(xì)說明和示例,主要包括Pod和容器的使用、應(yīng)用配置管理、Pod的控制和調(diào)度管理、Pod的升級(jí)和回滾,以及Pod的擴(kuò)縮容機(jī)制等內(nèi)容。
1.Pod定義詳解
YAML格式的Pod定義文件的完整內(nèi)容如下:



對(duì)各屬性的詳細(xì)說明


2.Pod的基本用法
? 在對(duì)Pod的用法進(jìn)行說明之前,有必要先對(duì)Docker容器中應(yīng)用的運(yùn)行要求進(jìn)行說明。
2.1 k8s中對(duì)docker容器中應(yīng)用的運(yùn)行需求
-
在使用Docker時(shí),可以使用docker run命令創(chuàng)建并啟動(dòng)一個(gè)容器。
-
如果我們創(chuàng)建的Docker鏡像的啟動(dòng)命令是后臺(tái)執(zhí)行程序,例如Linux腳本:
nohup ./start.sh &
-
-
而在Kubernetes系統(tǒng)中對(duì)長時(shí)間運(yùn)行容器的要求是:其主程序需要一直在前臺(tái)執(zhí)行。
-
Kubernetes需要一個(gè)前臺(tái)命令作為啟動(dòng)命令的原因:
如果在kubelet創(chuàng)建包含這個(gè)容器的pod之后運(yùn)行上面nohup ./start.sh命令,則會(huì)認(rèn)為Pod執(zhí)行結(jié)束,立刻銷毀該P(yáng)od。
如果為該P(yáng)od定義了ReplicationController,則系統(tǒng)會(huì)監(jiān)控到該P(yáng)od已經(jīng)終止,之后根據(jù)RC定義中Pod的replicas副本數(shù)量生成一個(gè)新的Pod。一旦創(chuàng)建新的Pod,就在執(zhí)行完啟動(dòng)命令后陷入無限循環(huán)的過程中。
-
如果一個(gè)應(yīng)用無法改造成前臺(tái)執(zhí)行,在k8s中應(yīng)該如何運(yùn)行
-
可以使用開源工具Supervisor輔助進(jìn)行前臺(tái)運(yùn)行的功能。
Supervisor提供了一種可以同時(shí)啟動(dòng)多個(gè)后臺(tái)應(yīng)用,并保持Supervisor自身在前臺(tái)執(zhí)行的機(jī)制,可以滿足Kubernetes對(duì)容器的啟動(dòng)要求。
關(guān)于Supervisor的安裝和使用,請(qǐng)參考官網(wǎng)http://supervisord.org的文檔說明。
-
-
2.2 對(duì)Pod容器的封裝和應(yīng)用進(jìn)行說明
容器有以下兩種方式組成
-
松耦合:Pod可以由1個(gè)容器組合而成。
- 以下是名為frontend的Pod只由一個(gè)容器組成:


? 這個(gè)frontend Pod在成功啟動(dòng)之后,將啟動(dòng)1個(gè)Docker容器。
-
緊耦合:Pod可以由多個(gè)容器組合而成
- 兩個(gè)容器應(yīng)用為緊耦合的關(guān)系,并組合成一個(gè)整體對(duì)外提供服務(wù)時(shí),應(yīng)將這兩個(gè)容器打包為一個(gè)Pod
例子
frontend和redis兩個(gè)容器應(yīng)用為緊耦合的關(guān)系

配置文件frontend-localredis-pod.yaml的內(nèi)容如下:

屬于同一個(gè)Pod的多個(gè)容器應(yīng)用之間相互訪問時(shí)僅需要通過localhost就可以通信,使得這一組容器被“綁定”在了一個(gè)環(huán)境中。
在Docker容器kubeguide/guestbook-php-frontend:localredis的PHP網(wǎng)頁中,直接通過URL地址“l(fā)ocalhost:6379”對(duì)同屬于一個(gè)Pod的redis-master進(jìn)行訪問。guestbook.php的內(nèi)容如下:

運(yùn)行kubectl create命令創(chuàng)建該P(yáng)od:

查看已經(jīng)創(chuàng)建的Pod:

可以看到READY信息為2/2,表示Pod中的兩個(gè)容器都成功運(yùn)行了。
查看這個(gè)Pod的詳細(xì)信息,可以看到兩個(gè)容器的定義及創(chuàng)建的過程(Event事件信息):


3.靜態(tài)Pod
-
介紹:
靜態(tài)Pod是由kubelet進(jìn)行管理的僅存在于特定Node上的Pod。
靜態(tài)Pod總是由kubelet創(chuàng)建的,并且總在kubelet所在的Node上運(yùn)行。
-
特點(diǎn):
它們不能通過API Server進(jìn)行管理;
無法與ReplicationController、Deployment或者DaemonSet進(jìn)行關(guān)聯(lián);
kubelet無法對(duì)它們進(jìn)行健康檢查;
3.1 創(chuàng)建靜態(tài)Pod的兩種方式
1.配置文件方式
啟動(dòng)方式
? 需要設(shè)置kubelet的啟動(dòng)參數(shù)“--config”,指定kubelet需要監(jiān)控的配置文件所在的目錄,kubelet會(huì)定期掃描該目錄,并根據(jù)該目錄下的.yaml或.json文件進(jìn)行創(chuàng)建操作。
例子
? 假設(shè)配置目錄為/etc/kubelet.d/,配置啟動(dòng)參數(shù)為--config=/etc/kubelet.d/,然后重啟kubelet服務(wù)。
? 在目錄/etc/kubelet.d中放入static-web.yaml文件,內(nèi)容如下:

? 等待一會(huì)兒,查看本機(jī)中已經(jīng)啟動(dòng)的容器:

? 可以看到一個(gè)Nginx容器已經(jīng)被kubelet成功創(chuàng)建了出來。
? 到Master上查看Pod列表,可以看到這個(gè)static pod:

? 由于靜態(tài)Pod無法通過API Server直接管理,所以在Master上嘗試刪除這個(gè)Pod時(shí),會(huì)使其變成Pending狀態(tài),且不會(huì)被刪除。

? 刪除該P(yáng)od的操作只能是到其所在Node上將其定義文件static-web.yaml從/etc/kubelet.d目錄下刪除。

2.HTTP方式
? 通過設(shè)置kubelet的啟動(dòng)參數(shù)“--manifest-url”,kubelet將會(huì)定期從該URL地址下載Pod的定義文件,并以.yaml或.json文件的格式進(jìn)行解析,然后創(chuàng)建Pod。其實(shí)現(xiàn)方式與配置文件方式是一致的。