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