文章目录
Neutron构成组件
Neutron是OpenStack的核心组件,其官网对其给出的定位是:NaaS,网络即服务。
既然是要对外提供的服务,那么NaaS就一定包括两层含义:
- 面向外界:neutron为network、subnet、port等网络资源建立了虚拟模型,并为这些虚拟模型提供了REST API、CLI、GUI这些类型的对外接口
所谓CLI和GUI接口指的是命令行和图形化用户接口,其主要面向的对象是租户或管理员;而REST API主要面向的是OpenStack中的其他组件以及OpenStack之外的其他系统 - 内部实现:把Linux原生、其他厂商开发或者已经开源的虚拟网络功能和一些硬件网络功能结合之后,就构建出了虚拟的网络环境
虚拟网络功能一般有三种来源:
1.Linux原生的网络功能,比如Linux Router、Linux Bridge等
2.开源的网络功能,比如OVS等
3.其他厂商开发的产品
理解组件怎样协同工作
neutron接收到REST API请求后,有一个模块WSGI Application专门进行初步处理,然后这个模块通过Python API调用neutron的plugin,plugin做了相应处理后,通过消息队列通知agent,由agent对虚拟网络功能进行配置。
那么我们可以看出,neutron的服务运行大致用到四个部分协同:
- neutron server
- db server
- rabbitmq
- 各种虚拟网络功能
neutron server
neutron server包括两部分:
- 提供和接收API
- 各种plugin
当然neutron server的结构远不止这么简单,如果把neutron server细化,那么应该是这样一个架构:
- core API:对外提供管理network、subnet和port等网络资源的REST API
- extension API:对外提供管理router、load-balanc、firewall等网络资源的REST API
- common service:认证和校验API请求
- neutron core:neutron server的核心处理程序,负责调用相应的plugin处理请求
- core plugin API:定义了core plugin的抽象功能集合,neutron core通过该API调用相应的core plugin
- extension plugin API:定义了service plugin的抽象功能集合,neutron core通过该API调用相应的service plugin
- core plugin:实现core plugin API,在数据库中维护network、subnet和port的状态,并负责调用相应的agent
- service plugin:实现service plugin API,在数据库中维护router、load-balancing、securoty group等资源的状态,并负责调用相应的agent
各种虚拟网络功能
我们已经对虚拟网络功能有了一定的了解,其实不管是虚拟的还是实体的,网络功能的实现就那么几种,想连上外网就需要路由,想自动获取IP就需要DHCP。同理,虚拟机想要实现这些就需要虚拟的网络功能支持。
neutron-dhcp-agent
一看就知道这是一个实现DHCP网络功能的客户端,我们都使用过DHCP,在物理网络中,一般是由路由为我们提供DHCP服务,让我们的设备可以自动获取IP,但是在虚拟网络中,DHCP获取IP的过程改变了 。
neutron通过dnsmasq来为虚拟机提供DHCP服务,dnsmasq通过Linux networknamespace给每一个network在数据链路层划分出一块独立的区域,同样,这些network在网络层也有类似的独立区域。借此,neutron为每个独立的network提供独立的DHCP和路由服务,每个network相互隔离而独立,因此IP也可以重叠
neutron-l3-agent
l3 agent为项目创建虚拟路由,为neutron提供subnet之间的路由服务,其路由功能是通过iptables实现的
neutron-openvswitch-agent
openvswitch-agent可以简单地理解为虚拟交换机
neutron-metadata-agent
虚拟机在启动时需要访问nova-metadata-api服务获取metadata和userdata,这些data存储的是该虚拟机的个人信息,比如hostname、ip等。
但是虚拟机在启动时没有ip,这就形成了一个悖论:我要访问它得到ip,但是我没有ip就不能访问它。
neutron为了解决这个问题就设计了neutron-metadata-agent。它的作用就是让虚拟机能够通过dhcp-agent或l3-agent与nova-metadata-api通信。