本问讨论了Calico项目的目的,以及探讨了用从上世纪90年代以来发展起来的网络架构,三层网络模型,L2与L3层转发模式,论证了如何基于现有基础,通过采用新兴的“奶牛模式”,来实现云网络架构的可扩展性和高性能。
最近,有很多关于Calico项目的讨论,但是大多数讨论只是围绕着通过把现有互联网基础架构应用到数据中心来实现扩展性和简化网络架构来进行的。
然而,当审视这个项目时,还是有一部分人会用我称之为“经典企业镜头”的方式来进行,这种方式将会对Calico项目带来误解,或者将传统网络模型应用到Calico上。其原因在于Calico是从一个非常不同的视角发展而来的,因此用传统模式来分析它不一定能奏效。
这些误解集中在三点,下面我会逐点展开。在此之前,我还是要指出,在可扩展式架构方法和经典企业架构方法之间还是有哲学基本概念上的差别。
提起经典企业架构方法,一些特质包括:当企业数据中心建设时,系统将会长期运行而且很好地自包含(self-contained);每个应用都会有各自的需求,因此会有非常客制化的架构设计,或者说架构模板会非常多;必须要在增长的复杂度和架构灵活度之间寻找最佳点;因为需求经常是静态的,因此,最佳点基本上需要合理的妥协。
随着可扩展或者云中心架构时代的来临,我们今天采用的架构知识表明:真实的基础架构需求更多时候是统一的(同样的协议,相似的存储模型,相似的计算模式),但也是更加动态和更加扩展化的。这就引出了我们常说的“宠物和奶牛模式”。不幸的是,网络架构还是被当做宠物模式,“被接受”的模式还是试图将正在使用的,脆弱的,静态的设计模式一直到新的,可扩展式的,更少客制化的环境。明显的,向一个脆弱的,静态网络模式注入可扩展性必将带来新的“挑战”。在Calio项目中,我们将在网络上采用更多的“奶牛”模式,实际上,从云中其它模块(可扩展式,非常动态的,单一设计模式)中借鉴驱动 (drivers),从而整合成扩展性很好,可以用于公有云的网络模块。我们相信这是一条通向云、可扩展环境的可选道路,它抛弃了不必要的复杂性,从而带来了动态和扩展性。
真正为大家所知的是Calico是可扩展架构,因此,比overlay方式更有效。但是更重要的是,对于一般的使用场景非常有效,只对必须的场景增加相应的复杂度。100%的纯粹架构功能设计相对简单,只要你并不在意复杂度带来的操作上的困难。目前的办法是为不同子网采用不同的架构,在尽量不碰到麻烦的情况下带来最佳的效果。我们相信Calico项目正式朝着这个方向努力的。
关于Calico,最主要的三点建议是:
L3 vs. L2 and overlays vs. native
最近几个项目,我们听到很多关于“Calico为了可扩展性回归了L2”,或者“Calico使用microsegmentation模式(一种从L3路由架构看起来更像L2层的模式) ”。这两种说法,混淆了两个概念:
网络上转发量子(quata)是什么?或者说转发系统基于底层包的哪个比特? 网(fabric)中是什么把转发节点整合成一个大网络
让我们分开讨论。
网络中什么是转发量子?
今天在可扩展或者云架构中,大部分应用产生的数据包都是IP包。如果发现非IP包(或者IP相关,像 ICMP),那我就可能要拍砖了。。。IPX, NetBEUI, EtherTalk, Banyan Vines, ATM, and DECNet 等系统已经过时很久了 (我猜DECNet 有可能在一些暗黑角落仍然会生存一段时间). 当人们提到“我需要L2网络”时候,更多时候意味着“我需要一个私有IP网络”或者“我不想为了这个应用改变从上世纪90年代就使用的架构”。(好吧, 上世纪90年代令人窒息的, 三层结婚蛋糕似的网络回归。)
因为IP是我们目前使用网络的原子(quata),因此使用它作为转发模式才有意义。IETF选择L2OL3打包模式(PWE3,L2VPN等等),其原因就是:L3是现实中的标准,为什么不使用现实标准,在此之上打包呢(传统的L2)。但是他们忘记了,这种想问题的方法会走向死胡同,就如同将基于Ethernet的IP包包装在VXLAN上似的,有意义吗?效率可以接受吗?容易排错吗?如果我们真的认为Ethernet是正确的转发原子(quata),我们直接建一个L2网络不可以吗?---哦,看起来我们曾经尝试过,但是并不成功,对吗?
使用IP作为转发原子(quata)带来一个问题,L2层分段的概念会丢失很多信息。在一个以太网络,两个节点之间要么在一个段内是相连的,要么是不相连的。如果是相连的,他们之间可以转发,如果不相连则不能转发。 IP并没有一个段的概念(甚至是子段,将L2层段概念对应于IP地址段)。而在一个纯粹的IP网段,路由器转发“longest prefix match(最长前缀匹配)” 一般来说IP地址可以被一组比特前缀分组, (例如: 192.0.2.0/24, 198.51.100.16/30, and 2001:db8:://128),这些分组跟底层物理拓扑没有任何关系,或者,可以说所有符合以上分组特征的地址从路由器角度来看共享一个路由 。因此,如果一个路由器有一条路由 192.0.2.0/24 是通过 interface 1, 而192.0.2.26/32 通过 interface 2, 那么所有的通过192.0.2.0/24的流量都会通过 interface 1, 除非目的地址是 192.0.2.26, 会通过 interface 2. 这种方式允许一些在Ethernet无效的方式也可以被采用,使得“microsegmentation”的概念在IP网络中真正有意义。
Calico方法有一些前提。所有(或者几乎所有)流量都是可以被转发的IP,IP地址不是写死的,而是采用某种自发现服务(比如,DNS)。这两种模式在业界至少有15年历史,也许我们可以让这种上世纪90年代的网络技术用的更久。基于这种模式,Calico团队相信我们并不需要把IP流量打包进L2层,就如同将IP流量打包进其他网络层(例如VXLAN,NVGRE等等),最后把他们又打包成另外一个IP包,这是完全没有必要的。我们和大家在谈论Calico项目,或者在大会,交流会上期望表达这一观点,因此,我们不希望也不会使用打包的方式作为Calico项目主要的传输机制。
网内如何连接节点(网:internal fabri)
一些不太理解路由网络工作原理的人可能会说:“Calico回归Ethernet是因为可扩展的原因”。这和Calico网站讨论物理、网络拓扑的文档有关,这些可以从 here 和 here获得。
在互联网架构编年史中,你会发现如何让背板操作和路由器更好的结合是一个长期的“宗教式的”战争。某些人使用switching方式(首先是 ATM,然后是Ethernet或者MPLS),其他人使用routing(比如PPP over SDH),其原因并不是某些人更聪明些,而是不同的操作有不同的需求和限制。IP网络的优美之处在于几乎有无穷多的选择可以跟路由器相连,可以直连其它路由器(edge-router,或者core-router概念),从数据中心角度来看更像一个L3网络;你可以使用switching,例如 Ethernet或者MPLS,前者最有代表的是L2层,后者则是以大型服务提供商为代表。实际上,你甚至可以采用 carrier pigeons (如果某个人可以为Calico实现IP over Avian Carrier,Calico团队会有大奖给你)。
使用IP转发设计,然后将计算节点、服务器、从节点都连接到路由器上,我们允许基础架构来决定这些服务器如何相连,并把这一决定对应用层隔离,或者简单说,我们可以将架构和应用解耦。
与做任何工程设计类似,要在很多因素中间做折中,基础架构设计必须要权衡这些因素,最终决定怎样在Calico路由器间互连。 (今天很多大规模部署Calico的客户使用Trident II based ToRs 作为L3互联的方式。不带路由聚合会产生128K IPV4的负载。对于没有很多路由聚合的长前缀匹配场景,除了仍然具有IP的匹配性外,仍然具有高扩展性)。