专栏首页腾讯云TStack专栏Neutron的IPAM还可以这么玩!

Neutron的IPAM还可以这么玩!

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的创建流程:

  • neutron server接受创建port的请求之后,到达ML2 plugin模块进行处理,ML2 plugin主要处理网络、子网和port资源
  • ML2 plugin把请求交给IPAM处理,IPAM主要是用来给port分配一个可用的ip或者用户指定ip,对于具体使用什么分配算法根据driver不同而不同,默认的neutronDB driver使用的是如下算法:
    • 首先从IPAM相关的数据库取出已经使用的ip,然后列举子网上面所有的ip,取个差集,就是可用的ip池,然后通过一个随机ip窗口在可用ip池中获取一个可用的ip。
  • 通过IPAM获取完ip之后,创建port数据结构加入到neutron的db中,这里IPAM db和neutron db其实都是在neutron数据库中,小甲之所以这么叫,主要是区分它们的作用,IPAM db主要是用来管理ip分配、可用池等,neutron db主要是为了记录port信息,ip只是它的一个属性。
  • 后面会把请求交给type manager和Mechainsm manager创建相应的底层资源

△port创建流程图

子网的创建流程:

  • neutron server接受创建子网的请求之后,还是ML2 plugin模块处理
  • ML2 plugin把请求交给IPAM处理,IPAM主要是在IPAM db中创建子网的数据模型实例,记录子网信息,比如子网的默认网关、dhcp的ip、有效的ip地址
  • 在IPAM创建完数据库实例之后,会在neutron db创建子网资源,跟port一样,IPAM数据库中的子网只要是用来分配ip的,neutron数据库中主要是neutron层记录子网,比如我们经常用到neutron subnet-list就是这个neutron数据库获取的。
  • 后面会把请求交给type manager和Mechainsm manager创建相应的底层资源。
  • 子网的创建,会触发创建这个子网上面的dhcp port,创建流程跟上面port一样,然后dhcp agent会创建相应的资源。

△子网创建流程图

如何写自己的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为例:

  • 我们ip系统比neutron默认的功能更强大丰富,默认的IPAM有些场景不能满足我们需求
  • Tstack借助IPAM driver可以使ip系统统一管理整个平台的网络资源
  • 上层应用可以接入ip系统实现运维管理

遇到的问题

在实现IPAM驱动的过程中,遇到过很多问题,并一一进行了解决,大致列举几个问题,以引起大家注意:

  • neutron数据模型跟自研ip系统模型不匹配,比如少一些模型,或者一些模型不完全对应,会导致IPAM在跟自研ip系统交互的时候出现问题。 
  • 业务信息的处理,自研ip系统的定位可能不是底层组件,会带有一些上层业务信息,而neutron没有这些业务信息,比如ip系统会根据业务分网络类型,基础网、私有网等,而neutron不分这么细 
  • neutron多入口访问的统一,restful api,命令行和dashboard多个入口的访问要保证一致性
  • IPAM和ip系统的两部分的配合处理需要处理好并发访问处理

特别鸣谢:

IPAM TStack driver的实现成员:

spectrezz24(排名不分先后)

· END ·

本文分享自微信公众号 - 腾讯云TStack(gh_035269c8aa5f)

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2019-03-14

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

推荐阅读

  • 「网安夜校」开课啦!多门网络安全课程开启限时优惠报名

    众志成城,共抗疫情。腾讯安全联合腾讯云大学、腾讯课堂启动「网安夜校」,为大家提供限时优惠的网络安全课程。欢迎网络安全从业者和信息安全专业学生报名参加学习,快速充电提升自我。

    腾讯安全
    安全培训腾讯云大学
  • Flink源码走读(一):Flink工程目录

    导语 | Flink已经成为未来流计算趋势,目前在很多大厂已经有了大规模的使用。最近在学习Flink源码,就想把自己学习的过程分享出来,希望能帮助到志同道合的朋友。开始阅读源码,说明读者已经对flink的基本概念有一些了解,这里就不再重复介绍Flink了。本文作为学习过程的第一章,首先对Flink的工程目录做一个解读,了解了工程下各个模块的作用,才能在遇到问题时准确定位到代码,进一步学习。

    2011aad
    大数据解决方案
  • Flink源码走读(二):Flink+Kafka实现端到端Exactly Once语义

    Flink通过Checkpoint机制实现了消息对状态影响的Exactly Once语义,即每条消息只会影响Flink内部状态有且只有一次。但无法保证输出到Sink中的数据不重复。以图一所示为例,Flink APP收到Source中的A消息,将其转化为B消息输出到Sink,APP在处理完A1后做了一次Checkpoint,假设APP在处理到A4时发生错误重启,APP将会重新从A2开始消费并处理数据,就会导致B2和B3重复输出到Sink中两次。

    2011aad
    大数据解决方案Kafka
  • kubernetes系列教程(十九)使用metric-server让HPA弹性伸缩愉快运行

    kubernetes监控指标大体可以分为两类:核心监控指标和自定义指标,核心监控指标是kubernetes内置稳定可靠监控指标,早期由heapster完成,现由metric-server实现;自定义指标用于实现核心指标的扩展,能够提供更丰富的指标支持,如应用状态指标,自定义指标需要通过Aggregator和k8s api集成,当前主流通过promethues实现。

    HappyLau谈云计算
    Kubernetes容器微服务微服务架构腾讯微服务平台 TFS
  • 三分钟入坑指北 🔜 Docsify + Serverless Framework 快速创建个人博客系统

    之前由于学摄影的关系,为了提高自己的审美,顺便锻炼下自己的英文能力,翻译了不少国外艺术类的 文章。最近一直想搭一个个人博客来存放这些内容,又懒得折腾建站,遂一直搁置。

    Aceyclee
    ServerlessHTML网站GitGitHub
  • NVM作为主存上对数据库管理系统的影响

    implications of non-volatile memory as primary storage for database management systems

    yzsDBA
    存储缓存数据库数据结构SQL
  • DevOps平台架构演进

    附最新架构图https://www.processon.com/view/5cbd897de4b0bab90962c435

    我思故我在
    DevOps 解决方案微服务架构架构设计
  • 【腾讯云AI小程序大赛】中山大学作品《小耳朵天使》

    ----------------------------------------------------------------------------------

    陈华山
    小程序 · 云开发小程序语音识别文字识别对话机器人
  • Kona JDK 在腾讯大数据领域内的实践与发展

    经常听人谈到 OpenJDK,那它到底是什么呢?相信大家都听说过 Java SE、ME、EE等规范, 通常意义上对 Open JDK 的定义指:Java SE规范的一个免费和开源参考实现。

    腾小云
    JDKJavaJVM大数据Oracle
  • 公告丨腾讯安全产品更名通知

    为了更好地为政企客户的安全保驾护航,腾讯安全即日起更新旗下身份安全、网络安全、终端安全、应用安全、数据安全、业务安全、安全管理、安全服务等八类安全产品的命名,致力于打造全栈安全产品“货架”,让客户选购安全产品/服务更加便捷,更快地找到合适的安全产品,从而对自身的安全建设“对症下药”。

    腾讯安全
    DDoS 防护应用安全 MS验证码(业务安全)应用安全(移动安全)漏洞扫描服务

扫码关注云+社区

领取腾讯云代金券