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