第1章 引言
直到几年前,存储、计算和网络资源在物理上和运营上还是刻意分开的。甚至用来管理这些资源的系统也是分开的——通常是在物理上分开。运维监控系统等和资源进行交互的应用,都被非常复杂的访问策略、系统和访问规则等以安全的名义控制着。IT部门就喜欢这种方式。只有等到数据中心环境需要并引入廉价的计算能力、存储空间和网络连接之后,这些机构才不得不将这些网元设备放在一起考虑。这种范式上的变迁,让管理和操作这些资源的应用比以前更加紧密地联系在一起。
数据中心最初被设计用来在物理上分隔传统计算单元(如PC服务器)、它们所用的存储,以及连接它们和用户的网络。这种数据中心的计算能力往往被用于特定的服务器功能,例如运行邮件服务器、数据库服务器或其他被广泛使用的功能,来为桌面客户端提供服务。以前,这些功能通常运行在企业机构中数千台(或更多)桌面电脑上,由专职部门内部使用的部门级服务器群提供服务。随着时间的推移,出于多种原因,部门级服务器群迁移到了数据中心,这样做主要是为了管理上的便利,其次是企业用户之间的资源共享。
大约10年之前,发生了一个有趣的变化。一家叫做VMware的公司发明了一项有趣的技术,它允许一个或多个客户操作系统(如Windows)在流行的Linux发行版等主机操作系统上运行。VMware公司所做的是创建了一种小程序,用来建立集成了真实计算环境(如虚拟NIC、BIOS、声卡和视频装置)的虚拟环境,然后在多个虚拟机之间分配资源,并且将虚拟机隔离开。这种监控程序被称为虚拟机管理程序(hypervisor)。
最初的时候,VMware软件是为那些想要在Linux下完成大多数计算任务,而只在某些需要Windows操作系统环境时才用Windows(那时候,这种情况在企业里是常态)的工程师们设计的。他们在Windows下完成操作后可以像关闭一个普通程序那样关掉Windows,然后继续使用Linux。有意思的是,这样用户就可以把客户操作系统当作其磁盘上的一个程序文件(尽管很大)。人们能够像操作其他文件那样操作这个文件(比如可以把它移动或复制到其他机器,而且还能像安装在原来的机器上一样运行)。更有意思的是,这个操作系统可以在它察觉不到的情况下被中止,实质上是让它进入历程中断状态(suspended animation)。
随着操作系统虚拟化的出现,原本运行Microsoft Windows Server这种单一的、专用的操作系统以及运行为这些操作系统量身定做的应用的服务器,现在可以被看作普通的计算和存储平台。随着内存、计算能力、存储的进一步发展和增加,数据中心服务器增强了在虚拟化环境中同时运行多个操作系统的能力。VMware扩展了它的单机版,让它更加适用于数据中心环境,以便在一个终端上运行和控制成百上千的虚拟机。Windows Server这种以往占据整台物理机器的操作系统如今可以在一个个虚拟机中,各自运行着用户所需的应用。唯一不同的是,每个系统运行在自有的环境中,可以中止、迁移、克隆或者复制(比如备份)。弹性计算(elastic computing)的时代就这样开始了。
在弹性计算环境中,运维部门只需简单地暂停虚拟机再复制文件,就可以将服务器迁移到数据中心的任意物理位置。它们甚至只需要克隆相同虚拟机的文件,然后让虚拟机管理程序将它作为新的实例来运行,就可以创建一个新的虚拟机。凭借这样的灵活性,网络管理员可以利用能源和冷却等指标,来优化数据中心里资源的位置。通过将所有运行中的虚拟机整合在一起,管理员可以让数据中心其他部分的服务器休眠或空转,调低这部分的冷却性能,从而优化了数据中心的冷却负荷。类似地,管理员也可以根据区域的需求,移动或动态地扩展计算、存储或网络资源。
和所有技术上的进步一样,这种在操作部署计算、存储和网络资源上引入的新的灵活性也带来了一个新问题:在考虑对存储和计算能力实现最大化的同时,又要兼顾能源和冷却时的运营效率。正如前面提到的那样,网络管理员开始意识到,一般来说,对于计算能力的需求会随着时间而增长。为了跟上这种需求,IT部门(通常按年度分配预算)会预测并订购下一年所需的所有设备。然而,只要设备到位并且放置在了机架上,就算它尚未使用,那也还是会消耗电力、冷却和空间资源。亚马逊首先发现了这个左右为难的问题。当时亚马逊的业务正呈现出“曲棍球杆曲线”(hockey stick graph),每6~9个月翻一倍。因此,为零售、库存和仓库管理系统以及内部IT系统提供计算服务的系统,其增长必须快于需求。所以亚马逊的IT部门不得不预先订购大量的存储、网络和计算资源,但他们又陷入了另一个窘境,在需求赶上之前,这些设备会一直处于闲置状态。为了商品化这些未利用的资源池,充分利用这些资源,亚马逊发布了Amazon Web Services(AWS)。当亚马逊的内部需要更多资源时,AWS就会简单地压缩零售用户的资源,否则零售用户可以用尽未使用的资源。有人称之为弹性计算服务,本书称之为超虚拟化(hyper virtualization)。
从那时起,亚马逊、Rackspace等公司等为了价格优惠而大量购买存储和计算设备,结果发现他们并没有充分地利用自己的存储和计算资源,实际上他们可以将多余的计算能力和存储转售给外部用户,从而弥补一些资金投入。多租户的数据中心就这样兴起了。当然,这就引入了一个新的问题,如何将上千个潜在的租户互相隔离开,而这些租户所租用的资源却是任意地分散在不同数据中心的虚拟机上。
还有一种理解这个困境的方式是,注意到在迁移到超虚拟化环境之前,(计算任务的)执行环境一般都是由单个企业或者组织来操作的。这就是说,他们通常拥有所有的计算和存储资源(尽管一些是租用的主机托管空间),并把这些资源看做一个连接了大量虚拟机或物理机以及存储设备的扁平局域网(LAN)来操作。(唯一的例外是在金融机构中,需要按照规范要求来实施隔离。)但是,在这些示例中,部门的数量都相对较小,不到100,所以这个问题可以简单地用现有的工具(如2层或3层MPLS VPN)来解决。就算使用这两种解决方案,连接所有计算和存储资源的网络组件也还相当简单,它基本上是一个连接所有物理机或虚拟机的扁平以太网LAN。因为这些机器都归一家企业所有,只供他访问,在绝大多数这样的环境中,所有(虚拟或物理的)设备都分配了同一个网络(可能是同一个IP子网)内的IP地址。这也意味着将虚拟机在同一家企业的不同数据中心之间迁移不会产生问题,因为它们也都在同一个路由域下,并且不管物理位置如何,都可以互相联通。
多租户数据中心的计算、存储和网络资源可以分成相互独立或隔离的分片来提供服务。事实上,将它们隔离开十分关键。这带来了一些有趣的挑战,这些挑战在以往单租户数据中心环境下是不存在的。请记住,多租户的环境允许任意数量的操作系统和运行在这些操作系统上的应用,但如果它是要被其拥有者或者其他外部用户(如客户)访问的话,那么每个操作系统都需要一个唯一的网络地址。在过去,可以从单个、可能是私有网段的内部地址块分配,并且可以轻松在企业内部进行路由。然而现在需要分配唯一并且可以从外部路由和访问的地址。此外,考虑到相关虚拟机也都还有一个唯一的2层网络地址。路由器最终需要利用以太网来传送数据报文(而不仅仅通过IP)。这通常不成问题,除非需要考虑虚拟机的移动性(VM molibity)。在这些数据中心里,虚拟机会由于电力、冷却或计算密度等原因而迁移。难点就在这里,因为物理位置的迁移意味着物理地址的迁移。这也意味着可能需要对3层路由进行更改,以确保发往该机器原先所在位置的数据报文现在可以发送到新位置。
在数据中心不断发展的同时,网络设备却似乎在满足吞吐量和速度以外的方面缺乏创新。也就是说,在IP、MPLS和移动技术出现之后,网络技术在交换结构能力和接口速度、数据通信以外的方面有些停滞不前。IP和MPLS允许网络管理员在这些基础网络上创建网络和虚拟叠加网络,就像数据中心管理员可以利用计算虚拟化技术在物理机上创建并运行虚拟机那样。网络虚拟化通常被称为虚拟专用网络(VPN),并且以多种形式存在,包括点对点(如个人VPN,在笔记本上用它来连接到公司的网络);3层(虚拟化IP或路由网络,比如网络管理员可以用它们将本企业的流量和其他流量隔离开,以此保证企业网络的安全)和2层VPN(交换网络虚拟化以提供和3层VPN类似的隔离,只不过这里用的是以太网地址)。
商用路由器和交换机通常配备了管理接口,支持网络管理员配置和通过其他手段管理这些设备。这些管理接口包括命令行接口、XML/Netconf、图形用户界面(GUI)和简单网络管理协议(SNMP)等。通过这些接口,管理员可以用恰当的方式来管理设备,但是它们通常仍然对管理员隐藏了最底层的细节。例如,网络管理员可以编写静态路由表或其他静态的转发项,但是这些最终都要转化为传递给设备操作系统的请求。如果有人想利用设备上已有功能的语法或功能来配置,这通常不成问题。但如果有人希望试验新的路由协议,就只能使用固件中支持这种新协议的设备。在这种情况下,客户经常会向设备厂商提出功能增强的要求,并且需要等待很长的时间(等待数年也不罕见),客户请求的功能才会加入。
与此同时,(至少在逻辑上)分布式控制平面的概念再一次出现在人们视野中。一个网络设备由数据平面和一个控制平面组成。数据平面通常是一个交换结构,连接了设备上的多个网络端口。控制平面则是设备的大脑。例如,用来在一个网络中构建无环路的路由协议,通常以分布式的方式实现。也就是说,网络中的每个设备都有一个实现了该协议的控制平面。这些控制平面相互沟通、协调,以构建网络路径。然而,在集中式控制平面范式中,会存在一个(至少在逻辑上)单独的控制平面。这个超级大脑会将命令推送到每个设备,从而指挥这些设备来操控各自的物理交换和路由硬件。应该特别注意的是,虽然构成设备数据平面的硬件仍然相当专业化,因而价格昂贵,但是控制平面却日益倾向于使用越来越便宜的通用计算设备,如Intel公司生产的中央处理单元。
上面提到的都是重要的概念,因为它们为今天软件定义网络(SDN)的技术提供了核心动因。SDN的早期倡导者发现网络设备厂商不能满足他们的需求,尤其在功能开发和提供的创新空间上。高端的路由和交换设备也被认为定价过高,至少对于这些设备上的控制元件来说是这样。与此同时,他们看到了原材料价格,即弹性计算力的成本快速下降。这让一个人处理上千个处理器成为了现实。从那时起,他们意识到可以利用这些计算力来运行一个逻辑的集中式控制平面,这样就可以使用哪怕是廉价、商品级价位的交换硬件。斯坦福大学的几位工程师创造出了一种称为OpenFlow的协议,这个协议正好可以采用上述硬件配置来实现。OpenFlow的架构为一些只有数据平面的设备而设计,这些设备被一个(逻辑上的)集中式控制器所控制,这个控制器是该网络中唯一一个控制平面。这个控制器负责维护所有的网络路径,以及对其所控制的网络设备进行编程。OpenFlow的协议描述了这些指令和响应规范。值得一提的是,开放网络基金会(ONF)对SDN提供商业上的支持,并且今天仍然是其标准化和市场推广的权威机构。基于刚才所描述的这个基本架构,人们现在可以想象,在数据中心的廉价硬件上实现新的协议是多么地快捷和方便。更妙的是,人们可以在弹性计算环境中的虚拟机上实现它。
对于SDN还有一个稍有不同的视角,业内一些人士称之为软件驱动网络(software-driven network),而不是软件定义网络。这种文字游戏并不是故意要把读者搞晕,而是为了突出在方法理念上的差别。在软件驱动的方式中,人们将OpenFlow及其架构视作所有可实现功能的一个特殊子集。不是在逻辑上把网络看做集中式控制平面和一堆非智能的网络设备,而是将这个世界看成新旧技术的混合体。更确切地说,把现有的网络都拆掉甩卖,让ONF和软件定义网络来构建新世界是不现实的。丢弃现有支撑着互联网的先进网络技术同样也是不现实的。然而,更现实的是一种混合的方式,网络的一部分被一个逻辑上的集中式控制器操控,而其他部分则由更传统的分布式控制平面来操控。这也意味着,这两个世界要彼此互通协作。
有意思的是,人们发现在SDN和OpenFlow倡导者的众多努力中,有一个共同的主要内容,即实现更广泛、更灵活的网络设备可编程性。可编程性不一定与网络控制和数据平面的位置有关,但它关系到如何编写这些设备。不要忘记,创建SDN和OpenFlow的一个动机就是如何(how)对网络设备进行编程以获得灵活性,而不只是在哪里(where)进行编程。如果有人关注了SDN的体系结构设计方面正在进行的工作,就会发现可编程性和编程位置这两个问题都解决了。剩下的问题是,从可编程性的角度来解决问题是否是最优选择。
最近,为了解决这个问题,来自思科公司(Cisco)、瞻博公司(Juniper)、Level3公司及其他厂商和运营商的技术人员率先为网络可编程性做出了努力,他们的工作成果称为路由系统接口(I2RS)。这些公司的一些同仁为多个相关的IETF草案做出过贡献,包括基本的需求和框架草案,Alia Atlas、David Ward和Tom是主要的贡献者。在不久的将来,至少会有十多份与此相关的草案公布在网络上。很明显,大家对这方面的工作都有着极大的兴趣。I2RS的基本思想是创建一个协议和多个组件,作为利用快速路径协议来编写网络设备路由信息库(RIB)的一种手段,这种协议支持快速直通式的业务开通配置操作,以允许RIB和控制它的RIB管理器之间进行实时交互。此前,通过设备的配置系统(对于Juniper的设备来说,是Netconf或SNMP)来操控RIB,是管理RIB的唯一方法。
理解I2RS的关键在于,明白I2RS带来的绝不仅仅是一个业务开通配置协议。这是因为还有许多其他的关键概念组成了整套解决方案,来解决加速网元设备之间的反馈回路、网络编程、网络状态和统计信息获取和后期处理等综合问题。如今,这个反馈回路慢得令人感到痛苦。参与I2RS的人们认为可编程网络的未来就在于优化这条回路。
为此,I2RS提供了网络编程的几种不同抽象级别,如网络路径、策略、端口配置,而这些都带来了同样的质量监督上的优势,把编程视作在提交命令前做检查的手段。举个例子,现有的某些用于编写硬件抽象层(HAL)的协议要么粒度过于精细,要么展示了过多的细节,这都影响网络的效率,实际上是给协议的运维系统带来了不必要的负担。另一个例子是为运营支撑系统(OSS)的应用程序提供快速和最佳的RIB访问,让程序变更更快速地生效,然后观察效果。为了优化网络操作,必须支持快速重新编程。这些例子的一个要点在于,应用程序和RIB之间的会话是通过RIB管理器进行的。这点很重要,这是因为许多管理员都希望保留他们在路由协议方面所做的工作,这些工作都位于Junos或IOS-XR等设备操作系统上,与此同时充分利用这个新颖实用的编程范式来进一步优化他们的网络。
I2RS也非常适用于满足人们不断增加的对于逻辑上集中式路由、路径选择和可编程性的渴望。这个协议对于在网络设备上和网络设备之外运行都有要求。这样,可以在需要时使用分布式控制器的功能,也可以在需要时支持更加经典的分布式控制场景。
最后,I2RS还有一个关键的子组件,就是归一化和抽象化的拓扑结构。定义一个公共可扩展的对象模型就可以表示这种拓扑结构。这种服务还允许公开拓扑表示的多种抽象。这个模型的一个关键在于非路由设备(或其他不支持路由协议的设备)可以更容易地操作和改变RIB状态持续转发。如今,非路由设备还不能很好地获取这个信息。持续转发、网络管理组件/OSS、分析和其他人们无法预见的应用,将会更快速和有效地与路由状态和网络拓扑进行交互。
所以,人们应该对SDN下个定义,说明它是什么,以及会变成什么样。以下总结这些思考。
软件定义网络(SDN):是一种优化和简化网络操作的体系结构方式,它将应用与网络服务、设备之间的交互(如服务开通配置、消息传递、警报)更紧密地结合在一起,不论它们是物理的还是虚拟化的。它通常利用一个逻辑上集中式的网络控制,通常被认为是由SDN控制器来实现,它编排、协调并促进希望与网元设备进行交互的应用程序,以及希望传送信息给应用的网元设备之间的通信。然后,控制器通过现代化的、应用友好的、双向的编程接口来展示、抽象网络功能和操作。
所以,可以看到,软件定义、软件驱动、可编程网络具有一套丰富和复杂的历史传承、挑战,以及针对这些挑战的多种解决方案。正是软件定义、软件驱动和可编程网络出现之前的技术的成功,使得基于它们的先进技术成为可能。现实情况是,世界上的大多数网络(包括互联网)都运行在IP、BGP、MPLS和以太网的基础上。如今的虚拟化技术基于VMware公司多年前开创的技术,现在仍然是VMware公司和其他产品的基础。网络附加存储有着同样丰富的历史。
只要能够解决网络、计算、存储虚拟化,以及超虚拟化环境下应用的编程性、易访问性、位置和迁移这些问题,I2RS也将会有同样的光明前景。
虽然SDN控制器仍然在媒体中称王称霸,但写作本书时,许多其他技术进步也出现了。其中一个非常有吸引力且非常透明的项目就是OpenDaylight项目。OpenDaylight的任务是促进以社区为主导的、业界支持的开源框架,包括代码和架构,来加速和推动通用的、稳健的软件定义的网络平台。为此,OpenDaylight项目作为Linux基金会托管的项目,将会有利于真正改变游戏规则,并有可能为SDN控制器的发展铺平道路。这方面的努力也将刺激在我们看来这个领域最重要的东西:应用的创新。在过去几年中,可以看到控制器的种种进步,控制器被认为真正代表了支持SDN的应用程序的基础架构。在这种思想的影响下,过去几年中,业界一直在努力设计和开发控制器,却大多忽视了应用。作者认为,SDN真正的意义在于运营上的优化和效率,利用这些优点的最好方式,是快速完善基础设施,然后让业界专注于应用和设备层的SDN架构创新。
本书侧重于软件定义网络、软件驱动网络和可编程网络的网络部分,但也会包含足够多的虚拟化、位置和存储、网络和计算的编程等方面内容。本书的目标就是探索这些网络技术进步背后的细节和动机,这些细节和动机带来并且支撑了网络、存储和计算资源的超虚拟化,并且现在也被视为SDN的一部分。