Calico 為大規模集群以及云環境的節點提供了 end-to-end 的網絡互聯。為此,calico 需要一個物理層的互聯架構。?
大多數情況下, 以太網架構是最合適的。但是對于已有的三層架構,可能會對 calico 造成影響。?
由于Calico本身就是路由基礎設施,因此在運行Calico時使用IP路由互連結構需要考慮更多的工程,架構和操作注意事項。 我們將簡要介紹這篇文章的其余部分。 也就是說,Calico可同時在以太網或IP互連架構上保持良好運行。
背景知識
Calico架構基本概覽
有關calico 架構的詳述可以在?architectural overview?中找到。?
在 calico 中,計算節點充當了路由器的角色。它們為運行在本機上的容器或是虛擬機提供路由。因此我們稱之為?vRouter。Linux Kernel 負責數據數據包路由, 通過BPG協議來控制路由分發, calico agent?Flelix?來管理路由信息。
處于節點上的 Endpoint 只能同本節點?vRouter?通信, calico 中,數據包的第一條和最后一條都是通過?vRouter?中路由規則來實現。vRouter?間通過BGP協議來同步節點上的 Endpoint 信息
Overview of current common IP scale-out fabric architectures
對于可橫向擴展的集群,有兩種方式構建IP架構。然而, 迄今為止,這兩種方案需要當邊界路由器同時負責機架間上行數據交換的時候才ok。在 calico 中,計算節點本身已經集成了該功能。
此外,在絕大多數虛擬化場景中,都會采用 overlay 或者 Nat 的方式來封裝 vm 或者 容器間通信的報文。例如 weave 和 docker 自帶的網絡。
路由架構基于某種形式的IGP。由于IGP網絡的擴展限制(see the?why BGP post?for discussion of this topin), calico 工程小組認為使用IGP協議可能導致 Endpoint 路由無法全部分發到所有節點。但同時使用 IGP 和 BGP 是可行的。其中 IGP 傳遞?vRouter?下一跳路由信息(在 calico 中對應目的計算節點),BGP 用于分發 endpoint 的下一跳路由信息。實際上,這是廣泛分布的IP網絡(比如運營商的骨干網絡)中最常見的做法。由于其設計較為復雜,本文不做詳述。
路由架構完全使用BGP協議。在這種模式下,IP 網絡需要足夠的緊湊才能保障 BGP 協議用于 endpoint 路由信息的分發(如果集群太大,會導致同步時間過長)。同時?vRouter?間的路由也會被所有節點所掌握。本文將會重點介紹這個方案。
構建一個 BGP-only 的通信架構有多種方案。主要關注三種實現方案,其中每個方式又包含2個變體。
兩種變體如下:?
1. 第一種BGP架構:每個TOR交換機(包括交換機下附屬的服務器)是一個獨立的?Autonomous System(AS). 各個TOR交換機之間通過 leaf/spine 架構中的?spine switch?交換設備通信(如下圖),或者通過一系列的?spine swtiches。同樣,每個?spine switch?是獨立的 AS。 我們將其稱之為每個?AS per rack model?。 該模型在?IETF working group draft?中有詳細介紹?
2. 第二種BGP架構:每個計算節點都是獨立的AS,TOR 交換機實現AS間通信。我們將其稱之為?AS per server model
每種方案都包含一個2層或者3層變體。
在第一種架構下(2層),每個?spine switch?提供一個隔離的2層連接平面(個人理解:vlan)來作為 Calico 以太網互聯結構模型。每個 TOR 交換機和每個?spine switch?互連。
另一種架構下(3層),每個?spine switch?看做是一個隔離的 AS,TOR 交換機和?spine switch?BGP對等。在這兩種情況下, TOR 交換機使用 ECMP 實現所有可用?spine switch?的負載均衡。
BGP: Border Gateway Protocol,邊界網管協議
BGP用于在不通的AS 間交換路由信息。當兩個AS需要交換路由信息時,每個AS都必須指定一個運行BGP的節點,來代表AS與其他的AS交換路由信息。這個節點可以是一個主機。但通常是路由器來執行BGP。兩個AS鐘利用BGP交換信息的路由器也被稱為邊界網關(Border Gateway) 或邊界路由器(Border Router)。
由于可能與不同的AS相連,在一個AS內部可能存在多個運行BGP的邊界路由器。同一個AS中的兩個或多個對等實體之間運行的BGP被稱為IBGP(Internal/interior BGP)。歸屬不同的AS的對等實體之間運行的BGP稱為EBGP(External/Exterior BGP)。在AS邊界上與其他AS交換信息的路由器被稱為邊界路由器(Border/edge router)。在互聯網操作系統(Cisco IOS)中,IBGP通告的路由距離為200, 優先級比EBGP和任何內部網關協議(IGP)通告的路由都低。其他的路由器實現中,優先級順序也是EBGP高于IGP,而IGP又高于IBGP。
BGP屬于外部網關路由協議,可以實現AS間無環路的域間路由。BGP是溝通Internet 廣域網的主要路由協議,例如不同省份、不同國家之間的路由大多要依靠BGP協議。BGP可分為IBGP和EBGP.BGP的鄰居關系(或稱為通信對端/對等實體)是通過人工配置實現的,對等實體之間通過TCP(179端口)會話交互數據。BGP路由器會周期地發送19字節的?keep-alive?消息來維護連接(默認周期為30s)。在路由協議中,只有BGP使用TCP作為傳輸層協議。
ECMP: 等價路由
ECMP存在多條不同鏈路到達同一目的地址的網絡環境中,如果使用傳統的路由技術,發往該目的地址的數據包只能利用其中的一條鏈路,其它鏈路處于備份狀態或無效狀態,并且在動態路由環境下相互的切換需要一定時間,而等值多路徑路由協議可以在該網絡環境下同時使用多條鏈路,不僅增加了傳輸帶寬,并且可以無時延無丟包地備份失效鏈路的數據傳輸。
ECMP最大的特點是實現了等值情況下,多路徑負載均衡和鏈路備份的目的,在靜態路由和OSPF中基本上都支持ECMP功能。
但是實際情況是,各路徑的帶寬、時延和可靠性等不一樣,把Cost認可成一樣,不能很好地利用帶寬,尤其在路徑間差異大時,效果會非常不理想。例如,路由器兩個出口,兩路徑,一個帶寬是100M,一個是2M,如果部署是ECMP,則網絡總帶寬只能達到4M的利用率。
Some BGP network design considerations
同主流的意見相比,BGP 實際上是個相對簡單的協議。eg. BGP 在 calico 節點上的配置大約只有6行(除去注釋)。只是BGP的使用方式會讓人感覺很復雜。許多BGP使用場景都涉及到了復雜的策略規則,用來滿足技術需求(比如商業,金融等)。Calico 默認不考慮這些復雜的需求,因此相當簡潔。
也就是說,在設計 Calico 節點網絡時只需要記住少數幾條設計原則即可。這些設計要求可以被移植,如果有必要,但是這樣做會使設計人員脫離標準的BGP封裝,只能由一個對高級BGP設計非常熟悉的實現者來完成。
注意事項:
AS 連續性
或者叫做AS混拌(pudding),在一個AS內任何一個路由器都必須能夠直接訪問同一個AS內的其他任何路由器而不需過境其他AS系統。
下一跳行為
默認情況下,對于位于同一AS下的對等實體,BGP路由器不會改變下一跳路由。反之也成立, 對等實體處于其它AS,BGP路由器會重設自己的下一跳路由。
路由反射?
位于同一AS下的所有BGP 路由器彼此對等,這種行為又稱為?complete BGP mesh(IBGP全連接)。當路由器數量擴張時,這種全網狀的連接就會產生問題。Router reflection?可以減輕全網連接的負載。當然,?route reflection也需要做擴容考慮。
路由反射器
提供了在大型IBGP實現中IBGP全網狀連接問題的一個簡單解決方案。為保證IBGP對等體之間的連通性,需要在IBGP對等體之間建立全連接關系。假設在一個AS內部有n臺路由器,那么應該建立的IBGP連接數就為n(n-1)/2。當IBGP對等體數目很多時,對網絡資源和CPU資源的消耗都很大。
利用路由反射可以解決這一問題。在一個AS內,其中一臺路由器作為路由反射器RR(Route Reflector),其它路由器作為客戶機(Client)與路由反射器之間建立IBGP連接。路由反射器在客戶機之間傳遞(反射)路由信息,而客戶機之間不需要建立BGP連接。
端點
在 Calico 網絡中,每個Endpoint都對應一條路由。 硬件網絡平臺有學習路由數量的限制,一般在 10,000 ~ 100,000 條之間。路由聚合是個辦法,但這通常取決于編排軟件(例如OpenStack)使用的調度程序的功能。
每個機架作為一個AS
將一個機架看做一個AS(一般TOR交換機和連接該交換機的服務器位于同一個機架上)。這種模式最接近?IETF’s Routing Area Working Group draft on BGP use in data centers.?中給出的建議。
正如之前所提到的,這種方案有兩個變種,一個使用一組二層平面,平面間節點通過 TOR 交換機通信,另外一種則使用三層平面,通過Spine switch?通信。
上圖展示了每機架作為一個AS模型,這里ToR交換機通過以太網交換平面形成了一個物理網格
This diagram shows the?AS per rack model?where the ToR switches are physically meshed via a set of discrete BGP spine routers, each in their own AS.
在這種方案里,每個Tor 交換機到Tor 交換機或者TOR交換機到?spine switch?的鏈路是EBGP對等的。那就意味著北向 tor 交換機無法使用?RR(Route Reflector)。
如果使用了2層的方式,結果就是每個Tor 交換機之間必須彼此對等(可能有上百個對等),可能會造成負載過重。
如果使用3層的方式,那么每個TOR 交換機只需要和上級的?spine switch?對等即可。雖然spine switch?下會有許多TOR 交換機,可以使用RR(如上圖所示),而且絕大部分spine switch擁有比TOR交換機更好的平面控制能力,在多數環境下更易擴展。
兩者的配置基本相同,只是在TOR 交換機的北向配置上有些差異。
TOR 交換機,作為EBGP router 會獲取其他TOR switch 以及數據中心上的路由,重新分配到該AS下的每個計算節點上。并且會將自身AS內的所有路由信息向外通告。這就意味著,每個計算節點會將該AS內的TOR 交換機視為到外部路由的下一跳。外部路由到該AS的下一跳則是該AS下的某臺計算節點
The ToR, as the eBGP router redistributes all of the routes from other ToRs as well as routes external to the data center to the compute servers that are in its AS, and announces all of the routes from within the AS (rack) to the other ToRs and the larger world. This means that each compute server will see the ToR as the next hop for all external routes, and the individual compute servers are the next hop for all routes external to the rack.
每臺服務器作為一個AS
這種模式的概念同?The AS per rack?類似。在早期的?IETF draft?中,整個架構的路由和匯聚都由TOR發起。在 Calico 中,那么路由和匯聚的起始點為各計算節點。如果TOR為3層的路由器,也只能作為2機的路由和匯聚點。
因此,順著架構往下分析,計算節點會作為AS的邊界router。同?The AS per rack?的差異可從下面2張圖體現。
This diagram shows the?AS per compute server model?where the ToR switches are physically meshed via a set of Ethernet switching planes.
This diagram shows the?AS per compute server model?where the ToR switches are physically connected to a set of independent routing planes.
從上圖不難發現,TOR 和?spine swtich?和?AS per rack?模式中一樣。真正的不同在于,計算節點和TOR處于不同的AS中。為了擴展集群,需要使用4字節的AS編號(RFC 4893). 如果不使用4字節的AS編號(默認2字節),那么calico 平面中的TOR 和計算節點大約只有5000左右的私有AS編號可使用。如果采用了4字節,則會有接近92,000000私有AS編號可用。
4字節AS*
AS (Autonomous System number,自治域系統號)是指擁有同一選路策略,在同一技術管理部門下運行的一組路由器的集合。BGP的RFC1771里留給AS的范圍是2個字節,所以AS的取值范圍為1-65535,其中64512以上的為私有AS。由于BGP在鄰居協商以及路由發送接受的時候都需要使用AS屬性, 鑒于IPv4地址空間不夠這個前車之鑒,在RFC4893里定義了一個BGP的新功能——4字節AS(BGP Support for Four-octet AS Number,一般用M.N來描述)。
還有個差異,就是在per AS Compute Server?模式中沒有?RR(Router Reflector)。所有設備都是EBGP對等的。當同一機架下的兩個計算節點之間需要通信時,會通過TOR來路由。
可以將這種模式看做The AS per rack?的縮影。
最后一種模式會顯得有些不同。在上面介紹的架構中,路由器需要收集機構中所有的路由表,并使他們的AS路徑保持原樣。這種模式在路由階段將AS號移除。
This is to prevent routes from other nodes in the network from not being installed due to it coming from the local AS (since they share the source and dest of the route share the same AS).
不會翻 ╮(╯▽╰)╭
In this diagram, we are showing that all Calico nodes share the same AS number, as do all ToR switches. However, those ASs are different (A1 is not the same network as A2, even though the both share the same AS number A ).
所有TOR使用一個AS,結算節點使用另一個AS的做法簡化了部署(使用標準配置即可),帶來的好處就是簡化了TOR中的路由表。
這種模式下,每個 Router 都向上級節點匯報自己的路由信息(vRouter?–> TOR –>?spine switch)。however, 作為回應,上級節點僅僅返回一條默認路由。在這種情況下,vRouter?只有本機Endpoint的路由以及到TOR的默認路由。同樣,對于TOR來說只有到直連vRouter和spine switch的路由。即使我們一個機架下有80臺計算節點,每個計算節點上有200個Endpoint, 那在TOR上也就16000條記錄左右。(大多數交換機都能達到這個數目)
由于路由下發默認是由 spine 發起的,所以下游的AS接受者無法下發路由,這就避免了AS的干擾問題。
原文:?
Since the default is originatedby the Spine (originally) there is no chance for a downward announced route to originate from the recipient’s AS, preventing the AS puddling problem.
這種模式下,有個主要的缺點:非法目的地址(eg. 目的地址不存在)的流量都會被送往spine switch。
值得注意的是,spine switch會收集 calico 網絡中所有的路由條目。這種模式并不會使spine switch?中的路由條目比原來更多,但卻著實減少了TOR上的路由信息。同時也減少了vRouter上的路由信息。但這并不是關注的重點,因為Calico中的完整路由表所消耗的內存量是現代計算服務器上可用總內存的一部分。
如果TOR和SPINE可以容納所產生的路由條目,Calico 團隊建議使用?AS per rack?模式。記得考慮后期擴容問題。
如果擔心TOR交換機路由表大小,Calico 團隊建議使用?Downward default?模式。
如果對TOR路由表大小不放心,以及希望運行非常簡單的2層架構來連接Calico節點,則考慮上文介紹的Ethernet fabric(2層平面模式)。
如果Calico用戶對每個計算節點一個AS的模式感興趣,則Project Calico團隊將非常有興趣討論該模型的部署。