容器雲架構實踐-05

Kubernetes 網絡架構

k8s集群IP概念彙總

IP類型說明Proxy-IP 代理層公網地址IP,外部訪問應用的網關服務器。[實際需要關注的IP] Service-IP Service的固定虛擬IP,Service-IP是內部,外部無法尋址到。 Node-IP 容器宿主機的主機IP。 Container-Bridge-IP 容器網橋(docker0)IP,容器的網絡都需要通過容器網橋轉發。 Pod-IP Pod的IP,等效於Pod中網絡容器的Container-IP。 Container-IP 容器的IP,容器的網絡是個隔離的網絡空間。

k8s網絡模式

k8s只使用橋接模式。Docker服務啟動的時候會創建虛擬網橋docker0,地址資源池為172.17.0.0/16,啟動容器的時候會創建一個Veth設備對,一端關聯到網橋,另一端映射到容器內的eth0設備,然後從網橋的地址段內給eth0接口分配一個IP地址。宿主機IP與容器IP是不同的IP段,默認情況,外部看不到容器IP,對於外部來說容器的IP為內網IP。

k8s網絡場景

Pod網絡

Pod是K8S最小調度單元,它是一組容器的集合,其中的pause容器是負責整個Pod的網絡、存儲等公共命名空間。Pod內的其他容器都是通過localhost進行相互間的通信,外部訪問Pod時也是經由pause管理的。所以pause管理的既是Pod-IP,這個Pod中其他業務容器都是有自己的Container-IP。容器雲的網絡模型是扁平化網絡,Pod作為一個網絡單元是和Kubernetes Node的網絡處於同級的。

容器與容器之間的直接通信

之前也說了在同一個Pod中,容器與容器直接通過localhost進行通信的,究其原因是整個Pod都共用pause容器提供的網絡命名空間。

Pod與Pod之間的通信 - 同Node下

Pod是由Pod-IP的,在同一個Node節點下,Pod間通過Pod-IP進行通信。Pod-IP究其本質是橋接網絡分配的ip,實則走的都是docker-0這個網橋。

Pod與Pod之間的通信 - 不同Node下

在不同的Node節點下,Pod之間的通信需要進行轉發,之所以這樣說是因為,前面我們說過Pod在同一個節點下進行通信是走的docker-0網橋,但是在不同節點下需要跨主機通信。不同節點下跨主機通信,說的直白點就是把不同節點的docker-0連接起來,這裡需要由物理網卡eth0進行一個轉發。這裡需要注意的一點,因為之前每個節點都是相互獨立的,如果要把這些節點都連接到一起,那麼我們所有的pod-ip不可重複,這裡就需要一些網絡組件來幫我們管理。

Pod到Service之間的通信

Service的核心工作就是給Pod間做服務代理,對外提供一個唯一的訪問接口,將請求轉發給Pod,所以說Service的網絡轉發是服務編排中最重要的環節之一。Service會創建一個虛擬IP <service-ip>, Kuberenetes Porxy組件負責實現Service-IP路由和轉發,在容器覆蓋網絡之上又實現了虛擬轉發網絡。/<service-ip>

Kuberenetes Porxy實現了轉發service-ip請求到pod-ip,監控service-ip和pod-ip的變化,實現轉發規則。

集群外部與內部組件之間的通信

這裡是指node和pod間的通信。這裡node擁有node-ip也就是我們常說的宿主機ip,node-ip與pod-ip之間的通信也是service進行管理的。nodePort將node的端口和servie端口進行綁定從而實現node和pod之間的通信。

架構圖

容器雲架構實踐-05

現在在看這個架構圖,我們就可以很清晰的知道各個組件間的網絡通信是如何通信的。其中flannel是跨主機網絡組件,主要功能就是對整個集群中的Pod-IP分配進行規劃,防止ip有衝突。

容器雲架構實踐-05


分享到:


相關文章: