一.Calico介紹
Calico是一種容器之間互通的網絡方案,在虛擬化平台中,比如OpenStack、Docker等都需要實現workloads之間互連,但同時也需要對容器做隔離控制,就像在Internet中的服務僅開放80端口、公有雲的多租戶一樣,提供隔離和管控機制。而在多數的虛擬化平台實現中,通常都使用二層隔離技術來實現容器的網絡,這些二層技術有一些弊端,比如需要依賴VLAN、Bridge和隧道技術。其中Bridge帶來了復雜性,Vlan隔離和Tunnel隧道則消耗等多的資源並對物理環境有要求。隨着網絡規模的增大,整體會變得更加復雜。我們嘗試把Host當做Internet中的路由器,使用BGP同步路由,並使用Iptables來做安全訪問策略,最終設計出了Calico方案。
設計思想:Calico不使用隧道或者NAT來實現轉發,而是巧妙的把所有二三層流量轉換成三層流量,並通過host上路由配置完成跨host轉發。
二.Calico優勢
- 更優的資源利用
二層網絡通訊需要依賴廣播消息機制,廣播消息的開銷與host的數量呈指數級增長,Calico使用的三層路由方法,則完全抑制了二層廣播,減少了資源開銷。此外,二層網絡使用Vlan隔離技術,天生有4096個規格限制,即便可以使用Vxlan解決,但Vxlan又帶來了隧道開銷的問題。Calico不使用vlan或者vxlan技術,使資源利用率更高。 - 可擴展性
Calico使用與Internet類似的方案,Internet的網絡比任何數據中心都大,Calico同樣天然具有擴展性。 - 簡單更容易調試
由於沒有隧道,意味着workloads之間路徑更短,配置更少,在host之間更容易進行debug調試。 - 更少的依賴
Calico僅依賴三層路由可達 - 可適配性
Calico較少的依賴性使它能適配所有的VM、Container、白盒或者混合環境場景。
三.Calico架構
Calico架構如下:
架構特點:由於Calico是一種純三層的實現,因此可以避免與二層方案相關的數據包封裝的操作,中間沒有任何的NAT,沒有任何的overlay,所以它的轉發效率可能是所有方案中最高的,因為它的包直接走原生TCP/IP的協議棧,它的隔離也因為這個棧而變得好做。因為TCP/IP的協議棧提供了一整套的防火牆的規則,所以它可以通過IPTABLES的規則達到比較復雜的隔離邏輯。
Calico網絡模型主要工作組件:
1、Felix:運行在每一台host的agent進程,主要負責網絡接口管理和監聽、路由、ARP管理、ACL管理和同步、狀態上報等。Felix會監聽Etcd中心的存儲,從它獲取事件,比如說用戶在這台機器上加了一個IP,或者是創建了一個容器等,用戶創建Pod后,Felix負責將其網卡、IP、MAC都設置好,然后在內核的路由表里面寫一條,注明這個IP應該到這張網卡。同樣,用戶如果制定了隔離策略,Felix同樣會將該策略創建到ACL中,以實現隔離。
2、Etcd:分布式鍵值存儲,主要負責網絡元數據一致性,確保Calico網絡狀態的准確性,可以與Kubernetes共用。
3、BGP Client(BIRD):Calico為每一台host部署一個BGP Client,使用BIRD實現,BIRD是一個單獨的持續發展的項目,實現了眾多動態路由協議比如:BGP、OSPF、RIP等。在Calico的角色是監聽Host上由Felix注入的路由信息,然后通過BGP協議廣播告訴剩余Host節點,從而實現網絡互通。BIRD是一個標准的路由程序,它會從內核里面獲取哪一些IP的路由發生了變化,然后通過標准BGP的路由協議擴散到整個其他的宿主機上,讓外界都知道這個IP在這里,你們路由的時候得到這里來。
4、BGP Route Reflector:在大型網絡規模中,如果僅僅使用BGP Client形成mesh全網互聯的方案就會導致規模限制,因為所有節點之間兩兩互連,需要N^2個連接,為了解決這個規模問題,可以采用BGP的Route Reflector的方法,使所有BGP Client僅與特定RR節點互連並做路由同步,從而大大減少連接數。
四. Calico兩種網絡模式
Calico網絡Node之間包含兩種網絡模式:
- IPIP
- BGP
下面對這兩種網絡模式進行具體說明。
2.1 IPIP
從字面上理解,就是把一個IP數據包又套在一個IP包里,即把IP層封裝到IP層的一個Tunnel。它的作用其實基本上就相當於一個基於IP層的網橋。一般來說,普通的網橋是基於MAC層的,不需要IP,而這個IP則是通過兩端的路由做一個Tunnel,把兩個本來不通的網絡通過點對點連接起來。
顧名思義,IPIP網絡就是將IP網絡封裝在IP網絡里。IPIP網絡的特點是所有pod的數據流量都從隧道tunl0發送,並且在tunl0這增加了一層傳輸層的封包。
2.2 BGP
邊界網關協議(Border Gateway Protocol, BGP)是互聯網上一個核心的去中心化自治路由協議。它通過維護IP路由表或‘前綴’表來實現自治系統(AS)之間的可達性,屬於矢量路由協議。BGP不使用傳統的內部網關協議(IGP)的指標,而使用基於路徑、網絡策略或規則集來決定路由。因此,它更適合被稱為矢量性協議,而不是路由協議。BGP,通俗的講就是講接入到機房的多條線路(如電信、聯通、移動等)融合為一體,實現多線單IP,BGP 機房的優點:服務器只需要設置一個IP地址,最佳訪問路由是由網絡上的骨干路由器根據路由跳數與其它技術指標來確定的,不會占用服務器的任何系統。
2.3 兩種網絡對比
IPIP網絡:
流量:tunl0設備封裝數據,形成隧道,承載流量
適用網絡類型:適用於互相訪問的Pod不在同一個網段中,跨網段訪問的場景,外層封裝的IP能夠解決跨網段的路由問題。
效率:流量需要tunl0設備封裝,效率略低
BGP網絡:
流量:使用路由信息導向流量
使用網絡類型:適用於互相訪問的Pod在同一個網段。
效率:原生hostGW,效率高
五.存在問題
1.缺點租戶隔離問題
Calico 的三層方案是直接在 host 上進行路由尋址,那么對於多租戶如果使用同一個 CIDR 網絡就面臨着地址沖突的問題。
2.路由規模問題
通過路由規則可以看出,路由規模和 pod 分布有關,如果 pod離散分布在 host 集群中,勢必會產生較多的路由項。
3.iptables規則規模問題
1台Host上可能虛擬化十幾或幾十個容器實例,過多的 iptables 規則造成復雜性和不可調試性,同時也存在性能損耗。
4.跨子網時的網關路由問題
當對端網絡不為二層可達時,需要通過三層路由機時,需要網關支持自定義路由配置,即 pod 的目的地址為本網段的網關地址,再由網關進行跨三層轉發。
參考鏈接:https://www.cnblogs.com/goldsunshine/p/10701242.html (文章對ipip和bgp兩種模式進行了詳細的測試,具體可以轉入原鏈接參考)