Neutron
是 OpenStack
项目中负责提供网络服务的组件,它基于SDN(软件定义网络)
的思想,实现了网络虚拟化
下的资源管理。本文介绍 OpenStack Neutron 架构。
Neutron 架构
说明:
Neutron Server
:部署在controller node
上,提供 REST API
,把请求存放到消息队列
Neutron Plugin
:从消息队列获取请求 -> 存放DB,并发送到消息队列 -> Neutron Agent处理消息
Core Plugin
:neutron
把三类资源定义为核心资源,分别是network
、subnet
、port
,这三类的实现由 Core Plugin
来实现
ml2 plugin
:厂商对 L2 层网络资源的具体实现
Service Plugin
:加载 Core Plugin
之后就加载 Service Plugin
,因为 Core Plugin
和 Service Plugin
有很多相似的地方,所以 Core Plugin
很多地方也都按照 Service Plugin
去处理
Neutron Agent
:部署在compute node
和network node
上的进程,从消息队列获取 Neutron Plugin
请求,并处理
agent driver
:被agent调用,具体干活的人
neutron 的进程
一个完整的neutron部署包含多台主机和多个服务
- neutron-server(controller node)
- Layer2 agent(compute node & network node)
- 利用ovs
- 负责提供network segment
- 负责租户网络的隔离
- Layer3 agent(network node)
- 负责东西、南北的路由
- 负责额外的功能,如: FWaaS、LBaas
代码
相关类
- APIRouter:暴露neutron已知的resource的URL的映射
- extension:具体的api扩展。以Securitygroup为例,get_resources方法中新建了一个controller,并将具体的plugin传给了controller,这个extension的api调用会被这个controller处理,controller会调用plugin中的相应方法。
- extensions filter:rest请求经过的一个filter,具体由ExtensionMiddleware干活
- ExtensionMiddleware:初始化ExtensionManager,并从中获得所有extension的resource并将controller和URL映射。
- ExtensionManager:在给定path下扫描所有extension的py文件、加载、并提供一些查询方法。
- NeutronManager: 加载配置文件中设置的plugin
- NeutronDbPluginV2:做与 Core Plugin 相关的数据库操作
- IPAM(ip地址管理)用于subnets公用的抽象资源的管理,例如DHCP,DNS,CIDR等。
程序入口点
- 位于
setup.cfg
-> [entry_points]
-> console_scripts
,很很多个main函数入口,安装后,这些命令位于/usr/bin/
,可以直接执行。
- 程序入口点举例:
neutron-server = neutron.cmd.eventlet.server:main_wsgi_eventlet
- 创建
eventlet pool
,启动wsgi server
,具体做事情的是api-paste.ini
中定义的app:neutron
,请求达到时,经过一系列的filter
后,达到APIRouter
处理
setup.cfg
neutron的全局描述,详见源码
- metadata
- 所有配置文件
- 所有console_scripts命令行
- core_plugins的列表(不过目前只剩ml2)
- service_plugins的列表(lb,vpn,qos,fw等等)
- ml2 type_drivers列表
- ml2 mechanism_drivers列表
- ml2 extension_drivers列表
- 缓存后端(memcache)
- ipam_drivers列表(目前只有ipam的db实现,可以指定external ipam)
- l2 extension: QosAgentExtension
- qos agent_drivers: QosOVSAgentDriver
进程举例
devstack环境下进程举例:
- q-svc:
/usr/bin/neutron-server --config-file /etc/neutron/neutron.conf --config-file /etc/neutron/plugins/ml2/ml2_conf.ini
- q-agt:
/usr/bin/neutron-openvswitch-agent --config-file /etc/neutron/neutron.conf --config-file /etc/neutron/plugins/ml2/ml2_conf.ini
- q-dhcp:
/usr/bin/neutron-dhcp-agent --config-file /etc/neutron/neutron.conf --config-file=/etc/neutron/dhcp_agent.ini
- q-vpn:
/usr/bin/neutron-vpn-agent --config-file /etc/neutron/neutron.conf --config-file=/etc/neutron/l3_agent.ini --config-file=/etc/neutron/vpn_agent.ini --config-file /etc/neutron/fwaas_driver.ini
- q-meta:
/usr/bin/neutron-metadata-agent --config-file /etc/neutron/neutron.conf --config-file=/etc/neutron/metadata_agent.ini
- q-lbaas:
/usr/bin/neutron-lbaas-agent --config-file /etc/neutron/neutron.conf --config-file=/etc/neutron/services/loadbalancer/haproxy/lbaas_agent.ini
- q-metering:
/usr/bin/neutron-metering-agent --config-file /etc/neutron/neutron.conf --config-file /etc/neutron/services/metering/metering_agent.ini
api extension
api extension位于最前端,是rest服务。api extension是向neutron加入新功能的标准方式 (举例: securitygroup.py)
securitygroup功能的代码分布:
securitygroup功能的实现
-
securitygroup通过api extension为tenant暴露api
-
securitygroups_db.py定义了操作db的api
-
rpc(代码位于securitygroups_rpc.py)
- plugin -> agent (SecurityGroupAgentRpcApiMixin -> SecurityGroupAgentRpcCallbackMixin)
- agent -> plugin(SecurityGroupServerRpcApi -> SecurityGroupServerRpcCallback)
-
iptables driver的实现
- 每个securitygroup在iptables中都有一个chain
- IptablesFirewallDriver将securitygroup规则转换成iptables
securitygroup的调用全过程:
- neutron server启动加载extensions时,加载了securitygroup.py
- securitygroup.py新建了controller并传入了Ml2Plugin,并暴露security_group、security_group_rule两个资源
- 这时新增security_group_rule的请求到达
- Ml2Plugin接收,交给父类SecurityGroupServerRpcMixin的create_security_group_rule方法处理
- notifier.security_groups_rule_updated
- SecurityGroupAgentRpcApiMixin.security_groups_rule_updated
- SecurityGroupAgentRpcCallbackMixin.security_groups_rule_updated
- sg_agent.security_groups_rule_updated
- SecurityGroupAgentRpc.security_groups_rule_updated
- firewall.security_group_updated
- firewall_driver(OVSHybridIptablesFirewallDriver).security_group_updated
- IptablesFirewallDriver.security_group_updated
quota
quota管理
- neutron的很多resource都要受quota的约束
- quota的默认值位于neutron.conf中,如果数据库中有,则以数据库为准。数据库中可以为不同project设置不同值,而neutron.conf无法区分project,所以建议是用数据库存。
- quota的处理在api层(在传给plugin之前),作为一个api extension
- quota api只做简单的CRUD操作。具体的quota校验由quota engine负责。一个请求到达时,会尝试让quota engine预留资源,如果成功,则继续发往后端的plugin
- 可以为project级设置不同的quota;neutron不支持用户级的quota,也不支持层级用户quota
quota操作
- delete_tenant_quota 删除某租户的db记录
- update_quota_limit 修改某租户的db记录
- _get_quotas 查某租户的db记录
RPC
neutron使用oslo.messaging库来调用rpc,举例:
- neutron.agent.dhcp.agent.DhcpPluginAPI是rpc客户端
- neutron.api.rpc.handlers.dhcp_rpc.DhcpRpcCallback是rpc服务端
- agent调neutron server