目录
1、网络架构
2、neutron模块
2.1 plugin
2.2 agent
2.3 neutron的两种部署方式
2.4 neutron server
2.4.1 ML2 Core Plugin
2.4.2 Service Plugin / Agent
2.4.3 neutron架构的小结
2.5 linux bridge实现neutron网络
2.5.1 linux-bridge mechanism driver
2.5.2 linux bridge中的几种网络设备和网络类型
2.5.3 Local Netwrok
2.5.4 Flat Network
openvswitch与linux-bridge相比较而言,openvswitch支持的网络类型更加丰富,应用也比较广泛,因此图示直接使用OVS。linux-bridge支持local, flat, vlan和vxlan 四种network type,目前不支持gre,相比较而言openvswitch支持GRE网络;
OpenStack 至少包含下面几类网络流量
管理网络:用户管理所有节点的网络;
内部网络:计算节点与网络节点通过内部网络通信,tenant network(租户网络,租户自己创建管理,网络之间可以重合);
外部网络:内部的VM与外部物理网络间使用外部网络通信使用,一般由管理员创建并赋予相应属性,称为public network(或者叫provider network?);
主要包含以下几个部分:
(1)neutron-server:可以理解为类似于nova-api那样的一个组件,一个专门用来接收neutron REST API调用的服务器。负责将不同的rest api发送到不同的neutron-plugin。接受和路由API请求到网络plug-in。一般部署在控制节点(controller),负责通过Neutron-server响应的API请求;
(2)neutron-plugin:可以理解为不同网络功能(例如创建端口(ports)、网络(Networks)、子网(Subnets)等)实现的入口,现在大部分都是软件定义网络,各个厂商都开发自己的plugin(插件)。neutron-plugin接收netron-server发过来的rest api,向neutron database完成一些信息注册(比如用户要建端口)。然后将具体要执行的业务操作和参数通知给自身对应的neutron-agent。Openstack的plug-ins一般支持Open vSwitch、Linux Bridging、思科物理/虚拟交换机等等。一般Core plugin 和service plugin已经集成到neutron-server中,不需要运行独立的plugin服务。
(3)agent:常见的agent包括L3、DHCP、plug-in agent;一般网络节点需要部署Core Plugin的代理和service Plugin的代理,计算节点也需要部署Core Plugin的代理,通过该代理才能建立二层连接。
(4)messaging queue:在neutron-server和agents之间路由信息,同时作为一个数据库存储plug-ins的网络状态;
模块之间调用关系:(此段为摘抄内容)
(5)Client(客户端)是指使用Neutron服务的应用程序,可以是命令行工具(脚本)、Horizon和Nova计算服务等;
(6)Neutron-database(数据库,默认使用MariaDB)用于存放OpenStack的网络状态信息,包括网络、子网、端口、路由器等;
(7)network provider:提供网络服务的物理或者虚拟网络设备,例如 Linux Bridge,Open vSwitch 或者其他支持 Neutron 的物理交换机;
举列说明:创建一个Vlan 10虚拟网络的流程。
几点说明:
agent | 描述 |
L3 agent (neutron-l3-agent) | 提供L3/NAT转发,使租户内的虚机实例被外部网络访问 |
dhcp agent (neutron-dhcp-agent) | 为租户网络提供dhcp功能 |
metering agent (neutron-metering-agent) | 提供L3数据流量的监控、计算 |
metadata agent | 是提供一个机制给用户,可以设定每一个instance 的参数 |
OpenvSwitch agent | 使用Open vSwitch来实现VLAN, GRE,VxLAN来实现网络的隔离,还包括了网络流量的转发控制 |
plug-in agent ( neutron-*-agent ) | 在每个hypervisor上运行以执行本地vSwitch配置。 这个插件是否运行取决于使用的插件,有些插件不需要代理。 |
neutron-lbaas-agent | 提供LB的服务 |
neutron-firewall-agent | 提供防火墙服务 |
core plugin和service plugin都已集成到neutron server中,不需要单独部署。
方式一:控制节点+计算节点
说明:(1)控制节点和计算节点都需要部署 core plugin 的 agent,因为通过该 agent 控制节点与计算节点才能建立二层连接;(2)可以部署多个控制节点和计算节点;
方式二:控制节点+网络节点+计算节点
说明:方式二更适合大规模的openstack环境,控制与网络节点分离开,控制节点只通过neutron server响应API请求,然后调用网络节点的plugin插件;网络节点单独拿出来负责数据的交换,路由以及 load balance等高级网络服务。
整体架构:neutron=API+plugin
调用关系:通过仪表盘/脚本/Nova调用plugin,plugin再调用对应的agent;
neutron网络的开放性:支持多种network provider。只需要不同的netwrok provider开发出对应的plugin和agent既可。但弊端是(1)只能在 OpenStack 中使用一种 core plugin;(2)不同plugin之间代码重复率高,开发难度大。ML2 Core Plugin解决了传统Core Plugin的这个问题。
使用ML2 Core Plugin的需求是:(1)传统Core Plugin无法同时提供多种network provider;(2)开发工作量大。
采用 ML2 plugin 后,可以在不同节点上分别部署 linux bridge agent, open vswitch agent, hyper-v agent 或其他第三方 agent。ML2 不但支持异构部署方案,同时能够与现有的 agent 无缝集成:以前用的 agent 不需要变,只需要将 Neutron server 上的传统 core plugin 替换为 ML2。
ML2 对二层网络进行抽象和建模,引入了 type driver 和 mechansim driver。type driver 负责维护网络类型的状态,执行验证,创建网络等,支持vlan、vxlan、gre、flat、local网络;mechanism driver 负责获取由 type driver 维护的网络状态,并确保在相应的网络设备(物理或虚拟)上正确实现这些状态。
mechanism driver 有三种类型:(1)Agent-based:包括 linux bridge, open vswitch 等。(2)Controller-based:包括 OpenDaylight, VMWare NSX 等。(3)基于物理交换机;此外,涉及L2 population driver,其作用是优化和限制 overlay 网络中的广播流量。
Core Plugin/Agent 负责管理核心实体:net, subnet 和 port。而对于更高级的网络服务(防火墙、router、LB等),则由 Service Plugin/Agent 管理。
如下图:
更深入的理解:
neutron默认使用ml2的service plugin,这个在配置文件有体现:
vi /etc/neutron/neutron.conf
[DEFAULT]
rpc_backend = rabbit
core_plugin = ml2
......
需要在控制节点与计算节点中指定的/etc/neutron/plugins/ml2/ml2_conf.ini的文件中将mechanism_drivers设定为openvswitch或者linux bridge,可以写多个,ML2 会负责加载
[ml2]
type_drivers = vlan,vxlan
tenant_network_types = vlan,vxlan
mechanism_drivers = ml2_h3c,openvswitch
......
在 linux bridge 环境中,存在下面的网络设备类型(不同的网络里不一样):
linux-bridge 支持 local, flat, vlan 和 vxlan 四种 network type,目前不支持 gre。
local network 的特点是不会与宿主机的任何物理网卡相连,因此该宿主机上的VM不能与宿主机外部的网络通信,完全隔离。对于每个 local netwrok,ML2 linux-bridge 会创建一个 bridge,instance 的 tap 设备会连接到 bridge。对于同一个bridge,其下的instance属于同一个Local network,每个instance通过各自的tap设备连接到bridge,从可以互相通信。不同bridge之间不能相互通信。网络架构如下图所示:
配置文件中需要配置type_drivers的类型有local,/etc/neutron/plugins/ml2/ml2_conf.ini,并设置普通租户创建的网络类型(admin用户可以指定网络类型)
[ml2]
type_drivers = vlan,vxlan
tenant_network_types = vlan,vxlan
mechanism_drivers = ml2_h3c,openvswitch
extension_drivers = ml2_extension_h3c
......
通过WEB GUI创建相应的虚机VM,会自动创建一个port,该port信息包含ip和mac。宿主机根据该port信息创建相应tap设备,tap会关联相应的bridge,同时映射成虚机的虚拟网卡(VIF)。
总结几点:
由于其只限制在单个宿主机中通信,无法跨网络和跨主机,在实际的应用中基本很少用到local network,可以仅作为后续学习复杂网络的基础。
flat network 是不带 tag 的网络,要求宿主机的物理网卡直接与 linux bridge 连接,并且flat network与网卡是一一对应的关系,网络架构如下图所示。
同样,配置文件中需要配置type_drivers的类型为flat网络,/etc/neutron/plugins/ml2/ml2_conf.ini,并设置普通租户创建的网络类型(admin用户可以指定网络类型)
[ml2]
type_drivers = flat
tenant_network_types = flat
......
此外还需要定义flat网络的标签(标签可以为任意字符串,需要保证控制和节点的命名保持一致,且后续在创建flat网络时也需要填写该标签),并制定标签与网卡之间的对应关系(各个计算节点的标签必须一致,但标签网卡对应关系可以不同。可以填写多个标签与各网卡之间一一对应,之间用逗号隔开,因此也就是对应多块网卡):