白話flannel和calico網路原理
今天看了一些K8S容器虛擬化網路的部落格,對網路外掛的原理有了一些新的認識,在這裡記錄下來。
概括
容器虛擬化網路方案,總體分為2種截然不同的發展路線:
- 基於隧道
- 基於路由
下面分別說一下這兩種思路的原理,以及和flannel、calico的關係。
基於隧道
隧道方案最具普適性,在任何網路環境下都可以正常工作,這與它的原理密不可分。
最常見的隧道方案是flannel vxlan模式,以及calico的ipip模式,其核心原理包含了2個部分。
分配網段
每臺宿主機上都有網路外掛的agent程序,它們連線到etcd集中式儲存,從虛擬IP池中申請一個IP段佔位己有。
宿主機上每個容器則從IP段中分配得到1個虛擬IP。
封裝/解封
當不同宿主機上的容器互相訪問時,資料包的源IP和目標IP都是容器IP。
資料包經過宿主機的agent程序進行封裝後,新資料包的源IP和目標IP則變成了兩端宿主機的物理IP。
資料包送到目標宿主機後,經過agent解封后得到原始資料包,並將資料包送入容器中處理,這就給兩端容器營造了一種互通的感覺。
因為物理IP屬於3層網路,可以在網際網路中經過中間路由裝置互相送達,所以隧道方案對宿主機之間的網路環境沒有特殊要求,因此隧道方案具備普適性。
優勢/劣勢
優勢就是對物理網路環境沒有特殊要求,只要宿主機IP層可以路由互通即可。
劣勢就是效能差,這需要從2方面看:
- 封包和解包耗費CPU效能
- 額外的封裝導致頻寬浪費,大約有30%左右的頻寬損耗
flannel vxlan和calico ipip模式都是隧道方案,但是calico的封裝協議IPIP的header更小,所以效能比flannel vxlan要好一點點。
基於路由
路由方案效能最好,原因是該方案不需要封包和解包,所以沒有隧道方案的劣勢,網路效能很好。
常見的路由方案包括了flannel的host-gw模式,以及calico的bgp模式。
下面以calico bpg模式為例,分析基於路由的方案原理,其包含了3個部分。
分配網段
每臺宿主機也有agent,會從etcd中的虛擬IP池分配到一個IP子網段。
宿主機上每個容器則從該IP段中分配得到1個虛擬IP。
本地路由
假設我們在宿主機A上新建了一個容器,則該容器分配了一個虛擬IP,我們假設它是值是k。
agent會在本機配置一條路由規則,即:如果資料包的目標地址等於k,那麼把資料包送到容器的虛擬網絡卡上。
另外一臺宿主機B上的一個容器,其IP是m,向k容器發資料包,則資料包的目標地址是k,原地址是m。
既然路由方案是不使用隧道封包為物理IP在網路中流通的,那麼該資料包又該如何送達到虛擬IP k呢?
廣播路由
路由方案會採用如下的手段,搞定m到k的虛擬IP互通問題。
即宿主機A會通過某種方式(比如BGP廣播協議)把自己的虛擬IP網段廣播給宿主機B。
在宿主機B收到廣播後,會給本機配置一條路由規則:如果資料包的目標地址屬於宿主機A的虛擬IP網段,則把該資料包發給宿主機A的物理IP。
這條路由規則相當於為宿主機A的虛擬IP網段配置了轉發閘道器,而這個閘道器就是宿主機A的物理IP。
這就要求,宿主機B和宿主機A在2層網路是互通的,也就是它們在一個交換機下面,可以基於MAC地址直接互通。
一旦該資料包被送往宿主機A的物理IP,則宿主機A就可以應用剛才講過的” 本地路由 “規則了,即:資料包的目標IP是k,直接送給對應容器的虛擬網絡卡。
我們發現,整個過程中從m發往k的資料包採用的都是虛擬容器IP,沒有經過任何封裝和解封,而僅僅是通過宿主機A的本地路由+宿主機B收到的廣播路由,就 實現了在2層網路互通環境下的高效通訊 。
優勢/劣勢
優勢就是沒有封包和解包過程,完全基於兩端宿主機的路由表進行轉發。
劣勢包含2方面:
- 要求宿主機處於同一個2層網路下,也就是連在一臺交換機上,這樣才能基於MAC通訊,而不需要在IP上動封包/解包的手腳。
- 路由表膨脹導致效能降低,因為宿主機上每個容器需要在本機新增一條路由規則,而不同宿主機之間需要廣播自己的網段路由規則。
參考資料:
博主無私的分享著知識,你願意送他一頓熱騰騰的早餐嗎?
