neutron包括了如下几个组成部分: rest API定义,neutron server和agent。

Rest API
包括标准API( Networking Rest API)和扩展API( Networking Rest API extensions)。该部分是neutron的对外访问接口,neutron的所有功能全部通过这些api对外展现。

标准api
neutron的前身是nova-network。nova-network只实现了L2(OSI网络模型的第二层,数据链路层)的网络服务。这一层实现对虚拟机来说,相当于一块网卡,并且网卡接入了一个交换机。如果不同的虚拟机网卡都接入了同一个交换机(或者不同的交换机,但交换机之间有级联),这些虚拟机就都属于同一个网络了,可以互相通信。nova-network还提供了DHCP,floating IP功能。

nova-network没有提供L3的功能,这就导致了一个限制,不同的网络之间没法通信(1个用户创建了2个网络,并且需要两个网络中的虚拟机互相通信)。这个问题可以通过floating ip来解决。具体介绍可以参考这篇文章http://www.mirantis.com/blog/vlanmanager-network-flow-analysis/
其中的scenario 6和scenario 7。

标准api的定义基于nova-network中的L2功能,核心的rest资源(resource)有network,subnet,port。

扩展API
neturon项目目标是能够提供更多的网络服务(涵盖所有网络层次)。扩展API就是neutron为了描述这些新加的网络服务。目前已有的扩展有L3(router),L4(TPC/udp firewall)及L7(http/https load balancer)。随着neutron项目的不断成熟,扩展API会逐渐变成标准api。

这些API都在openstack的官方文档中有详细说明,可以参考。

Neutron server(或者说是Rest API server)
实现neutron定义的API,包括标准和扩展两部分。neutron server中又包括:
rest api:
实现标准API。

extension:
实现扩展API。neutron中定义了3中类型的extension,分别是:
ResourceExtension

"""Add top level resources to the OpenStack API in Neutron."""


ActionExtension
"""Add custom actions to core Neutron OpenStack API controllers."""

RequestExtension
    """Extend requests and responses of core Neutron OpenStack API controllers.
    Provide a way to add data to responses and handle custom request data
    that is sent to core Neutron OpenStack API controllers.
    """
目前neutron中的extension主要是第一种:resource extension。resource extension除了增加新的资源类型外,还可以给已有的资源增加属性(Extended attributes for core resources)

rest api和extension只是实现了rest的前端框架部分,解析HTTP请求,并将该请求转变为对一个资源的操作。对资源的操作代码不在前端实现,而是在后面介绍的plugin中实现。

core plugin:
rest的后端实现。前端的rest框架会调用plugin的相应方法来实现rest api规定的语义。
core plugin会有标准API的实现,及对network,subnet和port的各种操作。除了标准API外,还会实现一些extension API。不同的Plugin实现的extension API是不一样的。可以查看plugin代码中的_supported_extension_aliases属性。

比如linux bridge plugin:
    _supported_extension_aliases = ["provider", "external-net", "router",
                                    "ext-gw-mode", "binding", "quotas",
                                    "security-group", "agent", "extraroute",
                                    "l3_agent_scheduler",
                                    "dhcp_agent_scheduler"]
比如openvswitch plugin:
    _supported_extension_aliases = ["provider", "external-net", "router",
                                    "ext-gw-mode", "binding", "quotas",
                                    "security-group", "agent", "extraroute",
                                    "l3_agent_scheduler",
                                    "dhcp_agent_scheduler",
                                    "extra_dhcp_opt",
                                    "allowed-address-pairs"]
可以看到ovs比linux bridge多支持了2个extension: extra_dhcp_opt和allowed-address-pairs。目前neturon中提供了很多的core plugin。每种plugin最核心的功能就是L2的支持,不同的plugin采用不同的技术实现。ovs和linuxbridge都是用软件方法来实现虚拟交换机。有些Plugin可以使用硬件设备实现对虚拟机的支持,如cisco等。

网络虚拟化技术
关键就是虚拟交换机(virtual ethernet bridging or VEB)。目前VEB有软件和硬件的实现方式。
软件实现的代表就是linux bridge和openvswitch。
硬件实现目前主要有两个技术方案:IEEE 802.1Qbg Edge Virtual Bridging和IEEE 802.1BR Bridge Port Extension。可在网上查找先关资料。
IEEE 802.1Qbg Edge Virtual Bridging是由HP提出的方案,并被众多厂商支持;EEE 802.1BR是有cisco提出的方案。目前两个方案应该还没有成为正式标准。

