Neutron 的设计目标是实现“网络即服务”,为了达到这一目标,在设计上遵循了基于“软件定义网络”实现网络虚拟化的原则,在实现上充分利用了 Linux 系统上的各种网络相关的技术。理解了 Linux 系统上的这些概念将有利于快速理解 Neutron 的原理和实现。

1. OpenStack经典部署模式
  • 三节点(控制节点,计算节点,网络节点)部署模式
  • openstack运维指南 openstack操作手册_虚拟化

  • Vlan模式与Gre模式对比
  1. Vlan模式
    在vlan模式下,vlan tag的转换是在br-int和br-ethx两个网桥上进行,将openVswitch虚拟的vlanId转换为真是的物理的vlanId。即br-int负责从int-br-ethX过来的包(带外部vlan)转换为内部vlan,而br-ethx负责从phy-br-ethx过来的包(带内部vlan)转化为外部的vlan。
    同时,在VLAN模式下,没有br-tun通道网桥。
  2. GRE模式
    Neutron网络数据包进出Internet过程如下图:
2. Linux网络基础
  • bridge:网桥,Linux中用于表示一个能连接不同网络设备的虚拟设备,linux中传统实现的网桥类似一个hub设备,bridge相连的所有接口都可以收到数据包。而ovs管理的网桥一般类似交换机。
  • br-int:bridge-integration,综合网桥,常用于表示实现主要内部网络功能的网桥。
  • br-ex:bridge-external,外部网桥,通常表示负责跟外部网络通信的网桥。
  • GRE:General Routing Encapsulation,一种通过封装来实现隧道的方式。在openstack中一般是基于L3的gre,即original pkt/GRE/IP/Ethernet
  • VETH:虚拟ethernet接口,通常以pair的方式出现,一端发出的网包,会被另一端接收,可以形成两个网桥之间的通道。虚拟网络对VETH,实现了不同虚拟网络的联通。
  • qvb:neutron veth, Linux Bridge-side
  • qvo:neutron veth, OVS-side
  • TAP设备:模拟一个二层的网络设备,可以接受和发送二层网包。
  • TUN设备:模拟一个三层的网络设备,可以接受和发送三层网包。
  • iptables:Linux 上常见的实现安全策略的防火墙软件。
  • Vlan:虚拟 Lan,同一个物理 Lan 下用标签实现隔离,可用标号为1-4094。
  • VXLAN:一套利用 UDP 协议作为底层传输协议的 Overlay 实现。一般认为作为 VLan 技术的延伸或替代者。
  • namespace:用来实现隔离的一套机制,不同 namespace 中的资源之间彼此不可见。
3. Neutron架构解析
  • Neutron,其实和其他的OpenStack组件差不多,他都是一个中间层,自己基本不干具体的活,通过插件的机制,调用第三方的组件来完成相关的功能。
  • 对于Neutron来说,在Havana版本前,支持Linux Bridge和Openvswitch两种插件。后来发现直接通过Neutron去调用插件的方式,有些不够理想。
  1. linux bridge和ovs,实现功能的代码,其实有很大部分是重复的,这样让人感觉很不爽
  2. 出于功能和性能的考虑,有些场景下,需要同时使用linux bridge和OVS,采用这种直接调用插件的模式,是无法实现的。
  • 在H版本以后,社区就推出一个Neutron插件 Modular Layer 2 (ml2) plugin,这个插件底下调用linux bridge和ovs两个Driver。
  • linuxbridge和OVS,可以干的活是支持不同的网络,目前这两种Driver,都可以实现下面几种网络功能。
1. local
2. flat
3. vlan
4. vxlan
5. GRE (linux bridge 不支持)
那么这5种网络里,local网络,主要是用于测试,GRE网络,目前社区已经基本处于维护,大家基本也可以不考虑。所以大家只需要了解其中3种就可以。
  • OpenStack的网络里,可以有4种的网络流量
  1. 管理网络:消息队列和数据库访问的网络
  2. API网络:外部调用API
  3. External:连接外网(provider 网络)
  4. Guest:虚拟机互相通讯网络 (Tenant 网络)
    4种网络里,和Neutron有关的就是External和Guest,Provider网络和Tenant 网络。
    对于Provider 网络和Tenant 网络,技术实现基本都是一样的,区别仅仅在于
    Provider 网络,是有管理员创建
    Tenant 网络,是由用户自己创建
    Provider 网络,常用的网络是:Flat和Vlan。vxlan基本是没有使用的可能性。Tenant 网络,可以设置的选项就是 vlan,vxlan和flat,local主要是测试使用。
