OpenDaylight系列文章(四):OpenDayLight初窥(下篇)之ODL环境搭建及工程示例


在安装OpenDayLight之前,首先需要了解OpenDayLight架构和基本功能,在之前的OpenDayLight系列文章中,我们系统学习及了解了OpenDayLight 的历史起源,系统架构,基本功能等,这为接下来如何部署和使用OpenDaylight夯实了基础。

一、ODL控制器部署与配置

单点部署环境要求

1.png

1.1 JDK1.8安装和配置

1.下载jdk (可至oracle官网下载)
http://www.oracle.com/technetw ... .html
2.本地解压JDK到指定目录
root@ubuntu:~# cd /opt/
root@ubuntu:/opt# tar  -zxvf  /opt/jdk-8u144-linux-x64.tar.gz


3.设置java环境变量
root@ubuntu:~# vim  ~/.bashrc                    //在文件末尾添加以下环境变量参数
export JAVA_HOME=/opt/jdk1.8.0_151                   //java安装目录
export JRE_HOME=${JAVA_HOME}/jre
export CLASSPATH=.:${JAVA_HOME}/lib:${JRE_HOME}/lib
export PATH=${JAVA_HOME}/bin:$PATH
root@ ubuntu:~# source .bashrc                    //执行source使配置生效


1.2 OpenDayLight控制器安装

1.2.1 下载OpenDayLight版本

从官网上下载OpenDayLight安装包,http://www.opendaylight.org/software/downloads,这里我们下载比较新的Nitrogen SR1版本。

1.2.2 安装OpenDayLight

Step1: 解压ODL版本包及配置
root@odl:/opt# unzip karaf-0.7.0.zip
root@odl:/opt#cd /opt/karaf-0.7.0/etc
root@odl: /opt/karaf-0.7.0/etc/# vim org.apache.karaf.management.cfg

rmiRegistryHost = 0.0.0.0 ==>修改为rmiRegistryHost = 127.0.0.1
rmiServerHost = 0.0.0.0 ==>修改为rmiServerHost = 127.0.0.1
Tips:这一步可以跳过不修改,但在某些情况下,ODL可能会出现异常。
如需修改默认日志文件大小,可修改etc目录下的org.ops4j.pax.logging.cfg配置文件
log4j.appender.out.maxFileSize=1MB #默认日志大小为1MB
log4j.appender.out.maxBackupIndex=10 # 默认最多不超过日志文件个数10个
Step2:运行karaf脚本
root@odl:/opt#cd /opt/karaf-0.7.0/bin
root@odl:/opt# ./karaf

执行后进入如下界面,ODL启动成功

1.png

1.2.3 命令行OpenDayLight使用及常用操作

1、命令行窗口输入help命令可查看当前可用的所有命令

1.png

2、安装一个feature,也可以同时安装多个features:
opendaylight-user@root> feature:install odl-restconf-all
opendaylight-user@root> feature:install odl-openflowplugin-flow-services-ui-he
opendaylight-user@root> feature:install odl-mdsal-all odl-dlux-all 

Tips:(dlux对应不同版本feature不一样,odl-dlux-all 是老版本的)
3、查看全部Karaf feature:

opendaylight-user@root>feature:list

4、列出已经安装的Karaf feature:
opendaylight-user@root>feature:list -i


1.png

5、组件状态检查:
opendaylight-user@root>list

1.png

6、检查控制器端口监听情况:
ODL控制器运行及组件安装后,需要检查控制器是否正常监听6633、6653端口(OpenFlow Channel使用的端口)
root@ubuntu:~# netstat -anp|grep 6633
               tcp6       0      0 :::6633                 :::*                    LISTEN      13927/java        
root@ubuntu:~# netstat -anp|grep 6653
               tcp6       0      0 :::6653                 :::*                    LISTEN      13927/java    

Tips:
1:当运行控制器后6633、6653端口没有监听,请注意进行组件状态检查,可能部分组件状态异常
2:可以查看控制器运行即时日志 opendaylight-user@root>log:tail

7、退出karaf. 在交互页面输入logout命令即可。如果是用karaf 命令直接启动,logout会导致 karaf后台进程停止。
另一种启动方法就是直接在bin目录下启动start 脚本,等后台karaf进程启动完全,用client脚本连接服务端,进入交互页面,如下图。下次logout,后台karaf进程就不会被kill掉
1.png

8、卸载Karaf feature特性:
首先停止karaf 后台服务进程,执行以下命令,删除feature特性
root@odl3:/opt/karaf-0.7.0/bin# ps -eaf |grep karaf
root@odl3:/opt/karaf-0.7.0/bin# kill -9  pNo
root@odl3:/opt/karaf-0.7.0# rm /opt/karaf-0.7.0/data/

或者停止Karaf服务后,直接删除数据目录,然后重启odl
root@odl3:/opt/karaf-0.7.0/bin# ./karaf  clean

Tips:
卸载一个feature的时候不要用feature:uninstall 这个命令来卸载,这样会造成未知的行为或错误。