网络类型(tenant network type)
neutron定义了几种网络类型(网络拓扑):local, flat, vlan, gre和vxlan。网络类型的实现需要core plugin的支持。
linux bridge支持:local和vlan; ovs支持local, vlan, gre和vxlan。

service_plugins
除了core plugin外,neutron中又引入了service plugin的概念。service plugin用来实现extension API。对于extension是放在core plugin还是service plugin来实现,一般遵循:
如果是增加了新的资源类型并且该资源不依赖于L2层的实现,则放在service plugin中实现;如果是扩展已有资源(network, subnet,port)的属性,则在core plugin中。
新增资源如:firwall, router, loadbalancer,vpn等。这些都有相应的service plugin: FirewallPlugin,L3RouterPlugin,LoadBalancerPlugin,VPNPlugin等。

目前很多core plugin也实现了router的功能,如linux bridge和openvswitch。从L3RouterPlugin的说明文档中来看,这些应该放在service plugin中。services.l3_router.README
"This service plugin implements the L3 routing functionality (resources router
and floatingip) that in earlier releases before Havana was provided by core
plugins (openvswitch, linuxbridge, ... etc).
Core plugins can now choose not to implement L3 routing functionality and
instead delegate that to the L3 routing service plugin."

每个neturon server中可以加载多个service plugiin,但只能加载一个core plugin。neturon引入了ML2 core plugin,解决只能加载一个core plugin的限制。ML2 core plugin允许同时加载多个mechanism driver,可以达到同时使用不同的L2实现技术的效果。

neturon server启动时候,根据配置文件动态加载相应的core plugin及service plugins。neturon server中会对收到的rest api请求进行解析,并最终转换成对该plugin(core or service)中相应方法的调用。具体工作原理类似《openstack学习之RPC服务实现分析》讲到的Service和Manager的工作方式,可以参看该文章。

数据模型
主要在db目录中,定义neutron中的主要数据模型,实现数据模型在数据库中的持久化操作。

agent
agent用来辅助plugin(core or service)完成其功能。plugin的某些功能需要操作远程系统,这些情况一般都通过该系统上的agent来实现。根据功能的不同,agent可以有很多种:

core agent:
辅助core plugin的agent叫core agent(or L2 agent)。这个agent由core plugin还提供,放在core plugin的代码目录中。L2 agent需要安装在所有需要接入虚拟网路的节点上(如compute node, dhcp node, L3 router node等)。L2 agent会根据neutron中定义的网络模型,来配置底层的虚拟网络实现(如linux bridge,openvswitch等),以实现neutron中的网络定义。

dhcp agent:
负责给虚拟机分配IP地址。core plugin会调用dhcp agent完成ip管理分配等功能。core plugin通过继承DhcpAgentSchedulerDbMixin来实现对dhcp agent的操作。dhcp agent可以安装在任何节点上,neturon支持dhcp agent集群(系统中运行多个dhcp agent实例),并且可以通过配置文件制定dhcp agent的调度策略。

L3 agent:
提供路由(router)功能,可以连接不同的tenant network。可以实现tenant network和外网(public)的连接,是外部用户可以直接访问改虚拟机。如可以给虚拟机分配一个Internet IP地址,就可以通过Internet访问这台机器。
service plugin(or core plugin)通过继承L3AgentSchedulerPluginBase对L3 agent进行操作。和DHCP agent类似,l3 agnet可以安装在任何节点上,neturon支持l3 agent集群(系统中运行多个l3 agent实例),并且可以通过配置文件制定l3 agent的调度策略。

其他agents:
还有一些其他的agent,如metadata agent, metering agent, loadbalancer agent等,读者可自行查看。

plugin和agent
plugin和agent之间是双向交互的。plugin在实现rest api的过程中会调用agent;agent也会根据所在节点上的状态来调用plugin来更新网络的状态。比如neturon中创建的port状态默认是down的,core agent在配置好该port会更新改port的状态为up,即通过调用plugin完成。每个plugin会创建一个RPC server用来监听agent的请求。

这几个组成部分就介绍完了,后面会继续写一下neturon的运行时状态及分析一下这几个部分之间的交互。



Logo

CSDN联合极客时间,共同打造面向开发者的精品内容学习社区,助力成长!

更多推荐