Neutron 是 OpenStack 项目中负责提供网络服务的组件,它基于软件定义网络的思想,实现了网络虚拟化下的资源管理。本文介绍 OpenStack Neutron 组件。
介绍
- neutron-server: 部署在controller node上的进程,接受rest请求
- ml2 plugin: 厂商对网络资源的具体实现
- agent: 部署在compute node和network node上的进程,和neutron-server间通过RPC通信。
- agent driver: 被agent调用,具体干活的人
- extensions filter: rest请求经过的一个filter,具体由ExtensionMiddleware干活
- ExtensionMiddleware: 初始化ExtensionManager,并从中获得所有extension的resource并将controller和URL映射。
- ExtensionManager: 在给定path下扫描所有extension的py文件、加载、并提供一些查询方法。
- extension: 具体的api扩展。以Securitygroup为例,get_resources方法中新建了一个controller,并将具体的plugin传给了controller,这个extension的api调用会被这个controller处理,controller会调用plugin中的相应方法。
- APIRouter: 暴露neutron已知的resource的URL的映射
- Core Plugin: neutron把三类资源定义为核心资源,分别是network、subnet、port,这三类的实现由Core Plugin 来实现
- NeutronManager: 加载配置文件中设置的plugin
- NeutronDbPluginV2: 做与 Core Plugin 相关的数据库操作
- Service Plugin: 加载 Core Plugin 之后就加载 Service Plugin,因为 Core Plugin 和 Service Plugin 有很多相似的地方,所以 Core Plugin 很多地方也都按照 Service Plugin 去处理
- ipam: ip地址管理,用于subnets公用的抽象资源的管理,例如DHCP,DNS,CIDR等。
neutron进程
一个完整的neutron部署包含多台主机和多个服务
- neutron-server(*controller node*)
- 暴露api
- 操作db
- 暴露api
- Layer2 agent(*compute node & network node*)
- 利用ovs
- 负责提供network segment
- 负责租户网络的隔离
- 利用ovs
- Layer3 agent(*network node*)
- 负责东西、南北的路由
- 负责额外的功能,如: FWaaS、LBaas
- 负责东西、南北的路由
代码入口
程序入口点
- 位于 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的约定名称的方法
- SecurityGroup功能的元数据信息(security_group的各种属性、security_group_rule的各种属性)
securitygroups_db.py包含:
- 定义SecurityGroupRule表名,表结构。
- SecurityGroupDbMixin是SecurityGroupPluginBase的子类,主要是将securitygroup持久化
- 定义SecurityGroupRule表名,表结构。
securitygroups_rpc_base.py包括:
- SecurityGroupServerRpcMixin是SecurityGroupDbMixin的子类,专门为agent添加了securitygroup相关的方法。
- 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)
- plugin -> agent (SecurityGroupAgentRpcApiMixin -> SecurityGroupAgentRpcCallbackMixin)
iptables driver的实现
- 每个securitygroup在iptables中都有一个chain
- IptablesFirewallDriver将securitygroup规则转换成iptables
- 每个securitygroup在iptables中都有一个chain
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
完毕。
相关文章
最新评论
加载中...