1. 程式人生 > >kubernetes網路之---Calico原理解讀

kubernetes網路之---Calico原理解讀

Calico簡單簡介

Calico是一個純三層的協議,為OpenStack虛機和Docker容器提供多主機間通訊。Calico不使用重疊網路比如flannel和libnetwork重疊網路驅動,
它是一個純三層的方法,使用虛擬路由代替虛擬交換,每一臺虛擬路由通過BGP協議傳播可達資訊(路由)到剩餘資料中心。

 

Calico 架構

Calico 是一個三層的資料中心網路方案,而且方便整合 OpenStack 這種 IaaS 雲架構,能夠提供高效可控的 VM、容器、裸機之間的通訊。

Bluemix.png

結合上面這張圖,我們來過一遍 Calico 的核心元件:
 
Felix,Calico agent,跑在每臺需要執行 workload 的節點上,主要負責配置路由及 ACLs 等資訊來確保 endpoint 的連通狀態;
 
etcd,分散式鍵值儲存,主要負責網路元資料一致性,確保 Calico 網路狀態的準確性;
 
BGP Client(BIRD), 主要負責把 Felix 寫入 kernel 的路由資訊分發到當前 Calico 網路,確保 workload 間的通訊的有效性;
 
BGP Route Reflector(BIRD), 大規模部署時使用,摒棄所有節點互聯的 mesh 模式,通過一個或者多個BGP Route Reflector來完成集中式的路由分發;
 
通過將整個網際網路的可擴充套件 IP 網路原則壓縮到資料中心級別,Calico 在每一個計算節點利用Linux kernel實現了一個高效的vRouter來負責資料轉發而每個vRouter通過BGP
協議負責把自己上執行的 workload 的路由資訊像整個 Calico 網路內傳播 - 小規模部署可以直接互聯,大規模下可通過指定的
BGP route reflector 來完成。
 
這樣保證最終所有的 workload 之間的資料流量都是通過 IP 包的方式完成互聯的。

 

Calico原理

11.png

Calico 節點組網可以直接利用資料中心的網路結構(支援 L2 或者 L3),不需要額外的 NAT,隧道或者 VXLAN overlay network。

Bluemix.png

 

如上圖所示,這樣保證這個方案的簡單可控,而且沒有封包解包,節約 CPU 計算資源的同時,提高了整個網路的效能。

此外,Calico 基於 iptables 還提供了豐富而靈活的網路 policy, 保證通過各個節點上的 ACLs 來提供 workload 的多租戶隔離、安全組以及其他可達性限制等功能。

11.png

Bluemix.png

 

calico網路通訊模型

calico是純三層的SDN 實現,它基於BPG 協議和Linux自身的路由轉發機制,不依賴特殊硬體,容器通訊也不依賴iptables NAT或Tunnel 等技術。
能夠方便的部署在物理伺服器、虛擬機器(如 OpenStack)或者容器環境下。同時calico自帶的基於iptables的ACL管理元件非常靈活,能夠滿足比較複雜的安全隔離需求。
 
在主機網路拓撲的組織上,calico的理念與weave類似,都是在主機上啟動虛擬機器路由器,將每個主機作為路由器使用,組成互聯互通的網路拓撲。當安裝了calico的主機組成集群后,
其拓撲如下圖所示:

11.png

每個主機上都部署了calico/node作為虛擬路由器,並且可以通過calico將宿主機組織成任意的拓撲叢集。當叢集中的容器需要與外界通訊時,
就可以通過BGP協議將閘道器物理路由器加入到叢集中,使外界可以直接訪問容器IP,而不需要做任何NAT之類的複雜操作。
 
當容器通過calico進行跨主機通訊時,其網路通訊模型如下圖所示:

Bluemix.png

從上圖可以看出,當容器建立時,calico為容器生成veth pair,一端作為容器網絡卡加入到容器的網路名稱空間,並設定IP和掩碼,一端直接暴露在宿主機上,
並通過設定路由規則,將容器IP暴露到宿主機的通訊路由上。於此同時,calico為每個主機分配了一段子網作為容器可分配的IP範圍,這樣就可以根據子網的
CIDR為每個主機生成比較固定的路由規則。
 
當容器需要跨主機通訊時,主要經過下面的簡單步驟:
1)容器流量通過veth pair到達宿主機的網路名稱空間上。
2)根據容器要訪問的IP所在的子網CIDR和主機上的路由規則,找到下一跳要到達的宿主機IP。
3)流量到達下一跳的宿主機後,根據當前宿主機上的路由規則,直接到達對端容器的veth pair插在宿主機的一端,最終進入容器。
 
從上面的通訊過程來看,跨主機通訊時,整個通訊路徑完全沒有使用NAT或者UDP封裝,效能上的損耗確實比較低。但正式由於calico的通訊機制是完全基於三層的,這種機制也帶來了一些缺陷,例如:
1)calico目前只支援TCP、UDP、ICMP、ICMPv6協議,如果使用其他四層協議(例如NetBIOS協議),建議使用weave、原生overlay等其他overlay網路實現。
2)基於三層實現通訊,在二層上沒有任何加密包裝,因此只能在私有的可靠網路上使用。
3)流量隔離基於iptables實現,並且從etcd中獲取需要生成的隔離規則,有一些效能上的隱患。