OpenStack作为当前和可预见时间内最为热门的云计算技术(没有之一),业已获得广泛的企业市场应用和众多IT巨头的支持,更是以近日(7月17日)一位最具重量级的新成员——Google,签约加入OpenStack基金会,而引发业界震动。
Ryu作为SDN(Software defined network)软件定义网络领域的热门开源控制器之一,也已愈加获取众多企业和开发者的追捧和支持。
在开始之前,还是让我们,先从宏观上认识下OpenStack众多组件中,最为复杂的Neutron吧。
友情提示:由于Neutron过于复杂和庞大,如若需要,可看OpenStack Neutron官网部分。
1.Neutron核心概念
Network
- 一个L2二层网络单元
- 租户可通过Neutron API 创建自己的私有/外部网络
Subnet
- 一个L3的IPV4/IPV6地址段
- 为VM提供私网或公网ip地址
Router
- 三层路由器
- 为租户的VM提供路由功能,连接Internet
Port
虚拟交换机(OpenvSwitch)上的端口
管理VM的网卡
2.Neutron 核心插件
- Open vSwitch
- Linux Bridge
- Cisco NX1000
- Nicira NVP
- Ryu
- NEC OpenFlow
- Floodnight
- VMware NSX
3. Neutron核心服务
在绝大多数的部署环境中, Neutron 组件在 OpenStack 架构中常以单独的Node形式提供网络服务,作为网络节点。提供了多种服务,具体如下所示:
neutron-server
提供REST API服务,后端使用关系数据库。neutron-server 是一个守护进程,用来提供外部调用的 API 和与其它组件交互的接口。从图中可看出,其中包括 horizon 组件,nova-compute 服务和 keystone 认证服务。
Message Queue
neutron-server使用Message Queue与其他Neutron agents进行交换消息
L2 Agent
负责连接端口(ports)和设备,使他们处于共享的广播域(broadcast domain)。通常运行在Hypervisor上。
DHCP agent
用于配置虚机主机的网络。DHCP 代理,给租户网络提供动态主机配置服务,主要用途是为租户网络内的虚拟机动态地分配IP地址。
L3 Agent
负责连接tenant网络到数据中心,或连接到Internet。L3 代理,提供三层网络功能和网络地址转换(NAT)功能,来让租户的虚拟机可以与外部网络通信。
plug-in agent
插件代理,需要部署在每一个运行 hypervisor 的主机上,它提供本地的 vSwitch
配置,更多的时候得依赖你具体所使用的插件类型。(常用的插件是 OpenvSwitch,
还包括 Big Switch, Floodinght REST Proxy, Brocade, NSX, PLUMgrid, Ryu)
metering agent
计量代理,为租户网络提供三层网络流量数据计量服务。
将SDN控制器集成到OpenStack Neutron中,自然成为了企业和工程师们应用拓展的一个新领域。集成不是目的,而是一种手段,最终实现的是企业效益。
通过集成SDN,达到将应用程序从IP地址、VLAN和端口等网络环境中分离的目的,能够节省时间和降低运营成本,提高Neutron网络性能。
SDN 实现了将传统交换机的数据转发和控制平面进行分离,建立了一套独立的基于OpenFlow协议的控制平面。向上(北向接口,面向应用层),可以通过自定义编写应用程序与其他应用服务进行交互通信,实现控制平面。向下(南向接口)通过OpenFlow协议去管理控制物理硬件和虚拟硬件,实现数据转发平面。
目前南向通道主要是指OpenFlow协议,连接控制层和数据转发层。OpenFlow安全通道采用SSL/TLS对数据进行加密,防止控制器与交换机的交互信息被外界窃取。
北向通道主要是指控制层向第三方开放的API接口,用户可以通过这些开放接口开发应用程序并在SDN上部署自己的应用,体现了SDN技术的开放性和可编程性。
目前,能够以plugin的方式集成到OpenStack的控制器有:NEC的控制器以及开源控制器OpenContrail、Ryu、OpenDayLight和Floodlight等,这里我们选择Ryu。
作为不同领域,但又互有交集的两者,通过强强联合能够实现彼此间的优势互补和技术效能发挥。下面让我们一起来构筑起它们彼此之间联姻的桥梁吧。
这里,我们将介绍使用两种方法来集成Ryu和OpenStack。
一、使用Ryu插件与OpenStack的网络
在开始之前,让我们先来看看Ryu和OpenStack集成的架构吧,如下图所示:
图中,基于分层的SDN-OpenStack架构,Ryu控制器充当着“承上启下”的作用:承上——通过北向接口API(OF-REST)管理、运行Ryu app和Neutron服务,起着控制角色作用。
启下——通过运行OpenFlow Protocol与openFlow Switch交换机(可以是软件的OpenvSwitch,也可以是硬件交换机)交互,与Flow Table、OVSDB、OF-Config等一同协作,起着数据转发的作用。
1、安装Ryu和Neutron配置
1)安装Ryu插件
1 | # yum install openstack-neutron-ryu |
2)编辑文件 /etc/neutron/neutron.conf
Shell1 | core_plugin = neutron.plugins.ryu.ryu_neutron_plugin.RyuNeutronPluginV2 |
3)编辑/etc/neutron/plugins/ryu/ryu.ini, 为ryu-neutron-agent更新以下ovs选项:
- openflow_rest_api:是用在告诉Ryu在哪里侦听REST API。 根据你的Ryu设置替换ip地址和端口。
- ovsdb_interface:是Ryu用来访问ovsdb-server。根据您的设置替换eth0。 ip地址来自于接口名称。如果你想不管接口名称而改变ip地址,可以指定ovsdb_ip。你可以用ovsdb_port来指定非默认的端口访问ovsdb-server。
- tunnel_interface:是用来告诉哪个ip地址被用于隧道(假如隧道没有被使用,那么这个值被忽略),ip地址来自接口名称。
4)你可以使用计算节点相同的配置文件,但需要改变其网卡的ip地址
Shell1 | openflow_rest_api = : ovsdb_interface = tunnel_interface = |
5)重启neutron-server获得新的设置
Shell1 | $ sudo service neutron-server restart |
2、节点设置:Ryu插件
如果你使用Ryu插件,您必须安装Open vSwitch和Ryu,除了Ryu agent包:
2、节点设置:Ryu插件
如果你使用Ryu插件,您必须安装Open vSwitch和Ryu,除了Ryu agent包:
在每个节点上设置Ryu plugin
1)安装Ryu
1 | # pip install ryu |
2)安装Ryu agent 和Open vSwitch
Shell1 | # yum install openstack-neutron-ryu openvswitch python-openvswitch |
3)复制在前面创建的ovs_ryu_plugin.ini和neutron.conf到所有运行neutron-ryu-agent的节点上。
4)启动Open vSwitch加载内核模块:
Shell1 | # service openvswitch restart |
5)重启agent
Shell1 | # service openvswitch restart |
6)所有运行neutron-ryu-agent的节点都需要有一个叫br-int的OVS网桥存在,要创建该网桥,执行:
Shell1 | # ovs-vsctl add-br br-int |
3、DHCP agent设置Ryu plug-in
1)这些DHCP代理选项必须在/etc/neutron/dhcp_agent.ini文件中,Ryu插件:
123 | [DEFAULT]use_namespace = Trueinterface_driver = neutron.agent.linux.interface.OVSInterfaceDriver |
2)如果你使用下面的其中一个插件,你也需要用以下的内容配置计量agent(metering agent)
基于OVS的插件,例如OVS、NSX、Ryu、NEC、BigSwitch/Floodlight:
1 | interface_driver = neutron.agent.linux.interface.OVSInterfaceDriver |
3)一个插件,使用linux bridge:
Shell1 | interface_driver = neutron.agent.linux.interface.BridgeInterfaceDriver |
4)使用参考实现,必须设置:
Shell1 | driver = neutron.services.metering.drivers.iptables.iptables_driver.IptablesMeteringDriver |
5)设置此参数在主机上的neutron.conf文件,运行neutron-server:
Shell1 | service_plugins = neutron.services.metering.metering_plugin.MeteringPlugin |
二、通过OVS命令集成OpenStack
由于OpenvSwitch是部署OpenStack默认自带安装的。所以我们可以很好的和Ryu集成。
通过ovs-ofctl dump-flow/snoop和tcpdump,我们能够了解计算节点虚拟机(VM)tap->qbr->br-int->br-tun->vxlan->;网络节点br-tun->br-int->namespace->br-ex这条数据线路,这样,我们便能知道需要在什么地方set sdn-controller。
如下图所示:
Ryu作为sdn的控制器,br-int/br-tun就是二层虚拟交换机,两者之间可以运行OpenFlow协议沟通,下面是其集成步骤:
1. 在一台单独的主机或虚拟机上,安装ryu控制器。
Shell12 | # git clone git://github.com/osrg/ryu.git# cd ryu; python ./setup.py install |
2.启动ryu控制器,这里地址为10.0.0.10。
Shell1 | # ryu-manager |
3.在所有计算和网络节点的br-int和br-tun网桥上,设置SDN控制器为10.0.0.10
3.1认识OVS集成网桥br-int
br-int是OpenvSwitch创建的虚拟网桥,但在实际运行中它充当着虚拟交换机的角色。br-int上的端口tap设备将宿主机上的虚拟机连接到同一网络交换层上。再透过OVS通道网桥br-tun的互联协议将OpenStack系统架构中所有节点的br-int组织成一个大二层的虚拟交换机BR-INT。
每一个使用neutron net-create 命令创建的network都有一个新的ID。见ovsl-vsctl show命令显示结果中的Port的tag值。br-int处理从VM进出通信的ID(vlan id、vxlan id等)。
因此,我们是在br-int网桥(理解为支持OpenFlow协议的openvswitch)处连接控制器。
Shell1 | # ovs-vsctl set-controller br-int tcp:10.0.0.1 |
3.2 认识OVS通道网桥br-tun
br-tun也是OVS创建的虚拟网桥,它的作用是向上直接与br-int连接作为网络数据的进出口;对下通过特定的通信协议(GRE、VLAN、VXLAN等)与各个节点上的br-tun相连构成一个扁平的通信/通道层。如果把所有的br-int构建的抽象层定义为虚拟二层网络,那么所有的br-tun构成的抽象层便是虚拟三层网络了。
br-tun使用OpenFlow规则处理各种通信协议ID和Tunnel ID 的转换。因此,通过如下命令予以连接控制器。
Shell1 | # ovs-vsctl set-controller br-tun tcp:10.0.0.1 |
4.最后,通过如下命令来查看集成情况:
友情提示:
由于输出信息量过多,且每个人部署的网络类型不同,其输出信息也有差异。因此,这里仅讲解查看的方法,其具体含义,网上已有较多资料,请自行查阅。
1)查看ovs交换机信息
1 | # ovs-vsctl show |
2)从OpenFlow rule tables中,查看ID和Tunnel ID 的转化过程
Shell1 | # ovs-ofctl show br-tun |
3)查看br-tun具体的flow table信息
Shell1 | # ovs-ofctl dump-flows br-tun |
三、思考
1)如何满足企业需求,构建Ryu和OpenStack相结合的高可靠、高可用、高性能的网络环境。
2)如何运用Ryu的SDN控制器框架和可编程特性,实现云计算领域的特殊复杂网络环境。
事实上,OpenStack Neutron本身就是SDN的一种实现。
而以SDN和云计算数据中心为代表的典型应用,无疑,均为各自的发展,都开拓了一片新天地。
还等什么,一起加油吧!
作者简介:徐超:毕业于成都东软学院信息安全专业,从事OpenStack相关工作。个人倾向于研究OpenStack、SDN和Docker。