neutron作为openstack的核心组件用来管理网络,比如network、subnet和port核心资源、lbaas、fwaas等扩展资源,但是对于用户来说最基础的是ip,以及这个ip所在的网络,这部分功能是由neutron的IPAM管理。
哪些地方需要ip
neutron哪些地方有需要ip?too many,比如说虚拟机的网卡、路由器的外部网关、内部接口、浮动ip、dhcp port、ha路由器的管理口,其他组件lbaas、manila等都需要ip,这些ip其实在neutron看来都是创建port资源,只是各种device owner不同,都需要通过neutron的IPAM分配和管理。
IPAM是个啥
IPAM(IP Address Management),也可以叫做ip地址管理子系统。L版neutron的IPAM是一个分水岭,L版之前ip的管理只能使用neutron本身的数据库,分配和回收都是通过这个数据库来实现。L版开始,社区对IPAM进行了重构,把ip的分配和释放以及子网的增删改查作为标准的接口提取出来,使用driver的方式来接入各种拥有ip和子网管理功能的系统,这样就实现了IPAM可插拔,允许接入用户一些现有的ip管理系统,同时对neutron其他功能基本没有影响,L版之前使用数据库实现的ip管理作为了IPAM一种默认的driver。
下面比较一下neutron的源码目录结构。
K版neutron的IPAM目录下结构:
[root@con01 ipam(keystone_admin)]# lltotal 32-rw-r--r-- 1 root root 7428 Aug 21 2015 __init__.py-rw-r--r-- 1 root root 4124 Aug 21 2015 driver.py-rw-r--r-- 1 root root 16282 Aug 21 2015 subnet_alloc.py
P版neutron的IPAM目录下结构:
[root@con01 /usr/lib/python2.7/site-packages/neutron/ipam]# lltotal 52-rw-r--r-- 1 root root 0 Aug 31 16:29 __init__.py-rw-r--r-- 1 root root 6733 Aug 31 16:29 driver.pydrwxr-xr-x 4 root root 4096 Jan 24 14:31 drivers-rw-r--r-- 1 root root 2916 Aug 31 16:29 exceptions.py-rw-r--r-- 1 root root 11534 Aug 31 16:29 requests.py-rw-r--r-- 1 root root 19006 Aug 31 16:29 subnet_alloc.py-rw-r--r-- 1 root root 2616 Aug 31 16:29 utils.py
其中drivers目录下面就是各个driver的实现,其他文件定义了ip和子网管理相关的标准接口,各个driver根据后端管理平台具体实现标准接口。
[root@con01 ~]# ll /usr/lib/python2.7/site-packages/neutron/ipam/drivers/
total 16
-rw-r--r--. 1 root root 0 Oct 31 06:27 __init__.py
drwxr-xr-x. 2 root root 4096 Dec 24 16:09 neutrondb_ipam
从上图中的driver文件夹的名字也可以看出,默认的driver就是使用数据库来管理ip和子网。
默认driver分析
模块图
上图为neutron的模块图中,从中可看出IPAM主要和ML2 plugin和IPAM db交互,那小甲下面主要分析一下怎么交流的,由于IPAM主要管理子网和port,网络IPAM不管理,主要分析一下port和子网的创建
port的创建流程:
△port创建流程图
子网的创建流程:
△子网创建流程图
如何写自己的IPAM driver
讲了这么多,究竟如何实现自己的IPAM driver呢?
其实很简单,只要完成以下两件事即可
一、派生子类实现子网和port管理的基准接口(多态性):
1.请求资源的多态性
请求工厂基类,主要创建ip分配请求和子网创建请求:
SubnetRequestFactory:用于子网创建请求
AddressRequestFactory: 用于ip分配请求 各个driver可以根据需求通过不同工厂创建不通的请求,每个ip管理子系统需要的请求数据可能不一样
2.管理资源的多态性
ip和子网操作基类模型如下图(点击可放大):
实现方式千千万,涉及到具体如何管理ip和子网资源,每个ip管理系统不同实现也不同
二、如何优雅发送请求 如何与ip管理系统通信,主要看个人代码习惯,可以直接调用后端ip系统的restful api,也可以逻辑清楚的划分各个层,TStack划分了controller、manager和对象映射api层
IPAM扩展有什么好处
那么问题来了,IPAM driver有什么好处,以我们TStack为例:
在实现IPAM驱动的过程中,遇到过很多问题,并一一进行了解决,大致列举几个问题,以引起大家注意:
特别鸣谢:
IPAM TStack driver的实现成员:
spectre、zz24(排名不分先后)
· END ·