绑定完请刷新页面
取消
刷新

分享好友

×
取消 复制
如何应用开源软件构建企业数据中心内SDN
2020-07-01 18:02:04

本文来自本人于Open Networking Summit 2019北美峰会上的演讲。Linux基金会发布了会议所有的演讲视频,但是观看需要支付49美金。[1]

内容

--

内容分为四个部分:

  • 首先简单介绍数据中心网络架构
  • 其次介绍如何在一个已有的数据中心内应用开源软件构建SDN
  • 第三介绍如何将SDN规模扩大
  • 第四介绍如何将SDN网络连接到已有的物理网络


数据中心网络-三层网络架构

--

传统三层网络架构分为核心,汇聚和接入层。接入层用来连接服务器并且执行L2转发,L2和L3的分界通常在汇聚上。因为汇聚一下是L2网络,而同时有多个汇聚,所以STP协议通常用来避免L2 loop。也正是这个原因,在L2网络里面只有一条工作的链路。所以图中,两个汇聚交换机,只有一个是active,另一个是standby。

在这种架构下,需要扩展数据中心,只需要在core下面再增加一个Segment即可。


数据中心网络-CLOS网络架构

--

CLOS架构在现代数据中心逐渐成为主流,因为它具有更高的性能和更好的弹性。CLOS架构中,基础需要两层,spine/leaf。leaf用来连接物理服务器,如三层架构中的access一样。但是现在L2和L3的分界在Leaf上,这样的好处是可以通过ECMP可以实现服务器之间的active-active链路。

在CLOS架构下,可以通过增加super spine,来简介多个POD,从而实现数据中心扩容。引入superspine之后,服务器之间仍然是active-active的多路径,区别是现在多了一跳。


在数据中心内构建SDN

--

因为数据中心是现成,所以只能构建软件SDN,软件SDN灵活性也要胜出一些。虚拟机配合VxLAN的方案通常也成为主机网络虚拟化(host networking virtualization),就是在已有的主机网络上实现网络虚拟化。

主机内部通过OpenVSwitch连接所有本地的VM,OVS基于OpenFlow并且广泛被SDN系统采用,因为这里它是。

每个主机内部运行一个基于RYU的SDN controller,这样可以避免当规模扩大时,集中式SDN控制器带来的瓶颈问题。RYU本身是一个模块化的SDN控制器,它支持将定制的代码以app的性质运行在自己的框架中,从而方便用户开发各种网络功能。

为了避免物理网络的改动,虚机网络数据被封装成VxLAN,这样物理网络看到的都是主机间的UDP包。

因为SDN controller运行在每个主机,所以,为了将这个controller逻辑统一起来,需要一个数据库。这里使用的是etcd,etcd官网有吹自己多厉害的文字我这就不写了。不过现在no-sql数据库中,etcd应该是应用多的。etcd是一个key-value store,非常轻量级。在这次ONS的keynote上,电信NFV也号称要开始采用类似的数据库。

SDN controller中的代码连接etcd,并从中同步数据,这样,只要etcd中有网络数据,它们就能被同步下来并应用在本地。那现在问题来了,etcd的数据需要谁去写?

这使用OpenStack Neutron来写etcd。Neutron本身是一个plugin system,并且有大量定义好的网络模型,因此这里在这里定义了多个plugin,并将Neutron的数据转换成etcd数据,写在etcd中。

这样,分布式的SDN controller有了一个统一的数据仓库。任何用户的请求只要写到这个数据仓库,就能后应用在主机的OpenVSwitch中。

为了提高SDN系统的响应速度,这里还采用了一个消息队列,ZMQ。吹ZMQ的信息可以从ZMQ官网找到。Neutron中定制的plugin不仅会向ETCD写数据,还是通过ZMQ将消息发给分布式的SDN controller。而SDN controller收到消息之后,再从etcd拉数据。

至此一个基本的SDN架构已经构建出来,这样的架构在SDN或者其他软件系统中非常流行。


扩大SDN规模

--

刚刚介绍的架构在中小规模没有问题,但是当规模增大,ZMQ和etcd压力变大,终会导致某个主机上的SDN controller因为连接失败而不能正常工作,从而导致整个SDN系统局部故障。这种局部故障在构建一个生产可用的SDN系统时是不可接受的。

对于这个架构本身可以有一些优化,例如合并读操作,可以减少etcd的压力,又例如可以在MQ的消息里面带上实际的数据,进一步减少数据库的读操作。

但是在优化过程中,本身有一个很有意思,与网络也相关的特点。尽管SDN中,有辣么多网络数据模型,network,subnet,QoS,SecurityGroup等等,但是所有的这些网络数据模型,都没有port特殊。因为其他的网络模型,用户一旦创建了,基本不会修改,因为对整个SDN系统带来的压力也不大。但是Port是跟虚机密切相关的资源,用户创建、删除、停止、重启、迁移虚机,都会导致Port有变化。所以Port数据对SDN系统的负载造成了更多的影响。

在说明解决方案之前,先看EVPN。EVPN我专栏里介绍很多了,这里直接看MAC/IP address route,可以很好的用来传输Port的信息。

所以,这里在SDN系统中通过GoBGP引入了EVPN。吹GoBGP的文字可以在GoBGP官网找到。使用GoBGP,当Port发生变化时,只会将这个变化发送给Port所在的主机的SDN controller。这样ZMQ压力降到了低。

主机上的SDN controller会进而将这个Port数据,转换成EVPN数据,发送给BGP路由反射器,路由反射器再将这个EVPN数据发给其他主机。这样就相当于将ZMQ的压力转嫁给了EVPN系统。

EVPN或者BGP本身是经过时间检验的协议,因此在可靠性和稳定性上是能承受住这样的考验。

为了更好的使用EVPN,这里还是用了RTC4684和EVPN MAC mobility。这里就不展开了,感兴趣可以去找相关的资料。


连接SDN网络与物理网络

--

既然已经有GoBGP了,那再用GoBGP来传一个IPv4的路由到物理网。这样物理网如果要访问虚机网络,就知道将网络数据发送到相应的节点。为了减少物理网中的路由条数,这里采用特定的网关节点,所以,实际是通过网关节点+BGPv4,实现了一个VxLAN到物理网的gateway。当然,为了网络性能,这里采用了DPDK。


总结

--

后整个SDN系统在数据中心的构成就是这样的了。总共有三类节点:

  • controller节点:运行API server,运行ZMQ,运行etcd,运行BGP RR。这些组件都是松耦合的,因此如果有需要也可以拆分到单独的机器上。
  • compute节点:通过ZMQ,EVPN,etcd获得相应的网络数据,并应用在本地,actually创建SDN网络。
  • gateway节点:采用与compute节点类似的架构(便于维护,开发,管理),连接SDN网络和物理网络。

参考

  1. ^不理解打着开源旗号的组织为什么要这么做。
分享好友

分享这个小栈给你的朋友们,一起进步吧。

网络与CDN
创建时间:2020-06-17 17:59:30
CDN的全称是Content Delivery Network,即内容分发网络。CDN是构建在现有网络基础之上的智能虚拟网络,依靠部署在各地的边缘服务器,通过中心平台的负载均衡、内容分发、调度等
展开
订阅须知

• 所有用户可根据关注领域订阅专区或所有专区

• 付费订阅:虚拟交易,一经交易不退款;若特殊情况,可3日内客服咨询

• 专区发布评论属默认订阅所评论专区(除付费小栈外)

技术专家

查看更多
  • 栈栈
    专家
戳我,来吐槽~