《k8s權(quán)威指南》讀書筆記-Pod定義&基本用法&靜態(tài)Pod

深入掌握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)容如下:

image.png
image.png
image.png

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

image.png
image.png

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è)容器組成:
image.png
image.png

? 這個(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)系

image.png

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

image.png

屬于同一個(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)容如下:
image.png

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

image.png

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

image.png

可以看到READY信息為2/2,表示Pod中的兩個(gè)容器都成功運(yùn)行了。

查看這個(gè)Pod的詳細(xì)信息,可以看到兩個(gè)容器的定義及創(chuàng)建的過程(Event事件信息):

image.png
image.png

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)容如下:

image.png

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

image.png

? 可以看到一個(gè)Nginx容器已經(jīng)被kubelet成功創(chuàng)建了出來。

? 到Master上查看Pod列表,可以看到這個(gè)static pod:

image.png

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

image.png

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

image.png

2.HTTP方式

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

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容