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 arch

neutron进程

一个完整的neutron部署包含多台主机和多个服务

  • neutron-server(controller node
    • 暴露api
    • 操作db
  • Layer2 agent(compute node & network node
    • 利用ovs
    • 负责提供network segment
    • 负责租户网络的隔离
  • 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的约定名称的方法
  • 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的调用全过程:

  1. neutron server启动加载extensions时,加载了securitygroup.py
  2. securitygroup.py新建了controller并传入了Ml2Plugin,并暴露security_group、security_group_rule两个资源
  3. 这时新增security_group_rule的请求到达
  4. Ml2Plugin接收,交给父类SecurityGroupServerRpcMixin的create_security_group_rule方法处理
  5. notifier.security_groups_rule_updated
  6. SecurityGroupAgentRpcApiMixin.security_groups_rule_updated
  7. SecurityGroupAgentRpcCallbackMixin.security_groups_rule_updated
  8. sg_agent.security_groups_rule_updated
  9. SecurityGroupAgentRpc.security_groups_rule_updated
  10. firewall.security_group_updated
  11. firewall_driver(OVSHybridIptablesFirewallDriver).security_group_updated
  12. 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

完毕。