9、ODL中的DLUX组件为控制器的使用者提供了交互式Web UI应用,图形化的用户界面提升了用户使用体验。需要安装Dlux组件,在安装完成后,可使用WEB页面方式来进行ODL的管理和控制。
安装Dlux过程中,如果不知道安装具体组件feature,可按tab键补全查看相关所有的组件feature。(注意不同odl版本对应的dlux的feature不一样,组件feature大致相同,可tab键查看dlux feature,一般我们需要安装topology,nodes,Yangman,YangUI等fearure)

1.png

在浏览器中输入http://HOSTIP:8181/index.html (访问端口号为8181) 如下图,username输入admin,password输入admin。登录成功后,可看到拓扑图,节点信息,各类API等,方便用户灵活查看和使用。安装不同的feature,WEB界面显示的app不同。

1.png


二、ODL工程示例-拓扑等信息展示

下面通过结合mininet,通过python脚本来生成一个5交换机相连环形拓扑图。可以通过ODL DLUX web页面形象看到我们所创建的拓扑图。
部署环境要求:
1.png


2.1 拓扑脚本

"""Custom topology example
Two directly connected switches plus a host for each switch:
host --- switch --- switch --- host
Adding the 'topos' dict with a key/value pair to generate our newly defined
topology enables one to pass in '--topo=mytopo' from the command line.
"""
from mininet.net import Mininet
from mininet.node import Node
from mininet.node import OVSSwitch
from mininet.link import Link
from mininet.topo import Topo

自定义一个拓扑函数

class MyTopo( Topo ):
"Simple topology example."
def __init__( self ):
    "Create custom topo."
    # Initialize topology
    Topo.__init__( self )
 # Add hosts  添加虚拟主机
    host1 = self.addHost( 'h1'  )
    host2 = self.addHost( 'h2' )
host3 = self.addHost( 'h3' )
host4 = self.addHost( 'h4' )
host5 = self.addHost( 'h5' )
#Add Switches  添加ovs交换机
    switch1 = self.addSwitch( 's1' )
switch2 = self.addSwitch( 's2' )
switch3 = self.addSwitch( 's3' )
switch4 = self.addSwitch( 's4' )
switch5 = self.addSwitch( 's5' )
  # Add links   添加链路连接 
    self.addLink( host1, switch1 )
self.addLink( host2, switch2 )
self.addLink( host3, switch3 )
self.addLink( host4, switch4 )
self.addLink( host5, switch5 )
    self.addLink( switch1, switch2 )
    self.addLink( switch1, switch5 )
self.addLink( switch2, switch3 )
self.addLink( switch3, switch4 )
self.addLink( switch4, switch5 )
topos = { 'mytopo': ( lambda: MyTopo() ) }


2.2 拓扑展示

1、利用以上脚本,执行以下命令来生成Mininet拓扑结构:
mn --custom /root/mininet/custom/topo-5sw-6host.py  --topo mytopo --controller remote,ip=CONTROLLER_IP ,port=6633 --switch ovs,protocols=OpenFlow13   --mac

2、创建完成后,通过登录Dlux WEB交互界面 http://localhost:8181/index.html 输入用户名/密码 admin/admin 如下图,Topology页面可以看到当前连接ODL控制器的交换机的组网拓扑图。
点击拓扑上链路link可以看到对应链路的交换机端口
1.png

Nodes页面可以查看到当前所有交换机节点信息,及连接的端口信息,如下Nodes节点列表。
1.png

Node Connectors里面点击数字链接,可看到某一节点当前的端口连接情况。
1.png

利用YangUI 提供的API可以对ODL数据库(config库或operational库)进行增删改查等常用操作

1.png


三、ODL工程示例-业务控制及操作

ODL中可以使用YangUI里面的API来查询各项数据库信息,对odl数据库进行操作,查询,修改,删除等。下面以向OpenFlow交换机下发流表为例进行说明 。创建完拓扑后,默认虚拟主机之间是不能互相通信,通过ODL控制器下发正确流表后,主机之间实现相互通信,互ping通。实际工程应用中,通过ODL控制器下发各种类型的流表,meter表等及各种动作实现对实际流量业务的控制和操作。

3.1 环境搭建

这里我们搭建一个环形拓扑,通过脚本生成5交换机,6主机的拓扑。每个交换机下挂一个虚拟主机。通过下面的操作实现sw1 下host1 和sw2下host2之间相互通信。

3.1.1拓扑脚本(可参考2.1拓扑脚本)

"""Custom topology example
Two directly connected switches plus a host for each switch:
host --- switch --- switch --- host
Adding the 'topos' dict with a key/value pair to generate our newly defined
topology enables one to pass in '--topo=mytopo' from the command line.
"""
from mininet.topo import Topo
class MyTopo( Topo ):
"Simple topology example."
def __init__( self ):
    "Create custom topo."
    # Initialize topology
    Topo.__init__( self )
   # Add hosts and switches
    host1 = self.addHost( 'h1'  )
    host2 = self.addHost( 'h2' )
host3 = self.addHost( 'h3' )
host4 = self.addHost( 'h4' )
host5 = self.addHost( 'h5' )
    switch1 = self.addSwitch( 's1' )
