基于ryu实现的限制OpenStack虚拟机带宽的应用

作者简介:王凯,江南大学大四学生,主要学习研究SDN控制器以及OpenStack。

大三有幸跟着学院老师做项目,开始接触OpenStack。说实话一开始的学习对于一个当时连计算机网络都没学过的学生来说是非常痛苦的,好在坚持了下来,从一开始OpenStack的安装到现在SDN的学习,一路“摸爬滚打”,一路积累了我对未来网络的浓厚兴趣。这篇文章是我毕设的一部分,记录一下还是很有必要的。

Ryu应用的实现

本次设计实现的是一个web应用,因此需要用到ryu的WSGI框架以及REST API的开发。关于这两个技术的原理,呈神的博客还是很有参考价值的,在这里我就不做赘述,我主要介绍一下我定义的部分API的实现过程以及功能。

这个API主要实现了加载指定目录下静态网页文件的功能。该功能的实现主要依赖于webob库中的webob.static.DirectoryApp类。

该API是实现带宽限制的关键,请求的数据格式为:{"src":SRC,"dst":DST,"bw":BW},其中SRC代表源主机的id,DST代表目的主机的id,BW代表限制的带宽。因为OpenStack中虚拟机的名字可以重复,但id是唯一的,所以我们必须通过id来唯一标识虚拟机,同时虚拟机的id可以在dashboard中很方便的查看到。

在获取到源主机、目的主机id后,调用search.parse(instance_id)函数,该函数主要完成了根据虚拟机id获取其mac地址的功能,然后针对目的主机id调用search.parser_port(instance_id)函数,返回目的主机连接在br-int上的端口。接着再根据需要限制的带宽在该端口执行添加qos的命令。最后还需要调用flow_monitor.send_flow_mod_openstack函数完成下发流表的功能,实现限速的目的。

这个API主要是实现登录的验证,请求的数据格式为:{"user":user,"passwd":password},user代表用户名,password代表密码。

Ryu连接br-int

本次测试是在OpenStack Mitaka版本之下进行的。一开始在给br-int设置控制器时,一直出问题,在连上的瞬间会断开,很是困惑,不知道是什么原因。后来在实验室师兄的启发下,我追溯了一下br-int的创建过程。

在neutron/plugins/ml2/drivers/openvswitch/agent/ ovs_neutron_agent.py文件中找到了br-int的初始化过程。该文件中的函数setup_integration_br代码如下:

从中可以看出br-int在创建时会调用setup_controllers函数,顾名思义就是设置控制器,于是我继续追溯这个函数的出处,最终在neutron/plugins/ml2/drivers/openvswitch/agent/openflow/ovs_ofctl/ ovs_bridge.py中找到了:

可以看到该函数调用了del_controller函数,即删除控制器的函数,于是我尝试将这行代码注释后,重启neutron的相关服务,再给br-int设置控制器,发现成功了。至此成功将br-int连上ryu控制器。

测试结果

web界面

实验结果

限制VM1到VM3的带宽:

未限带宽时:

限制带宽后:


源码将在我完成毕业论文后公开。


  • 本站原创文章仅代表作者观点,不代表SDNLAB立场。所有原创内容版权均属SDNLAB,欢迎大家转发分享。但未经授权,严禁任何媒体(平面媒体、网络媒体、自媒体等)以及微信公众号复制、转载、摘编或以其他方式进行使用,转载须注明来自 SDNLAB并附上本文链接。 本站中所有编译类文章仅用于学习和交流目的,编译工作遵照 CC 协议,如果有侵犯到您权益的地方,请及时联系我们。
  • 本文链接https://www.sdnlab.com/18786.html
分享到:
相关文章
条评论

登录后才可以评论

starrynight 发表于17-03-31
1