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 類型