什么是pod挪圾?
pods
- pod 是 Kubernets 中最小的單位。
- 一個 Pod 就是一個容器環(huán)境下的“邏輯主機”,它包含一個或多個緊密相連的應(yīng)用,這些應(yīng)用可能是在同一臺物理機或虛擬機上摔握。
pod的 context 可以理解為多個 Linux 命名空間的聯(lián)合。
- pid 命名空間(同一個pod中應(yīng)用可以看到其他進程)
- 網(wǎng)絡(luò) 命名空間 (同一個pod中的應(yīng)用對相同的ip地址和端口有權(quán)限)
- IPC 命名空間 (同一個pod中的應(yīng)用可以通過VPC或者POSIX進行通訊)
- UTS 命名空間 (同一個pod中的應(yīng)用共享一個主機名稱)
同一個Pod中的應(yīng)用可以共享磁盤丁寄,磁盤是Pod級的氨淌,應(yīng)用可以通過文件系統(tǒng)調(diào)用泊愧,額外的,一個Pod可能會定義頂級的cgroup隔離盛正,這樣的話綁定到任何一個應(yīng)用(好吧删咱,這句是在沒怎么看懂,就是說Pod豪筝,應(yīng)用痰滋,隔離)
由于docker的架構(gòu),一個Pod是由多個相關(guān)的并且共享磁盤的容器組成续崖,Pid的命名空間共享還沒有應(yīng)用到Docker中
和相互獨立的容器一樣敲街,Pod是一種相對短暫的存在,而不是持久存在的严望,正如我們在Pod的生命周期中提到的多艇,Pod被安排到結(jié)點上,并且保持在這個節(jié)點上直到被終止(根據(jù)重啟的設(shè)定)或者被刪除像吻,當一個節(jié)點死掉之后峻黍,上面的所有Pod均會被刪除。特殊的Pod永遠不會被轉(zhuǎn)移到的其他的節(jié)點拨匆,作為替代姆涩,他們必須被replace.
pod 的使用
pod 可以作為垂直應(yīng)用整合的載體,但是它主要的特點是同地協(xié)作涮雷,如同管理程序阵面;例如:
- 內(nèi)容管理系統(tǒng),文件和數(shù)據(jù)加載洪鸭,本地緩存等等
- 日志和檢查點備份样刷,壓縮,循環(huán)览爵,快照等等
- 數(shù)據(jù)交換監(jiān)控置鼻,日志追蹤,日志記錄和監(jiān)控適配器蜓竹,以及事件發(fā)布等等
- 代理箕母,網(wǎng)橋,適配器
- 控制俱济,管理嘶是,配置,更新
總體來說蛛碌,獨立的pod不會去加載多個相同的應(yīng)用實例
pod的持久化
Pod并不是被設(shè)計成一個持久化的資源聂喇,它不會在調(diào)度失敗,節(jié)點崩潰,或者其他回收中(比如因為資源的缺乏希太,或者其他的維護中)幸存下來
總體來說克饶,用戶因該直接去創(chuàng)建Pod,并且一直使用controller(replication controller),即使是一個節(jié)點的情況誊辉,這是因為controller提供了集群范圍內(nèi)的自我修復(fù)矾湃,以及復(fù)制還有展示管理
集群API的使用是用戶的主要使用方式,這是相對普遍的在如下云管理平臺中( Borg, Marathon, Aurora, and Tupperware.)
Pod 的直接暴露使如下操作變得更容器
- 調(diào)度和管理的易用性
- 在沒有的代理的情況下通過 API 對 pod 進行操作
- Pod 的生命周期和管理器的生命周期分離
- 解偶控制器和服務(wù)堕澄,后段服務(wù)器僅僅監(jiān)控Pod
- 劃分清楚了 Kuberlet 的級別功能和云平臺的級別功能邀跃,Kuberlet 實際上是一個 Pod 管理器
- 高可用,當發(fā)生一些刪除或者維護的過程時奈偏,Pod 會自動的在他們終止之前創(chuàng)建新的代替
容器的終止
因為 Pod 代表著一個集群中節(jié)點上運行的進程坞嘀,當這些進程不再被需要,優(yōu)雅退出是很重要的(與粗暴的用一個KILL信號去結(jié)束惊来,讓應(yīng)用沒有機會進行清理操作)丽涩。用戶應(yīng)該能請求刪除,并且在室進程終止的情況下能知道裁蚁,而且也能保證刪除最終完成矢渊。當一個用戶請求刪除 Pod ,系統(tǒng)記錄想要的優(yōu)雅退出時間段枉证,在這之前 Pod 不允許被強制殺死矮男,TERM 信號也會發(fā)送給容器的主要進程。一旦優(yōu)雅退出時間段過了室谚,KILL 信號就會送到這些進程毡鉴,Pod 就會從 API 服務(wù)器中刪除。如果在等待進程結(jié)束的時候秒赤,Kuberlet 或者 容器管理器 重啟了猪瞬,結(jié)束過程會帶著完整的優(yōu)雅退出時間段進行重試。
一個示例流程:
1. 用戶發(fā)送一個命令來刪除Pod入篮,默認的優(yōu)雅退出時間是30秒
2. API服務(wù)器中的Pod更新時間陈瘦,超過該時間Pod被認為死亡
3. 在客戶端命令的的里面,Pod顯示為”Terminating(退出中)”的狀態(tài)
4. (與第3同時)當Kubelet看到Pod標記為退出中的時候潮售,因為第2步中時間已經(jīng)設(shè)置了痊项,它開始pod關(guān)閉的流程
i. 如果該Pod定義了一個停止前的鉤子,其會在pod內(nèi)部被調(diào)用酥诽。如果鉤子在優(yōu)雅退出時間段超時仍然在運行鞍泉,第二步會意一個很小的優(yōu)雅時間斷被調(diào)用
ii. 進程被發(fā)送TERM的信號
5. (與第三步同時進行)Pod從service的列表中被刪除,不在被認為是運行著的pod的一部分肮帐。緩慢關(guān)閉的pod可以繼續(xù)對外服務(wù)咖驮,當負載均衡器將他們輪流移除。
6. 當優(yōu)雅退出時間超時了,任何pod中正在運行的進程會被發(fā)送SIGKILL信號被殺死游沿。
7. Kubelet會完成pod的刪除,將優(yōu)雅退出的時間設(shè)置為0(表示立即刪除)肮砾。pod從API中刪除诀黍,不在對客戶端可見。
默認情況下仗处,所有的刪除操作的優(yōu)雅退出時間都在30秒以內(nèi)眯勾。kubectl delete命令支持–graceperiod=的選項,以運行用戶來修改默認值婆誓。0表示刪除立即執(zhí)行囤官,并且立即從API中刪除pod這樣一個新的pod會在同時被創(chuàng)建呻纹。在節(jié)點上,被設(shè)置了立即結(jié)束的的pod,仍然會給一個很短的優(yōu)雅退出時間段狼讨,才會開始被強制殺死。
使用Volume
Volume可以為容器提供持久化存儲题禀,比如
apiVersion: v1
kind: Pod
metadata:
name: redis
spec:
containers:
- name: redis
image: redis
volumeMounts:
- name: redis-storage
mountPath: /data/redis
volumes:
- name: redis-storage
emptyDir: {}
私有鏡像
在使用私有鏡像時馍资,需要創(chuàng)建一個docker registry secret,并在容器中引用燥翅。
創(chuàng)建docker registry secret:
kubectl create secret docker-registry regsecret --docker-server=<your-registry-server> --docker-username=<your-name> --docker-password=<your-pword> --docker-email=<your-email>
容器中引用該secret:
apiVersion: v1
kind: Pod
metadata:
name: private-reg
spec:
containers:
- name: private-reg-container
image: <your-private-image>
imagePullSecrets:
- name: regsecret
RestartPoliy
支持三種類型的 RestartPoliy
- Always:只要退出就重啟
- OnFailure: 失敗退出 (exit code 不等于0 )時重啟
- Never: 只要退出就不再重啟
注意骑篙,這里的重啟是指在Pod 所在的本地重啟,并不會調(diào)度到其他node上去森书。