在网络场景下,一个数据流通常需要通过多个网络服务设备,例如IDS/IPS,防火墙,LB,等,最终才能到达目的端。这就是服务链(SFC, Service Function Chain)最常用的场景。SFC对于传统硬件网络,或者SDN(什么?你还不知道SDN,那看看这吧SDN闲聊)都是很常见的。但是在传统网络中,SFC存在以下几个问题:
1. 受限于网络拓扑。你的网络服务设备能不能,怎么摆放很大程度上取决于你的网络拓扑。
2. SFC相对固定。一旦设备接好之后,不能轻易改动,改动涉及到重新布线。并且所有的数据流都必须流经固定的Chain。比如说防火墙部署好之后,如果只想让首包过防火墙,其他的包直接进入数据中心。这在传统网络中不太可能,一般情况下,所有的包都会流经防火墙设备。
3. 扩容较为麻烦,已有的拓扑在扩容的时候必须考虑如何不影响现有业务。
如果是基于SDN,那问题都将迎刃而解。SDN的灵活性,能使SFC的作用得到更大的发挥。
之前的文章里说过的,SDN主要提供的服务可以分为两类:
Networking Infrastructure:提供网络基础架构功能。或者说,提供SDN中各个终端设备(例如VM)的网络连通性功能。
Networking Service:提供网络服务功能。向SDN的用户提供网络服务(Networking As A Service),Load Balance,Firewall,QoS等等,都可以认为是网络服务功能。
SFC将会是实现Networking Service的一种很灵活的方式。由云服务运营商提供各种各样的Service Function,由SDN管理SFC,将Service Function加入到网络流量路径中,即能实现Networking Service(L4-L7)。
接下来看一下SFC里面的几个主要概念:
SFC Classifier: 识别网络流量,并将其分配到不同的SFC。Classifier可以运行在任意设备上,并且一条SFC中可以有多个Classifier,通常情况下,Classifier存在于SFC的头结点。SFC Classifier还将给网络流量包加上SFC识别符。具体的说,它会在网络包里加上一个SFC Header,也就是说它会改变包的结构。这个Header包含一个SFC的唯一识别ID。
SFI(Service Function Instance):一个Service Function的实例,可以是个进程,也可以就是一个server。最近很火的NFV也可以认为是一个SFI(2017-04-09纠正,SFI 对应的应该是NFV中的VNF概念)。
SFF(Service Function Forwarder):提供服务层的转发。SFF接收带有SFC Header的网络包,利用SFC Header,将网络包转发给相应的SFI。在某些场合,SFF也可以不基于SFC Header,例如基于五元组。
SF Proxy:任何不能理解SFC的设备,在SFC中都必须配合proxy使用。因为传统的SF设备没有SFC的概念,proxy将会把网络包中的SFC Header去掉,并把原始的数据包转发给传统的SF设备,当网络包处理完之后,proxy还将负责把SFC Header加回到网络包中,并发回到SFC中。
SFF与SFI的连接:
SFF可以是与SFI独立的设备,也可以是两者集成在一起。SFF与SFI的连接方式,可以是以下两种:
单臂模式(one-armed):在这种模式下,SFF将网络流量包转发给SFI,SFI处理完成之后再转发回给SFF,由同一个SFF发送回SFC。
串联模式(bump-in-the-wire):这种模式下,SFI处理完成之后,会将网络流量包转发给SFC中的下一个SFF。
综合看起来SFC的逻辑抽象如下图所示:
绿线和蓝线的路径分别是两个SFC,Classifier负责识别网络流量,并分发给不同的SFC,SFF负责将网络流量转发至SFI。为什么会有多个SFF?因为SFI可能连接在不同的交换设备上,每个交换设备可能都需要一个SFF做转发。图中SFI和SFF的连接都是one-armed模式。其实标题配图也能从逻辑上很好的说明SFC。
SFC Header
这个可以说是SFC的Magic所在了。SFC Header的意义是:在网络包遍历整个Chain时,携带的以供Service Function使用的的信息。 SFC Header可以是基于现有的网络协议中的Header,例如IPv4 header中的DSCP bits,或者是MPLS labels。据说IETF也正在制定为SFC专用的header,以期实现更多的功能。
SFC、SDN、NFV:
NFV就是将网络服务部署成VM,这样的虚机可以认为是一个SFI。SDN可以方便的将SFC需要的网络控制功能下发到Classifier,SFF和SFI。这三者是共同发展的,可以说SFC是一种实现Networking Service的标准方式,借助SDN和NFV能更好的实现SFC。尤其是在公有云场景中,用户对L4-L7服务的需求是多种多样的,如果都由SDN实现,将加大SDN的复杂性,借助NFV和SFC,能够更加灵活实现Networking Service。
OpenStack有一个专门的SFC项目,networking-sfc in Launchpad。以后有机会结合这个项目讲一些SFC更实际的东西。