传统的网络管理方式很大程度上依赖于管理员手工配置和维护各种网络硬件设备,而云环境下的网络已经变得非常复杂,特别是在多租户场景里,用户随时都可能需要创建、修改和删除网络,网络的连通性和隔离已经不太可能通过手工配置来保证了。
如何快速响应业务的需求对网络管理提出了更高的要求。传统的网络管理方式已经很难胜任这项工作,而 软件定义网络(software-defined networking, SDN)
所具有的灵活性和自动化优势使其成为云时代网络管理的主流。
Neutron的设计目的是实现 网路即服务(Networking as a Service)
。为了达到这一目标,在设计上遵循了基于SDN实现网络虚拟化的原则,在实现上充分利用了Linux系统上的各种网络相关的技术。
SDN模式服务,NeutronSDN(软件定义网络),通过使用它,网络管理员和云计算操作员可以通过程序来动态定义虚拟网络设备。Openstack网络中的SDN组件就是Quantum,但因为版权问题而改名为Neutron
。
Neutron最为核心的工作是对二层物理网络的抽象与管理,物理服务器虚拟化后,虚拟机的网络功能由虚拟网卡(vNIC)提供,物理交换机(Switch)也被虚拟化为虚拟交换机(vSwitch),各个vNIC连接在vSwitch的端口上,最后这些vSwitch通过物理服务器的物理网卡访问外部的物理服务。
对一个虚拟的二层网络结构而言,主要是完成两种网络设备的虚拟化,即物理网卡
和交换设备
。在Linux环境下网络设备的虚拟化主要有以下几种形式:
提到Neutron的虚拟网络功能实现,不得不先提基于Linux内核级的虚拟设备。
基于TAP设备,实现的是虚拟网卡的功能,当一个TAP设备被创建时,在Linux的设备文件目录下将会生成一个对应的字符设备文件(/dev/tapX
文件),而运行其上的用户程序便可以像使用普通文件一样打开这个文件进行读写。
它的实现原理是,通过将其他Linux网络设备绑定到自身的Bridge上,并将这些设备虚拟化为端口。为什么我们已经有了OVS,还要有Linux Bridge 呢?这是因为Linux Bridge实现了qbrxxx设备,提供了OVS无法支持的安全组(Security Group)功能。
Open vSwitch是产品级的虚拟交换机。
OVS也支持包括NetFlow、sFlow等标准的管理接口和协议。通过这些接口可以实现VM流量监控。
Network namespace能创建多个隔离的网络空间,它们有独自的网络配置信息,例如网络设备,路由表,iptables等。
不同网络空间中的虚拟机运行的时候仿佛自己就在独立的网络中。
$ ip netns help
Usage: ip netnslist
ip netns add NAME
ip netns delete NAME
ip netns identify PID
ip netns pids NAME
ip netns exec NAME cmd ...
ip netns monitor
Network Namespace通常与VRF(Virtual Routing Forwarding虚拟路由和转发)一起工作,VRF是一种IP技术,允许路由表的多个实例同时在同一路由器上共存。
使用VETH可以连接两个不同网络命名空间,使用bridge可以连接多个不同的网络命名空间。
Neutron是一种虚拟网络服务,为OpenStack计算提供网络连通和寻址服务。为了便于操作管理,Neutron对网络进行了抽象,有如下基本管理对象:
L3虚拟Router
提供路由器功能。L2虚拟network/subnet/port
提供物理二层网络的功能,并且其二层network
分别由linux bridge
和OpenvSwitch
等共同实现。network是一个隔离的、虚拟二层广播域,也可看成一个Virtual Switch,或者Logical Switch
Neutron支持多种类型的Network,包括Local,Flat,VLAN,VXLAN和GRE。
在L2中,Neutron还提供了一个重要的网络资源抽象Port,其作为虚拟交换机上的一个虚拟端口。当一个port被创建时,默认情况下,会为它分配其指定subnet中可用的IP。
所以,port可以看作虚拟交换机上的一个端口。port上定义了MAC地址和IP地址,当instance的虚拟网卡VIF(Virtual Interface)绑定到port时,port会将MAC和IP分配给VIF。
port与subnet是1对多关系。一个port必须属于某个subnet;一个subnet可以有多个port。
连接租户内同一Network或不同Network之间的子网,以及连接内外网。
分配到每个端口上的IP,类似于物理环境中配置到网卡上的IP。
在物理网络环境中连接OpenStack不同节点的网络,每个物理网络可以支持Neutron中的一个或多个虚拟网路。
自助服务网络,也叫租户网络或项目网络
OpenStack Neutron允许你创建网络接口并接上其他 OpenStack 元件管理的服务 (如 Nova VM),使其能够连接到网络。可以通过不同的后端插件去适应不同的网络设备和软件,为 OpenStack 架构和部署提供灵活性。
上图层级解释:
Neutron-server
:该模块是一个进程,而且是Neutron唯一主要的服务进程,一般运行于控制节点,作为访问Neutron的入口。Neutron plugin
:由core plugins和service plugins组成。担任类似接收请求派发任务的角色。Neutron Agent
:负责接收消息并且执行任务的模块,与neutron plugin对应,扮演的是真正处理工作的角色。Neutron Queue
:用于Neutron各个模块之间相互的通信,neutron-server通过它和各种agents之间交换路由信息。Neutron database
:存放网络信息的数据库,默认使用的是Mariadb数据库。neutron provider
:网络提供者,提供OpenStack网络服务的虚拟机或者物理网络的设备,例如Linux Bridge
、OVS(Open vSwitch)
或者其他可以正常Neutron的物理交换机。类似于各个计算、存储节点被虚拟化为计算、存储资源池,Openstack所在的整个物理网络在Neutron中也被虚拟化为网络资源池。通过对网络资源的划分和可扩展性,Neutron能够为每个租户提供独立的虚拟网络环境。
Neutron分别提供了二层(L2)vSwitch交换
和三层(L3)Router路由
抽象的功能,对应于物理网络环境中的交换机
和路由器
的实现,具体实现了如下功能:
Router
:为租户提供路由、NAT等服务。Network
:对应于一个真实物理网络中的二层局域网(VLAN),从租户的的角度而言,是租户私有的。Subnet
:为网络中的三层概念,指定一段IPV4或IPV6地址并描述其相关的配置信息。它附加在一个二层Network上,指明属于这个network的虚拟机可使用的IP地址范围。其概念主要跟一般实体设备一样,不过在 OpenStack 中通过软件达成的。
结合上图,假设现在要创建一个虚拟网络。整个流程是这样的:
Neutron-server
收到要创建虚拟网络的请求,通过消息队列通知对应的插件
,(先不考虑ML2)假设网络提供者(neutron provider)为OVS(Open vSwitch)。
OVS插件
收到消息后,将需要创建的虚拟网络的信息(名称、ID值等)保存到Neutron database
中并通过消息队列通知运行在各个节点上的agent。
agent
收到消息后会在节点上创建对应设备,例如vlan设备。
RPC是neutron中跨模块进行方法调用很重要的一种方式,client端用于发出rpc消息,server端用于监听消息并进行相应处理。
dhcp agent
、l3 agent
、 firewall agent
以及metering agent
的main函数
中都能找到类似的创建一个Agent rpc
服务端的代码。自上而下分别是:
network/subnet/port
三种抽象的RESTful API;Neutron API实现的主要代码位于/neutron/api
目录。
用于认证和校验API请求;
Neutron-server中的核心处理程序,去调用对应的插件处理请求;
分别对应核心插件和服务插件,核心插件响应核心API,服务插件响应扩展API;
其中,核心插件主要是在数据库中维护network、subnet和port的状态,并负责调用相应的agent在network provider上执行相关操作,比如创建network;服务插件主要是在数据库中维护router、load balance、security group等资源的状态,并负责调用相应的agent在network provider上执行相关操作,比如创建router。
数据库,用于存放对应的数据信息。
ML2 plugin被社区提出来的目的是用于取代所有的Core Plugin,它采用了更加灵活的结构进行实现。作为一个Core plugin,ML2 自然会实现network/subnet/port
这三种核心资源,同时它也实现了包括Port Binding
等在内的部分扩展资源。
ML2实现了网络拓扑类型(Flat、VLAN、VXLAN、GRE)和底层虚拟网络(linux bridge、OVS)分离的机制,并分别通过Driver的形式进行扩展。其中,不同的网络拓扑类型对应着type driver,由type manager管理,不同的网络实现机制对应着Mechanism Driver(比如Linux bridge、OVS、NSX等),由Mechanism Manager管理。
ML2 Plugin的主要工作是管理虚拟网络资源,保证数据正确无误,具体物理设备的设置则由Agent来完成,这里我们宏观阐述下Neutron项目中的OVS Agent
。
基于Plugin rpc提供的信息,OVS Agent负责在计算节点和网络节点上,通过对OVS虚拟交换机的管理将一个Network映射到物理网络,这需要OVS Agent去执行一些linux 网络和OVS相关的配置与操作,Neutron通过如下两个库提供了最为基础的操作接口,从而可以通过Linux Shell命令完成OVS的配置。 比如:
通过shell执行各种ovs-vsctl操作。 代码目录:neutron/agent/common
通过linux的br-ctl命令操作Linux的veth、router、namespace等。 代码目录:neutron/agent/linux/