Kubernetes核心技術(shù)Pod詳解、實(shí)例
1、概述
Pod 是 k8s 系統(tǒng)中可以創(chuàng)建和管理的最小單元,是資源對(duì)象模型中由用戶創(chuàng)建或部署的最 小資源對(duì)象模型,也是在 k8s 上運(yùn)行容器化應(yīng)用的資源對(duì)象,其他的資源對(duì)象都是用來(lái)支 撐或者擴(kuò)展 Pod 對(duì)象功能的,比如控制器對(duì)象是用來(lái)管控 Pod 對(duì)象的,Service 或者 Ingress 資源對(duì)象是用來(lái)暴露 Pod 引用對(duì)象的,PersistentVolume 資源對(duì)象是用來(lái)為 Pod 提供存儲(chǔ)等等,k8s 不會(huì)直接處理容器,而是 Pod,Pod 是由一個(gè)或多個(gè) container 組成。
Pod 是 Kubernetes 的最重要概念,每一個(gè) Pod 都有一個(gè)特殊的被稱為”根容器“的 Pause 容器。Pause 容器對(duì)應(yīng)的鏡 像屬于 Kubernetes 平臺(tái)的一部分,除了 Pause 容器,每個(gè) Pod 還包含一個(gè)或多個(gè)緊密相關(guān)的用戶業(yè)務(wù)容器。
2、特性
(1)資源共享
一個(gè) Pod 里的多個(gè)容器可以共享存儲(chǔ)和網(wǎng)絡(luò),可以看作一個(gè)邏輯的主機(jī)。共享的如 namespace,cgroups 或者其他的隔離資源。
多個(gè)容器共享同一 network namespace,由此在一個(gè) Pod 里的多個(gè)容器共享 Pod 的 IP 和 端口 namespace,所以一個(gè) Pod 內(nèi)的多個(gè)容器之間可以通過(guò) localhost 來(lái)進(jìn)行通信,所需要 注意的是不同容器要注意不要有端口沖突即可。不同的 Pod 有不同的 IP,不同 Pod 內(nèi)的多 個(gè)容器之前通信,不可以使用 IPC(如果沒(méi)有特殊指定的話)通信,通常情況下使用 Pod 的 IP 進(jìn)行通信。
一個(gè) Pod 里的多個(gè)容器可以共享存儲(chǔ)卷,這個(gè)存儲(chǔ)卷會(huì)被定義為 Pod 的一部分,并且可 以掛載到該 Pod 里的所有容器的文件系統(tǒng)上。
(2)生命周期短暫
Pod 屬于生命周期比較短暫的組件,比如,當(dāng) Pod 所在節(jié)點(diǎn)發(fā)生故障,那么該節(jié)點(diǎn)上的 Pod 會(huì)被調(diào)度到其他節(jié)點(diǎn),但需要注意的是,被重新調(diào)度的 Pod 是一個(gè)全新的 Pod,跟之前的 Pod 沒(méi)有半毛錢關(guān)系。
(3)平坦的網(wǎng)絡(luò)
K8s 集群中的所有 Pod 都在同一個(gè)共享網(wǎng)絡(luò)地址空間中,也就是說(shuō)每個(gè) Pod 都可以通過(guò)其 他 Pod 的 IP 地址來(lái)實(shí)現(xiàn)訪問(wèn)。
3、分類
(1)普通 Pod
普通 Pod 一旦被創(chuàng)建,就會(huì)被放入到 etcd 中存儲(chǔ),隨后會(huì)被 Kubernetes Master 調(diào)度到某 個(gè)具體的 Node 上并進(jìn)行綁定,隨后該 Pod 對(duì)應(yīng)的 Node 上的 kubelet 進(jìn)程實(shí)例化成一組相 關(guān)的 Docker 容器并啟動(dòng)起來(lái)。在默認(rèn)情 況下,當(dāng) Pod 里某個(gè)容器停止時(shí),Kubernetes 會(huì) 自動(dòng)檢測(cè)到這個(gè)問(wèn)題并且重新啟動(dòng)這個(gè) Pod 里某所有容器, 如果 Pod 所在的 Node 宕機(jī), 則會(huì)將這個(gè) Node 上的所有 Pod 重新調(diào)度到其它節(jié)點(diǎn)上。
(2)靜態(tài) Pod
靜態(tài) Pod 是由 kubelet 進(jìn)行管理的僅存在于特定 Node 上的 Pod,它們不能通過(guò) API Server 進(jìn)行管理,無(wú)法與 ReplicationController、Deployment 或 DaemonSet 進(jìn)行關(guān)聯(lián),并且 kubelet 也無(wú)法對(duì)它們進(jìn)行健康檢查。
4、Pod存在的意義
一個(gè)Pod可以存入多個(gè)容器,咱們就拿docker來(lái)說(shuō),docker是建議一個(gè)容器只是只是運(yùn)行一個(gè)應(yīng)用程序,pod是以多進(jìn)程設(shè)計(jì)的,可以將依賴度比較高的兩個(gè)容器放入同一個(gè)pod(例如一個(gè)微服務(wù)項(xiàng)目調(diào)用了mysql數(shù)據(jù)庫(kù),微服務(wù)和mysql數(shù)據(jù)庫(kù)這兩個(gè)容器放入同一個(gè)pod),因?yàn)閜od內(nèi)網(wǎng)絡(luò)共享,這樣微服務(wù)連接mysql就像連接本地?cái)?shù)據(jù)一樣,減少網(wǎng)絡(luò)IO等提高調(diào)用效率。
5、生命周期和重啟策略
(1)Pod 的狀態(tài)
狀態(tài) | 描述 |
Pending | Api-server已創(chuàng)建改pod,但是pod中一個(gè)或者多個(gè)容器的鏡像還未創(chuàng)建,包括鏡像下載過(guò)程 |
Running | pod內(nèi)所有容器已創(chuàng)建,且至少一個(gè)容器處于運(yùn)行狀態(tài)、正在啟動(dòng)或者重啟狀態(tài) |
Completed | pod內(nèi)所有容器均成功執(zhí)行退出,且不會(huì)重啟 |
Failed | pod內(nèi)所有容器均已退出,但至少一個(gè)容器退出失敗 |
Unknown | 由于某種原因無(wú)法獲取pod狀態(tài),例如網(wǎng)絡(luò)不通暢 |
(2)Pod 重啟策略
Pod 的重啟策略包括 Always、OnFailure 和 Never,默認(rèn)值是 Always
策略 | 描述 |
Always | 當(dāng)容器失效時(shí),由kubelet自動(dòng)重啟該容器 |
OnFailure | 當(dāng)容器終止運(yùn)行且運(yùn)行代碼不為0,,由kubelet自動(dòng)重啟該容器 |
Never | 不論容器運(yùn)行狀態(tài)如何,kubelet都不會(huì)重啟該容器 |
(3)常見(jiàn)狀態(tài)轉(zhuǎn)換
Pod包含的容器數(shù) | Pod當(dāng)前狀態(tài) | 發(fā)生事件 | Pod結(jié)果狀態(tài) | ||
RestartPolicy=Always | OnFailure | Never | |||
1個(gè)容器 | Running | 容器成功退出 | Running | Succeeded | Succeeded |
1個(gè)容器 | Running | 容器失敗退出 | Running | Running | Failure |
2個(gè)容器 | Running | 1個(gè)容器失敗退出 | Running | Running | Running |
2個(gè)容器 | Running | 容器被OOM殺掉 | Running | Running | Failure |