Neutron 架构
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)
- 暴露api
- 操作db
- 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.py包含:
- SecurityGroup功能的元数据信息(security_group的各种属性、security_group_rule的各种属性)
- SecurityGroup的各种校验类
- SecurityGroupPluginBase定义了一个SecurityGroup的抽象行为,增删改查、rule的增删改查
- get_resources方法中新建了controller,并通过manager.NeutronManager.get_plugin()将Ml2Plugin传给了controller,当api调用达到时,controller会调用Ml2Plugin父类SecurityGroupServerRpcMixin的约定名称的方法
-
securitygroups_db.py包含:
- 定义SecurityGroupRule表名,表结构。
- SecurityGroupDbMixin是SecurityGroupPluginBase的子类,主要是将securitygroup持久化
-
securitygroups_rpc_base.py包括:
- SecurityGroupServerRpcMixin是SecurityGroupDbMixin的子类,专门为agent添加了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
- 上一页: Ceph 数据端到端的正确性保证和Scrub机制
- 下一页: ICMP 协议
最近更新
相关文章
- Neutron 命令
- NovaException: Unexpected vif_type=binding_failed
- Neutron allow address pairs 介绍
- Linux 定时任务功能 crontab
- Python fabric 实现 linux 的实现远程操作和部署
- QCOW2 格式镜像
- Linux rpmbuild 使用介绍及 OpenStack rpm 打包示例
- Openstack metadata-server 介绍
- OpenStack 镜像(image)定制/压缩方法 -- 开启密码登录方法等
- OpenStack oslo_serialization 简记/ OpenStack debug 调试技巧
最新评论