原标题:OpenStack干货分享 | Neutron源码分析之L3
概念
OpenStack Neutron中,Router提供虚拟三层服务,包括租户网络(Tenant Network)之间、租户网络与外部网络(External Network)之间的路由和网络地址转换,原生模式下路由器管理功能以Service Plugin的形式集成在Neutron Server中,路由器实体以Linux网络命名空间的形式存在,由Neutron L3 Agent管理。
本文从Neutron newton版本L3模块源码入手,通过抽象整体架构,对子模块的设计方法和实现细节进行分析,为开发者进行Neutron二次开发、构建大型软件系统提供借鉴。
源码分析
整体架构
先来看看L3的整体架构
图1 Neutron L3模块结构图
由上图可以看出,Neutron L3模块的功能主要由Server端的L3RouterPlugin和Agent端的L3NATAgentWithStateReport配合实现:
Client通过HTTP向Server发起L3资源Router、Floating IP的管理命令,Server负责处理资源在数据库的增删改查,并通过RPC将资源的更新事件通知到Agent,Agent最终通过Linux下的网络工具栈来实现具体的L3功能。
接下来从上至下,对各个模块的实现进行更仔细的分析。
Server端
Server端的L3RouterPlugin主要有两个职责:处理Client的HTTP请求、处理Agent的RPC请求。这两类请求处理过程的本质都是数据库数据的CRUD。L3的核心资源是Router,大部分L3 API都是围绕着Router的基础属性、扩展属性或附属资源的增删改查,Router也是L3 Plugin与L3 Agent进行同步的数据单元。
方法扩展
在结构上,L3RouterPlugin通过多重继承多个Mixin类获得对多种L3特性的功能支持:
如extraroute_db.ExtraRoute_db_mixin支持额外添加路由,l3_gwmode_db.L3_NAT_db_mix