Neutron 架构

发布时间: 更新时间: 总字数:3199 阅读时间:7m 作者: IP上海 分享 网址

NeutronOpenStack 项目中负责提供网络服务的组件,它基于SDN(软件定义网络)的思想,实现了网络虚拟化下的资源管理。本文介绍 OpenStack Neutron 架构。

Neutron 架构

说明:

  • Neutron Server:部署在controller node上,提供 REST API,把请求存放到消息队列
  • Neutron Plugin:从消息队列获取请求 -> 存放DB,并发送到消息队列 -> Neutron Agent处理消息
    • Core Pluginneutron 把三类资源定义为核心资源,分别是networksubnetport,这三类的实现由 Core Plugin 来实现
    • ml2 plugin:厂商对 L2 层网络资源的具体实现
    • Service Plugin:加载 Core Plugin 之后就加载 Service Plugin,因为 Core PluginService Plugin 有很多相似的地方,所以 Core Plugin 很多地方也都按照 Service Plugin 去处理
  • Neutron Agent:部署在compute nodenetwork 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的调用全过程:

  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
Home Archives Categories Tags Statistics
本文总阅读量 次 本站总访问量 次 本站总访客数