一.Neutron概要
总所周知,Neutron是OpenStack众多项目中的核心项目之一,代表其网络服务。
Neutron的发展自诞生到现在,可谓是一波三折,其命名先是由nova-network,改为quantum,因其与一家公司名冲突,隧又改为Neutron。表面上的命名变化,又何尝不蕴含着其深层次的发展和演进,以Plugin、高级网络服务功能等突出应用,充分显示着它不断的丰富,就像其命名“中子”一样,彰显着它在浩瀚宇宙中,熠熠生辉的光芒。
下面,借用“北京-小武”一文《Neutron的SDN化》中,Neutron是什么和Neutron的主要功能为线索,来添加自己的认识。
1.Neutron是什么
Openstack核心项目中的网络配置管理组件
Neutron的网络服务功能包括L2-L7层
Neutron用于管理配置VM所用的网络
Neutron有很多SDN控制器作为ML2 Plugin和ML3 Plugin(注:ONOS在计划中)
2.Neutron的主要功能
1)ML2功能
ML2功能包括Port、Subnet、Network、Qos、安全组等,Linux 网桥是虚拟交换机的一种实现,ML2 层使用 VLAN 和VXLAN(利用 L3 层扩展ML2 层的遂道技术)来实现物理隔离。
在ML2 层,由虚拟交换机来实现。虚拟交换机有下列这些:
l Linux 网桥,基于 Linux 内核的网桥。网桥就是交换机的具体体现,比如OpenStack中常见的br-int。
l OpenvSwitch(OVS):OVS 有两种模式,一种是当普通的虚拟交换机来使用,另一个是和 OpenFlow 控制器协作当作SDN交换机来使用。
l 一些基于 Overlay 技术的 SDN 实现,如VXLAN等。
l 一些非开源的商业交换机。
目前,Neutron 已经实现的 ML2 层Drivers如下图所示(Liberty版代码)。
linuxbridge 实现了 Linux 的内核网桥,openvswitch driver实现了 openvswitch 网桥,hyperv driver用于实现和微软的Hyper-V虚拟化产品进行交互,brocade的driver用于和博科的SDN产品进行交互,其他类似。ml2 是一种通用、核心且基础的插件,这些 L2 层的插件主要分写数据库的plugin 部分和运行在计算节点的 agent 部分。在Neutron中,ML2是其Core Plugin。详情,请参见Neutron代码的入口配置文件neutron/setup.cfg,其代码如下:
neutron.core_plugins =
bigswitch = neutron.plugins.bigswitch.plugin:NeutronRestProxyV2
brocade = neutron.plugins.brocade.NeutronPlugin:BrocadePluginV2
ml2 = neutron.plugins.ml2.plugin:Ml2Plugin
nuage = neutron.plugins.nuage.plugin:NuagePlugin
ML2 plugin的代码因为有很多相同,便使用了复用和模块间的导入、装饰器等语法,ml2 可以理解为一个公共的 plugin。且每种插件基本上实现了 FLAT、local 、VLAN、VXLAN、GRE 等几种拓扑。详情,请参见Neutron代码的入口配置文件neutron/setup.cfg(neutron.ml2.type_drivers部分),其代码如下:
neutron.ml2.type_drivers =
flat = neutron.plugins.ml2.drivers.type_flat:FlatTypeDriver
local = neutron.plugins.ml2.drivers.type_local:LocalTypeDriver
vlan = neutron.plugins.ml2.drivers.type_vlan:VlanTypeDriver
geneve = neutron.plugins.ml2.drivers.type_geneve:GeneveTypeDriver
gre = neutron.plugins.ml2.drivers.type_gre:GreTypeDriver
vxlan = neutron.plugins.ml2.drivers.type_vxlan:VxlanTypeDriver
2)L3功能
L3功能,包括Router/DVR、DCHP等服务,L3层通过 ipv4 forward 功能进行静态路由转发,使用iptables的SNAT和DNAT规则实现内网中的虚机访问外网和外网访问内网上的虚机(也就是所谓的Floating IP)。和利用 L2 层扩展 L3 层的标签技术MPLS(一般用在WAN的路由器上)。
3)L4-L7功能
L4-L7功能,包括FWaas、LBaas、VPNaas、DNSaas-Designate等服务。
从网络功能和对应的底层网络设备实现来看,Port对应VM挂载的VNIC相应TAP/TUN设备,Subnet只是一个IP地址 Pool的数据集合,Network则要对应分配的网络类型和相应隔离域ID,Qos功能可以基于OVS来实现,安全组则基于linux bridge上的iptables实现。
L3上Router通过linux的Namespace实现,Dragonflow则是通过OpenvSwitch的流表实现,DHCP和DNS服务通过Dnsmasq实现;L4-L7的服务开源实现方案里,FWaas是通过Router里的Iptables,LBaas是通过Haproxy,VPNaas则是Openswan,当然现在很多设备厂商比如Juniper、思科、华为、博科和F5等对L2-L7的服务实现都提供了自己的设备和driver。
Neutron的机制是通过plugin/driver/agent(server用于和其他组件服务的api进行交互)等方式实现和不同网络设备的集成,plugin里L2-L3称之为core plugin,L4-L7成为service plugin。
driver是plugin下具体集成不同插件的方式,而agent则是部署在另一侧的相应Driver代理,来管控计算节点上的虚拟机。
Neutron中的各种plugin纷繁复杂,诸如Dragonflow、OVN等此类不断涌现。Neutron的未来是想将service plugin统一起来,只剩下Neutron的北向API及Neutron server。
二.Neutron和SDN Controller的集成
在整个SDN(这里仅指Controller)和OpenStack集成的大框架中,个人倾向于通过分层来理解。即Neutron和SDN Controller集成,理解为“应用层(的北向)”;SDN Controller和软硬件网络设备集成,理解为“管理层(南向)”。这里,我们讨论的是应用层(北向)。
在Neutron中,采用SDN 控制器(采用了OpenFlow协议),可以控制流量转发以实现不同虚拟路由器(DVR)的流量负载,通过匹配流表项(Match Flow Table)的方式来实现数据包按照自定义的OpenFlow规则实现Qos功能,不同的应用业务,使用不同的流转发方式,Normal或Flow。
目前,已知的Neutron和SDN控制器集成现状(网络虚拟化NFV方面不在此表),如下所示:
这里,我以Networking-ofagent(ryu)和neutron集成为例做讲解,其他控制器与之类似。
首先,我们需要知道SDN controller是以mechanism_drivers的方式与Neutron ML2 Plugin做集成,这些代码,均统一存放于neutron/plugins/ml2/drivers目录下,其实现集成的核心是driver.py模块。
参见Neutron代码的入口配置文件neutron/setup.cfg(neutron.ml2.mechanism_drivers部分),格式为key=value,value为代码目录,其代码如下:
neutron.ml2.mechanism_drivers =
logger = neutron.tests.unit.plugins.ml2.drivers.mechanism_logger:LoggerMechanismDriver
test = neutron.tests.unit.plugins.ml2.drivers.mechanism_test:TestMechanismDriver
linuxbridge = neutron.plugins.ml2.drivers.linuxbridge.mech_driver.mech_linuxbridge:LinuxbridgeMechanismDriver
openvswitch = neutron.plugins.ml2.drivers.openvswitch.mech_driver.mech_openvswitch:OpenvswitchMechanismDriver
hyperv = neutron.plugins.ml2.drivers.hyperv.mech_hyperv:HypervMechanismDriver
l2population = neutron.plugins.ml2.drivers.l2pop.mech_driver:L2populationMechanismDriver
ofagent = neutron.plugins.ml2.drivers.ofagent.driver:OfagentMechanismDriver
brocade = networking_brocade.vdx.ml2driver.mechanism_brocade:BrocadeMechanism
brocade_fi_ni = neutron.plugins.ml2.drivers.brocade.fi_ni.mechanism_brocade_fi_ni:BrocadeFiNiMechanism
fslSDN = neutron.plugins.ml2.drivers.freescale.mechanism_fslSDN:FslSDNMechanismDriver
sriovnicswitch = neutron.plugins.ml2.drivers.mech_sriov.mech_driver.mech_driver:SriovNicSwitchMechanismDriver
fake_agent = neutron.tests.unit.plugins.ml2.drivers.mech_fake_agent:FakeAgentMechanismDriver
ryu中的driver.py模块代码,代码仅2行,如下所示
from networking_ofagent.plugins.ml2.drivers import mech_ofagent
OfagentMechanismDriver = mech_ofagent.OfagentMechanismDriver
代码的含义是指,首先从networking_ofagent项目安装包的源码目录中(若集成,需要自行安装、配置),导入一个mech_ofagent的模块,用于和Neutron集成,该模块中,有一个OfagentMechanismDriver的基类,用于完成Neutron ML2中诸如port、subnet、network等资源的create、delete、add等操作,或者是使用ofagent L2代理连接到网络。其代码如下所示:
class OfagentMechanismDriver(mech_agent.SimpleAgentMechanismDriverBase):
"""Attach to networks using ofagent L2 agent.
The OfagentMechanismDriver integrates the ml2 plugin with the
ofagent L2 agent. Port binding with this driver requires the
ofagent agent to be running on the port's host, and that agent
to have connectivity to at least one segment of the port's
network.
"""
def __init__(self):
sg_enabled = securitygroups_rpc.is_firewall_enabled()
vif_details = {portbindings.CAP_PORT_FILTER: sg_enabled,
portbindings.OVS_HYBRID_PLUG: sg_enabled}
super(OfagentMechanismDriver, self).__init__(
constants.AGENT_TYPE_OFA,
portbindings.VIF_TYPE_OVS,
vif_details)
def get_allowed_network_types(self, agent):
return (agent['configurations'].get('tunnel_types', []) +
[p_constants.TYPE_LOCAL, p_constants.TYPE_FLAT,
p_constants.TYPE_VLAN])
def get_mappings(self, agent):
return dict(agent['configurations'].get('interface_mappings', {}))
最后。这里,奉上一份目前已知的Neutron项目中各种关于SDN和NFV的Plugin列表(数据来源于文件:neutron/doc/source/stadium/sub_projects.rst)
小结
从最新的Neutron代码中,已经发现了诸如原来的opendaylight和其他一些SDN Plugin,已经开始从项目中移除,统一命名为诸如networking-xxxx之类的独立项目。
Neutron和SDN Controller集成应用的显著意义和作用,个人仍不是太深刻体会。用Controller来控制虚拟机VM的流量和提供全局的网路视图吗——实现网络智能化。截止目前,笔者尚未接触过这方面的环境或看见相关资料,欢迎交流!
是的,Neutron更像是一种架构,需要众多的开发者和用户去参与其中,同时,还需要注意去其糟粕,取其精华。
个人简介
徐超:任职于九州云信息科技有限公司(上海),从事OpenStack相关工作。个人倾向于研究CI-CT-CD-CD。