switch2 = self.addSwitch( 's2' )
switch3 = self.addSwitch( 's3' )
switch4 = self.addSwitch( 's4' )
switch5 = self.addSwitch( 's5' )
    # Add links
    self.addLink( host1, switch1 )
self.addLink( host2, switch2 )
self.addLink( host3, switch3 )
self.addLink( host4, switch4 )
self.addLink( host5, switch5 )
    self.addLink( switch1, switch2 )
    self.addLink( switch1, switch5 )
self.addLink( switch2, switch3 )
self.addLink( switch3, switch4 )
self.addLink( switch4, switch5 )
topos = { 'mytopo': ( lambda: MyTopo() ) }

3.1.2 执行脚本

执行命令:
mn --custom /root/mininet/custom/topo_name.py  --topo mytopo --controller remote,ip=CONTROLLER_IP ,port=6633 --switch ovs,protocols=OpenFlow13   --mac

脚本执行成功后,登录Dlux WEB交互界面 http://CONTROLLER-IP:8181/index.html 进行验证。如下图:

1.png

登录后台查看ovs连接控制器状态 ,连接后,与控制器连接状态为true,如下图另外需设置ovs的内核状态和协议版本,每个bridge桥都需要执行
ovs-vsctl set bridge s1 datapath_type=netdev        #配置ovs为用户态模式
ovs-vsctl  set bridge s1 protocols=OpenFlow13      #设置协议版本为OpenFlow13

1.png

默认情况下,h1 ping h2不能ping通,无法通信

1.png

3.2 YangUI下发流表

1.png

PS:
选择调用API的动作中 GET:从confi/operrational读取数据 PUT/POST:向数据库下发数据 DELETE:删除数据
选择OpenFlow交换机,Node id可以在Nodes菜单部分查看
详情请参考:
http://docs.opendaylight.org/e ... .html
通过RestAPI接口同样也可以对交换机下流表或者meter表,根据表项一个个填好对应参数,动作选择POST动作,最后SEND,发送成功表明下流表成功。
登录ovs交换机上,查看流表flow是否下成功。从下图可以查看到odl已经成功下了流表. 可以看到流表上对应信息,匹配入端口s1-eth1流,转发动作,转发到s1-eth3,即所有从s1-eth1进来的流都从s1-eth3转发出去。

1.png


根据不同的业务需求,可以灵活的定义不同的流表动作和匹配规则。例如,匹配入端口s1-eth1,动作为丢弃。即所有来自s1-eth1的数据包都做丢弃处理。这些下发流表的操作我们都可以在WEB页面上 通过YangUI来下发,非常方便和适用。(具体下发的参数和相关参数的意义,请参考OPENFLOW13定义的协议及其相关内容)

1.png


3.3 交换机配置下发

由上得知如何下流表,要实现host1和host2之间相互通信,则需要分别在sw1和sw2下正确的流表规则。在web页面上,我们可以通过nodes菜单,查看到香港节点信息,获取到sw1和sw2之间的连接的端口号。

1.png

1.png

1.png

sw1下host1 要能ping通sw2下host2,需要在sw1上下发流表:sw1交换机上下发流表项,需匹配从host1入端口(Openflow:1:1)流,出端口(openflow:1:3)到sw2的流表,同时也要有反向的表项,匹配入端口(openflow:1:3),出端口为Openflow:1:1的流表项
Sw2上做同样的操作。Sw2上下发流表项:匹配入端口(openflow:2:1),出端口为(openflow:2:2),再添加反向流表项,匹配入端口(openflow:2:2),出端口为(openflow:2:1)流表。
下发成功后如下图:

1.png

3.4 验证连通性

按照上述操作,下发流表成功后,进行ping包实验。sw1 下host1和sw2下host2能互相ping通。通过该实验,简单实现了主机间的通信,测试完成。

1.png


3.5 ODL-Postman进行拓扑流表数据的操作

控制器下流表也可以用postman工具进行操作,具体的方法如下
Step1:安装PostMan
下载安装:https://www.getpostman.com/
Step2:Postman使用请参见文档
https://wiki.opendaylight.org/ ... Flows
https://wiki.opendaylight.org/ ... zhang

四、总结

以上我们通过简单一个工程了解学习了ODL在业务场景中的简单应用,即利用控制器下发流表来实现了业务的通信和控制,流表的操作只是一方面,实际工程中ODL对业务上的操作和控制会复杂的多。
在我们后面的ODL系列的文章中,将会进行这方面的的深入探讨,以及更多ODL的实际应用和工程示例实验来呈现一个更加多样精彩的ODL世界。

五、参考资料

ODL:
https://www.opendaylight.org/
https://nexus.opendaylight.org ... docs/
http://docs.opendaylight.org/e ... .html

POSTMAN:
https://wiki.opendaylight.org/ ... Flows
https://wiki.opendaylight.org/ ... zhang

——未来网络 Zebra Decoder,2018.02.28出品

2 个评论

6666赞
你好,想请问登陆后台查看ovs连接控制器状态,怎么查看的呢?也就是第15张图的截图?

要回复文章请先登录注册