4. Neutron模块分析
  • 类似于各个计算、存储节点被虚拟化为计算、存储资源池,Openstack所在的整个物理网络在Neutron中也被虚拟化为网络资源池。通过对网络资源的划分和可扩展性,Neutron能够为每个租户提供独立的虚拟网络环境。
    1)位于最上层的Neutron Server充当一个门派中的“掌门人”角色(RESTful Server),负责接受来自外部门派(项目)的API请求,比如Nova API创建网络的请求。
    2)位于中间层的Neutron plugin充当一个门派中的“信使”角色,负责传达最高层指令给下面的人。
    3)位于下层的Neutron Agent充当一个门派中“干活”角色,负责执行一些具体的任务和操作。
  • openstack运维指南 openstack操作手册_虚拟化_02

  • 1)neutron-server作为Neutron中的唯一一个服务进程,承担着接受用户REST API请求并分发处理的任务。
    2)Exten API :L3( router)、L4(tcp/udp firewall)及L7(load balancer)
    3)neutron-server(相当于REST API Server)负责将收到的REST API请求交由Plugin来进行相关处理。可以看出,这其实就是一个web服务器要完成的事情,将http请求转化为对资源的操作(通过plugin的方法调用),并返回响应。
  • Neutron分别提供了二层(L2)vSwitch交换和三层(L3)Router路由抽象的功能,对应于物理网络环境中的交换机和路由器实现。具体实现了如下功能:
    1) Router:为租户提供路由、NAT等服务。
    2)Network:对应于一个真实物理网络中的二层局域网(VLAN),从租户的的角度而言,是租户私有的。
    3) Subnet:为网络中的三层概念,指定一段IPV4或IPV6地址并描述其相关的配置信息。它附加在一个二层Network上,指明属于这个network的虚拟机可使用的IP地址范围。
  • openstack运维指南 openstack操作手册_openstack运维指南_03

  • Neutron中最为核心的工作便是对二层物理网络network的抽象与管理。
    虚拟机的网络功能由虚拟网卡(vNIC)提供,Hypervisor可以为每个虚拟机创建一个或多个vNIC,从虚拟机的角度出发,这些vNIC等同于物理的网卡,为了实现与传统物理网络一样的网络功能,与物理网卡一样,Switch也被虚拟化成虚拟交换机(OpenvSwitch),各个vNIC连接在vSwitch的端口(br-int)上,最后这些vSwitch通过物理服务器的物理网卡访问外部的物理网络。
  • 对一个虚拟的二层网络结构而言,主要是完成两种网络设备的虚拟化,即物理网卡和交换设备。在Linux环境下网络设备的虚拟化主要有以下几种形式:
  1. TAP/TUN/VETH
    提到Neutron的虚拟网络功能实现,不得不先提基于Linux内核级的虚拟设备。
    TAP/TUN/VETH是Linux内核实现的一对虚拟网络设备,TAP工作在二层,收发的是 MAC 层数据帧;TUN工作在三层,收发的是 IP 层数据包。Linux 内核通过TAP/TUN设备向绑定该设备的用户程序发送数据,反之,用户程序也可以像操作硬件网络设备一样,通过TAP/TUN设备接收数据。
    基于TAP设备,实现的是虚拟网卡的功能,当一个TAP设备被创建时,在Linux的设备文件目录下将会生成一个对应的字符设备文件(/dev/tapX文件),而运行其上的用户程序便可以像使用普通文件一样打开这个文件进行读写。
    VETH设备总是成对出现的,接收数据的一端会从另一端发送出去,理解为一根虚拟的网线即可。
  2. openstack运维指南 openstack操作手册_openstack运维指南_04

  3. Linux Bridge
    Linux Bridge(Linux内核实现的网桥)是工作在二层的虚拟网络设备,功能类似于物理的交换机。
    它的实现原理是,通过将其他Linux网络设备绑定到自身的Bridge上,并将这些设备虚拟化为端口。为什么我们已经有了OVS,还要有Linux Bridge 呢?这是因为Linux Bridge实现了qbrxxx设备,提供了OVS无法支持的安全组(Security Group)功能。
  4. openstack运维指南 openstack操作手册_网络_05

  5. Open vSwitch
    对于云计算中的虚拟网络而言,交换设备的虚拟化是很关键的一环,vSwitch负责连接vNIC与物理网卡,同时也桥接同一物理服务器内的各个VM的vNIC。
    因此,我们可以像配置物理交换机一样,将接入到OpenvSwitch(需要指出的是在多个以上时,vSwitch是分布式虚拟交换机)上的各个VM分配到不同的VLAN中实现网络隔离,并且,我们也可以在OVS端口上为VM配置QOS,同时OVS也支持包括NetFlow、sFlow等标准的管理接口和协议。从而,通过这些接口可以实现VM流量监控的任务。
    运行在云环境中各种或相同虚拟化平台上的多个vSwitch实现了分布式架构的虚拟交换机。一个物理服务器上的vSwitch可以透明的与其他服务器上的vSwitch连接通信。
  6. openstack运维指南 openstack操作手册_API_06

  • neutron具体技术实现
  • openstack运维指南 openstack操作手册_openstack_07

5. 数据包通讯流程
  • a) 内网vm数据包与外网Internet通讯流程