Kubernetes-2:Pod(k8s最小單元)概念及網絡通信方式

Pod概念及網絡通信方式node

 

什麼是Pod?docker

Pod是Kubernetes的最小單元。網絡

一個Pod是一組緊密相關的容器,是一塊兒運行在同一個工做節點上,以及同一個Linux命名空間中。每一個Pod就像是一個獨立的邏輯機器,擁有本身的IP、主機名、進程等,運行一個獨立的應用程序。less

Pod是邏輯主機,一個Pod中的全部的容器都運行在同一個邏輯機器上,其餘Pod中的容器,即便運行在用一個工做節點上,也會出如今不一樣的節點上。即一個Pod包含多個容器時,那些容器老是運行在同一個工做節點上,一個Pod決不能跨多個工做節點性能

例如:spa

 

 

Pod和容器概念的區分設計

爲何k8s會使用Pod爲最小單元,而不是Docker容器日誌

一、更利於擴展blog

k8s不只僅支持Docker容器,也支持rkt甚至用戶自定義容器。Kubernetes不依賴於底層某一種具體的規則去實現容器技術,而是經過CRI這個抽象層操做容器,這樣就會須要Pod這樣一個東西,Pod內部再管理多個業務上緊密相關的用戶業務容器,就會更有利用業務擴展Pod而不是容器。進程

 

二、更容易定義一組容器的狀態

若是沒有Pod,咱們直接使用一組容器去跑一個業務,那麼其中一個或若干個容器出現問題,咱們如何去定義這一組容器的狀態呢?經過Pod咱們就很容易解決,一組業務容器跑在同一個Pod中,這個Pod會有一個pause容器,這個容器跟其餘的業務容器都沒有關係,以這個pause容器狀態來表明Pod的狀態。

 

三、利用容器間文件共享,以及通訊

pause容器有一個IP地址和一個存儲卷Pod中的其餘容器共享pause容器的IP地址和存儲,這樣就達到了文件共享和通訊。

Pod與容器的區別:Pod是指一組容器,能夠指多個或一個,容器只能表明一個。

 

Pod的類型

 自主式Pod:指定調度到某節點,如節點down,Pod沒法自動恢復

 控制器管理的Pod:諸多控制器類型,看下邊詳解

 

控制器類型及做用

一、ReplicationController

用來確保容器應用的副本數始終保持在用戶定義的副本數,即若是有容器異常退出,會自動建立新的Pod來代替;而若是異常多出來的容易也會自動回收。在新版本的k8s中建議使用ReplicaSet來代替它

 

二、ReplicaSet

其跟ReplicationController沒有什麼本質區別,只是名字不同,而且ReplicaSet支持集合式的selector(支持根據條件批量刪除或建立)

 

三、Deployment(推薦)

雖然ReplicaSet能夠獨立使用,但通常仍是建議使用Deployment來自動管理ReplicaSet,這樣就無需擔憂跟其餘機制的不兼容問題(好比ReplicaSet不支持rolling-update滾動更新但Deployment支持)

典型的應用場景包括:

   定義Deployment來建立Pod和ReplicaSet

   滾動升級和回滾應用

   擴容和縮容

   暫停和繼續Deployment

   滾動更新流程

 

 

四、HPA(HorizontalPodAutoScale)

Horizontal Pod AutoScaling 僅適用於Depolyment和ReplicaSet,在V1版本中僅支持根據Pod的CPU利用率擴縮容,在vlalpha版本中,支持根據內存和用戶自定義的metric擴縮容

 

五、StatefullSet

StatefullSet是爲了解決有狀態服務的問題(對應Depolyment和ReplicaSets是爲無狀態服務而設計),其應用場景包括:

  穩定的持久化儲存,即Pod從新調度後還能訪問到相同的持久化數據,基於PVC來實現

  穩定的網絡標誌,即Pod從新調度其PodName和HostName不變,基於Headless Service(即沒有Cluster IP 的 Service)來實現

  有序部署,有序擴展,即Pod是有順序的,在部署或者擴展的時候還要依據定義的順序依次進行(即從0到N-1,在下一個Pod運行以前全部的Pod必須都是Running和Ready狀態),基於init containers來實現

  有序收縮,有序刪除(從N-1到0)

 

六、DaemonSet

DaemonSet確保所有(或者一些)Node上運行一個Pod的副本。當有Node加入集羣時,也會爲它們新增一個Pod。當有Node從集羣中移除時,這些Pod也會被回收。刪除DaemonSet會刪除它建立的全部Pod

典型用法:

   運行集羣存儲daemon,例如在每一個Node上運行glusterd、ceph

   在每一個Node上運行日誌收集daemon,例如Logstash、Fluentd

   在每一個Node上運行監控daemon,例如Prometheus Node Exporter

 

七、Job、Cron Job(相似於Linux的at和crontab)

Job負責批處理任務,即僅執行一次任務,它保證批處理任務的一個或多個Pod成功結束

Cron Job管理基於時間的Job,即

  在給定時間點僅運行一次

  週期性的給定時間點運行

 

不一樣狀況下網絡通訊方式

一、同一個Pod內部通信:

>> 同一個Pod共享同一個網絡命名空間(pause容器),同一個Linux協議棧

 

二、Pod1至Pod2

>> Pod1與Pod2不在同一臺主機,Pod的地址是與docker0在同一個網段的,但docker0網段與宿主機網卡是兩個徹底不一樣的IP網段,而且不一樣的Node之間的通訊只能經過宿主機的物理網卡進行,將Pod的IP和所在Node的IP關聯起來,經過這個關聯讓Pod能夠互相訪問,使用的是Flannel網絡規劃服務以下圖:

etcd在Flannel中的做用:

 存儲管理Flannel可分配的IP地址段資源

 監控ETCD中每一個Pod的實際地址,並在內存中創建維護Pod節點路由器

 

>> Pod1與Pod2在同一臺機器中,由docker0網橋直接轉發請求至Pod2

 

三、Pod至Service的網絡

>> 目前基於性能考慮,所有用iptables(舊版本)和LVS(新版本)維護和轉發

 

四、Pod到外網

>> Pod向外網發送請求,查找路由表,轉發數據包到宿主機網卡,宿主機網卡完成路由選擇後,iptables執行Masquerade(SNAT),把源地址更改成宿主機網卡地址,向外網發送請求

 

五、外網訪問Pod

>> 經過Service網絡,nodeport 類型

相關文章
相關標籤/搜索