neutron架构
neutron分为neutron-server和agent,neutron-server运行在controller节点,agent运行在compute节点和network节点,neutron-server和agent之间通过rpc通信。个人理解neutron就是resource(network, subnet, port,security_group)和对resource的extension(qos等)的CUD(create, update, delete),真正实现CUD操作重担落在各种plugin的肩膀上。
- neutron-server
openstack各大组件都向外提供API服务,neutron也不例外,有neutron-server跑在controller节点,提供标准的api,还有各种extension实现api功能的扩展。ML2 plugin作为核心插件实现api中的network,subnet,port和security_group,还支持一些extension,主要实现layer 2转发的功能。高级services的plugin实现更多的高级功能,如l3_router实现layer 3的功能,主要是三层转发和NAT的功能,其它plugin还能实现LB,FW和VPN的功能。
neutron-server DB层是做什么的?
neutron-server肯定得把network,subnet,port等相关的信息存放在数据库中,还得定义数据存放的格式和数据之间的关系,以及新加属性后的升级等,DB层提供的功能保证数据操作是安全和一致性的,总之DB层是通用层,DB操作交给这层就行了,不用其它层操心。
plugin是什么玩意?
plugin继承DB层定义的类和方法,然后实现对agent的notify和RpcCallback。api请求来之后先对数据库进行操作,然后再通知agent进行动作,或者收到agent rpc消息进行相应的操作。
ML2 plugin又是干什么的?
ML2= multiple layer 2,实现了多种多样的layer 2转发类型,如flat,vlan,VXLAN和GRE,同样实现vlan转发既可以用ovs也可以用linux bridge,所以又搞出个type_driver和mechanisim_driver。typedriver是抽象层面的概念,每种类型的网络都是不一样的,表示的信息不一样,如vlan网络就是vlan id了,vxlan网络就是vni了,所以一种type_driver表示一种网络,创建这种类型的网络就用对应的type_driver做检查和分配信息,如vlan id是否够用,分配一个vlan id或者指定的vlan id是否已经被占用。mechanisim_driver可以认为是实现机制,也可以认为它是ML2的plugin,这个ML2的plugin可以和对应的l2 agent通信,linux bridge agent可以实现基于vlan的转发,ovs agent也可以实现基于vlan的转发,那么linux bridge和ovs就是两种实现机制,所以每种实现机制需要向neutron-server报告自己支持的网络类型和接口类型,还有是否支持security_group等。
service plugin又能干什么?
service plugin就是更高级功能的plugin,包括l3_router plugin实现的是三层转发和NAT功能。service plugin也分为type和provider,类比ML2 plugin,type就是routing,firewall, vpn和lb,privider就是driver,同样是routing,可以用l3 agent的namespace实现转发,也可以用H3C的硬件来实现,只要H3C提供plugin就行了。
- agent
agent运行在compute node或者network node,是具体干活的,控制数据面转发机制,把流量打通,如已经用到的dhcp-agent, linux-bridge-agent,l3-agent,openvswitch-agent,metadata-agent等等,agent和neutron-server侧的plugin进行交互。
- neutron-server和agent通信机制
neutron原生实现agent和neutron-server之间用消息队列通信,neutron-server可以push,agent进行pull,或者agent定时信息同步,然后agent调用命令搭建数据面的路径。agent也可以是SDN controller,厂商自己实现的plugin通过其它方式和controller通信,对接了SDN controller就不再需要原生的那些agent了,如H3C vcf和contrail。
总结
neutron牛逼之处在于它融入了openstack生态,大家接受度比较高,有社区推广,整体比较认同它的api,并且api可扩展,再一点和nova结合紧密,掌握所有VM的IP和MAC,所以再高大上的SDN controller也只能作为它的一个plugin。北向接口比较清晰,但南向接口委托给agent了,和转发面接口不明确。首包上送没有的,miss到controller不存在的,高可用性自己实现,动态路由交给agent实现,分布式controller算是一点吧,完全体现了大的开源社区做软件的方法,先做出来一个基础版本有基础功能能用再说,把握核心,改进可扩展性,厂商随便加plugin,agent随便加以便实现更多功能。到底算不算是一个SDN controller,不知道,也已经不重要了,全是摸着石头干出来的,能解决实际问题就行。