一、Neutron概述
网络虚拟化下的资源管理。Neutron 的设计目标是实现网络即服务(Networking as a Service),在设计上遵循了基于 SDN 实现网络虚拟化的原则,在实现上充分利用了 Linux 系统上的各种网络相关的技术。
二、Neutron 功能
Neutron 为整个 OpenStack 环境提供网络支持,包括二层交换,三层路由,负载均衡,防火墙等。Neutron 提供了一个灵活的框架,通过配置,无论是开源还是商业软件都可以被用来实现这些功能。
1、二层交换Switch
L2其实是指七层网络协议中的第二层数据链路层,它的传输是以mac地址为基础。Nova 的 Instance 是通过虚拟交换机连接到虚拟二层网络的。Neutron 支持多种虚拟交换机,包括 Linux 原生的 Linux Bridge 和 第三方Open vSwitch。
Open vSwitch (OVS)是一个开源的虚拟交换机,它支持标准的管理接口和协议。比Linuxbridge的功能更强大,是为了配合neutron而产生的。
利用 Linux Bridge 和 OVS,Neutron 除了可以创建传统的 VLAN 网络,还可以创建基于隧道技术的 Overlay 网络,比如 VxLAN 和 GRE(Linux Bridge 目前只支持 VxLAN,此外,由于GRE容易单点故障已经被弃用)。
2、三层路由 Routing
L3指网络层:是以ip地址为基础 。Instance 可以配置不同网段的 IP,Neutron 的 router(虚拟路由器)实现 instance 跨网段通信。Neutron从Juno版开始正式加入的DVR(Distributed Virtual Router)服务,它将原本集中在网络节点的部分服务分散到了计算节点上。可以通过namespace中使用ip route或者iptables实现路由或NAT,也可以通过openflow给OpenvSwitch下发流表来实现。
3、负载均衡
提供了将负载分发到多个 instance 的能力。LBaaS 支持多种负载均衡产品和方案,不同的实现以 Plugin 的形式集成到 Neutron,目前默认的 Plugin 是 HAProxy。所以不用搭建LVS,直接设置策略就可以。
4. 防火墙
Security Group 通过 iptables 限制进出 instance 的网络包。
FirewallasaService FWaaS,限制进出虚拟路由器的网络包,也是通过 iptables 实现。
防火墙的本质都是使用内核挂载的filter模块,只不过实现的方式有所区别,firewalld是利用分区实现,iptables是利用三表五链实现。Neutron有两种方式来保障instance和网络的安全性,分别是安全组以及防火墙功能,均可以通过iptables来实现,前者是限制进出instance的网络包,后者是进出虚拟路由器的网络包。
网络-network
1. Local:本地的一个Linux Bridge,除了虚拟机的虚拟网卡不连接其他的网络设备,实际场景很少使用,可以忽略。网络中的 instance 只能与位于同一节点上同一网络的 instance 通信,local 网络主要用于单机测试。
2. Flat:不带vlan tag的网络,其实就是交换机形成的二层网络,和网桥一样,相当于Local网络的Linux Bridge连接到一个物理网卡,该网络中的instance能与同网络的instance通信,且可以跨多个节点,flat 网络中的 instance 能与位于同一网络的 instance通信,并且可以跨多个节点,实际场景也很少用到。
3. VLAN:可以跨节点,是具有 802.1q tagging 的网络,一共可以划分4095个子网。vlan 是一个二层的广播域,同一 vlan 中的instance 可以通信,不同 vlan 只能通过 router 通信。vlan 网络可以跨节点,是应用最广泛的网络类型。目前是私有云网络应用较多。
4. VXALN:是基于隧道技术的 overlay 网络,通过唯一的VNI区分于其他 vxlan 网络。vxlan中数据包通过VNI封装成UPD包进行传输,因为二层的包通过封装在三层传输,能够克服vlan和物理网络基础设施的限制。是VLAN的扩展,VxLAN有1600万个VNI编号,足够在云计算平台使用了。vxlan 网络通过唯一的 segmentation ID(也叫VNI)与其他 vxlan 网络区分。vxlan 中数据包会通过 VNI 封装成 UPD 包进行传输。因为二层的包通过封装在三层传输,能够克服 vlan 和物理网络基础设施的限制。Linuxbridge只支持VxLAN。
5. GRE:与vxlan类似的一种overlay网络,主要区别在于使用 IP 包而非 UDP 进行封装。不同 network 之间在二层上是隔离的。现在已经被弃用了。
network 必须属于某个 Project( Tenant 租户),Project 中可以创建多个 network。network 与 Project 之间是 多对1的关系。
注意:虚拟专用网络,还没有加到openstack的功能中。
子网-subnet
subnet 是一个 IPv4 或者 IPv6 地址段。instance 的 IP 从 subnet 中分配。每个 subnet 需要定义 IP 地址的范围和掩码。 subnet 与 network 是 1对多 关系。一个 subnet 只能属于某个 network;一个 network 可以有多个 subnet,这些 subnet 可以是不同的 IP 段,但不能重叠。例如,以下这两种设置都是被允许的:
port-端口
port 可以看做虚拟交换机上的一个端口。port 上直接定义了 MAC 地址和 IP 地址,当 instance的虚拟网卡 VIF(Virtual Interface) 绑定到 port 时,port 会将 MAC 和 IP 分配给 VIF。而原来我们做网桥时,是虚拟机的网卡eth0在物理机里对应的是vnet0,vnet0是加在br0上的。
port 与 subnet 是 1对多 关系。一个 port 必须属于某个 subnet;一个 subnet 可以有多个port。有了port直接定义MAC与IP就不用使用ARP与RARP协议了。
综上所述,我们可以知道neutron定义的三大网络资源只是二层的网络资源,与三层的没有关系。
Neutron架构
core API ——对外提供管理 network, subnet 和 port 的 RESTful API。
extension API —— 对外提供管理 router, load balance, firewall 等资源 的 RESTful API。
common service ——认证和校验 API 请求。
neutron core Neutron server 的核心处理程序,通过调用相应的 Plugin 处理请求。
core plugin API 定义了 Core Plgin 的抽象功能集合,Neutron Core 通过该 API 调用相应的 Core Plgin。
extension plugin API 定义了 Service Plgin 的抽象功能集合,Neutron Core 通过该 API调用相应的 Service Plgin。
core plugin API 实现了 Core Plugin API,在数据库中维护 network, subnet 和 port 的状态,并负责调用相应的 agent 在 network provider 上执行相关操作,比如创建 network。
service plugin 实现了 Extension Plugin API,在数据库中维护 router, load balance,
security group 等资源的状态,并负责调用相应的 agent 在 network provider 上执行相关操作,比如创建 router