网络作为云计算中三驾马车之一,承担着重要基础设施角色。随着云计算规模的不端扩大,对网络虚拟化的需求也越来越高。软件定义的网络(SDN)应运而生,提高了网络的高可靠性,可扩展性,和一些高级的功能。本期“智汇华云”为您邀请到华云数据网络组高级SDN开发工程师任金姚为您带来“ 网络虚机化之SDN简介”。
本期嘉宾 华云数据网络组高级SDN开发工程师任金姚 本文旨在介绍开源SDN控制器TungstenFabric(OpenContrail)的一些实现方式。从下图可以看出SDN的控制层面与数据层面之间的交互是通过XMPP协议,而控制器之间以及网关之间是通过BGP协议来进行的。数据面之间是通过隧道的方式进行转发,可以支持的封装类型为MPLSoverUDP/MPLSoverGRE/VXLAN三种。 在控制层面上,分为了五种节点。分别为控制节点、配置节点、分析节点、数据库节点以及WEB UI节点。其中控制节点是控制器的核心部分,负责BGP路由的学习与分发,并通过XMPP消息将路由下发到vrouter节点(数据面)。 配置节点则负责将从REST或者web上下发的配置请求通过IF-MAP组件传递给控制节点并最终下发的数据面。 分析节点则负责可以将配置以及状态信息抓出来,并保存到数据库中。这些数据可以通过北向REST接口进行获取。包括了流的信息,节点状态信息,节点资源信息等。 控制器的互联互通是通过BGP协议来实现。多个控制器只要保证三层可达,就可以通过BGP路由的交互进行互联互通,极大的增加了可扩展性。 下图是SDN同OpenStack集成后创建虚机的流程图。 我们可以看到集成后Overlay网络的配置信息即可以通过OpenStack的Horizon GUI来进行配置,也可以通过TungstenFabric自带的GUI来进行。同原生OpenStack的区别在于Neutron部分和Compute节点部分。GUI下发的网络相关配置通过Neutron Plugin的方式下发到SDN的配置节点,并通过控制节点最终下发vRouter节点。这里vRouter是数据层面的核心组件,其在linux内核里实现了自己流表,并提供了诸如NAT/FLOW/ACL等高级功能。 上面简单介绍了整体的架构以及同OpenStack整合之后的情况,下面我们来看一下流是怎么建立起来的。 首先当用户创建一台虚机的时候,会通过Nova Compute组件会首先通知Neutron创建虚机接口,Neutron会通过Plugin的方式将请求下发给控制器的配置节点。然后Nova Compute会通过vif的驱动通过ipc的方式通知vrouter节点有端口加入到当前虚机。于此同时,控制的配置节点会将配置信息通过XMPP消息通知到vrouter agent,并在收到添加端口的消息后将路由信息下发到vrouter的kernel里面。 虚机创建完成后,我们可以通过查看端口信息来看出其类型已经是vrouter了。 我们在来看一下虚机启动的情况。 vRouter节点会首先向控制节点发送XMPP消息,请求虚机的相关信息。控制节点在收到请求后会将虚机的MAC,分配的IP地址以及所属的网络等相关信息发回给vRouter节点。此时当虚机进行DHCP请求时,就不在需要通过控制器,而是vRouter节点直接应答虚机请求。 当虚机获取到IP后,vRouter会向控制节点发送两条信息,一个是向控制器发送路由更新注册消息,如果该网络有相关路由更新,则会发送给该vRouter节点;一个是路由通告信息,将本节点的路由信息通告给控制器。其中的路由信息包括了主机路由,下一跳以及封装格式。控制收到各个虚机的通告消息后会形成新的vrf路由表,并将更新后的路由表发送给各个vRouter节点(见第6,7步)。 至此为止,形成流的基础-路由表-已经形成。现在我们从其中的一个VM去ping网络中其它节点的VM,其首先会查找该网络的vrf路由表获取下一跳,以及封装时使用的label。然后进行封包处理,其外层MAC使用的是vRouter的MAC。当该报文到达目的vRouter节点后,vRouter会对报文进行解封装,并根据所属MPLS label将报文送到相应的路由表里面进行路由查找。 待第一个报文被vRouter处理后,就会在kernel里面形成一条流表,以后的转发会根据流表进行。 以上是对SDN的简单介绍,其中还有一些高级的功能(如服务链、路由策略等)以及分析的功能,大家感兴趣的可以自行探究一下。 参考文档: kubeconf2018-trace-traffic.pptx