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


Pod概念及網絡通訊方式

 

什么是Pod?

Pod是Kubernetes的最小單元。

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

Pod是邏輯主機,一個Pod中的所有的容器都運行在同一個邏輯機器上,其他Pod中的容器,即使運行在用一個工作節點上,也會出現在不同的節點上。即一個Pod包含多個容器時,那些容器總是運行在同一個工作節點上,一個Pod決不能跨多個工作節點

例如:

 

 

Pod和容器概念的區分

為什么k8s會使用Pod為最小單元,而不是Docker容器

1、更利於擴展

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

 

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

如果沒有Pod,我們直接使用一組容器去跑一個業務,那么其中一個或若干個容器出現問題,我們如何去定義這一組容器的狀態呢?通過Pod我們就很容易解決,一組業務容器跑在同一個Pod中,這個Pod會有一個pause容器,這個容器跟其他的業務容器都沒有關系,以這個pause容器狀態來代表Pod的狀態。

 

3、利用容器間文件共享,以及通信

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

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

 

Pod的類型

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

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

 

控制器類型及作用

1、ReplicationController

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

 

2、ReplicaSet

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

 

3、Deployment(推薦)

雖然ReplicaSet可以獨立使用,但一般還是建議使用Deployment來自動管理ReplicaSet,這樣就無需擔心跟其他機制的不兼容問題(比如ReplicaSet不支持rolling-update滾動更新但Deployment支持)

典型的應用場景包括:

   定義Deployment來創建Pod和ReplicaSet

   滾動升級和回滾應用

   擴容和縮容

   暫停和繼續Deployment

   滾動更新流程

 

 

4、HPA(HorizontalPodAutoScale)

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

 

5、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)

 

6、DaemonSet

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

典型用法:

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

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

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

 

7、Job、Cron Job(類似於Linux的at和crontab)

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

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

  在給定時間點僅運行一次

  周期性的給定時間點運行

 

不同情況下網絡通信方式

1、同一個Pod內部通訊:

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

 

2、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

 

3、Pod至Service的網絡

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

 

4、Pod到外網

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

 

5、外網訪問Pod

>> 通過Service網絡,nodeport 類型


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM