对于云管理员来说,通过IP地址对虚拟机进行过滤在定位网络流量异常的虚拟机时十分有用。
OpenStack Nova就提供了这样的能力。但是由于数据模型的局限,目前通过IP地址对虚拟机进行过滤的性能较差,
本文就针对这个问题进行相应的分析、改进以及测试。
现状
OpenStack Nova 提供了在获得虚拟机列表时按照IP地址进行过滤的功能,但是由于在Nova中,虚拟机的网络信息是存储在表中,且具体的IP地址等信息是打包在JSON体中的。因此当前通过IP的实现方案需要首先获得环境内所有的虚拟机obj,再依次反序列化JSON体,获得IP地址信息,再通过字符串比对的方式找到满足要求的虚拟机。
而由于这个限制所期望的结果是因此这个参数在此是无效的(就算指定了也需要首先获取所有的虚拟机obj,在找到能够满足条件的虚拟机后)
再返回其中的个。详见代码实现
解决方案
这个问题在Nova中是一个老生常谈的话题了,出于种种原因一直没有解决。通过在Denver PTG上提出并讨论后,最终基本确定通过访问Neutron,按照IP地址过滤,再获得信息后,再通过其获得响应的虚拟机再在Nova中通过来对虚拟机进行过滤
这个方案唯一的问题是目前Nova是支持以的方式来匹配IP地址的,也就是输入会匹配所有的虚拟机。而Neutron当前是只支持在过滤时对IP地址进行严格匹配的。在这个问题的实现具体实现细节上又通过Mail List讨论后最终敲定。
简而言之,最终敲定的实现方案是:
Neutron侧增加pattern的IP地址过滤;为了保持前向兼容性,通过新增的filter来指定。
Neutron侧增加新的extension;由于Neutron没有采用Microversion机制,Nova需要检查Neutron侧是否支持来决定是否使用新方式过滤虚拟机。
Nova侧调用Neutron获取指定IP地址所对应的Port,获取求中的并作为来过滤虚拟机。
对具体实现方案感兴趣的请移步:
Nova Spec
Nova Patch
Neutron Spec
Neutron Patch
Neutron-lib Patch
测试
通过脚本在Nova数据库中插入2000条包含IP地址的虚拟机记录,同时在Neutron数据库中插入相应的2000个Port记录。
未修改前,从2000台虚拟机中过滤一个IP:
可以看到,从请求到收到响应总共耗时约4000ms。
修改后,同样的请求:
可以看到,响应时间大幅下降到400ms左右,提升明显。
修改后即便是以的方式匹配大量虚拟机,响应时间上升的也并不过分,完全可以接受:
领取专属 10元无门槛券
私享最新 技术干货