首页 > 其他 > 详细

浅析OpendayLight SFC

时间:2016-08-17 23:18:49      阅读:579      评论:0      收藏:0      [点我收藏+]

1.Ubuntu环境搭建

Demo环境使用ubuntu14.04系统,本文所使用的是:ubuntu-14.04.1-desktop-amd64,该系统内核为3.13.0,使用其他版本亦可,但请确保内核版本不高于3.14。下载VMware Workstation,创建虚拟机,加载ubuntu-14.04.1-desktop-amd64.iso镜像,即可完成ubuntu的系统安装。我们会使用apt-get进行在线安装部分软件,更改/etc/apt/source.list中ubuntu的软件安装源,本文所使用的是mirrors.sohu.com。更改好后执行:sudo apt-get update和sudo apt-get upgrade,完成ubuntu系统的最基本搭建。

2.Java环境搭建

Opendaylight采用java编写,所以需要安装jdk,我使用的是java8。

sudo add-apt-repository ppa:webupd8team/java

sudo apt-get update

sudo apt-get install oracle-java8-installer

 

安装完成后执行java -version,如有java version的显示则安装成功。添加JAVA_HOME的路径到环境变量:sudo vi /etc/environment,添加JAVA_HOME=/usr/lib/jvm/java-8-oracle,保存退出后执行:sudo source/etc/environment。输入echo $JAVA_HOME应有jre对应的路径。

3.Maven环境搭建

Opendaylight采用maven管理编译代码。

sudo apt-get remove maven*

sudo apt-get install gdebi

sudo apt-get install wget

wget http://ppa.launchpad.net/natecarlson/maven3/ubuntu/pool/main/m/maven3/maven3_3.2.1-0~ppa1_all.deb

sudo gdebi maven3_3.2.1-0~ppa1_all.deb

sudo ln -s /usr/share/maven3/bin/mvn /usr/bin/mvn

 

安装完成后执行mvn -v,如有maven version的显示则安装成功。在bashrc中添加MAVEN_OPTS,执行vi ~/.bashrc,添加:MAVEN_OPTS="-Xmx1024m",保存退出后执行source ~/.bashrc。

4.Openvswitch搭建

由于ovs主线版本并未支持NSH,所以需要使用能够支持NSH的版本,执行:sudo apt-get install git,安装成功后执行git clone https://github.com/pritesh/ovs.git,将该分支切换到nsh-v8分支:git checkout nsh-v8,该ovs版本基于2.3.X进行开发的支持NSH功能,所以ubuntu内核版本不能高于3.14。

编辑ovs/third-party/start_ovs.sh文件:将红色部分注释掉

if [ "$nodownload" =="0" ]; then

echos "Starting to install Openvswitch with support forNSH"

# git clone https://github.com/pritesh/ovs.git

# if [ $? -gt 0 ]; then

#    endspin "ERROR:Cloning git repo failed."

#     exit 1

# fi

fi

安装automake和libtool:

sudoapt-get install automake

sudoapt-get install libtool

在ovs同级目录,执行sudo ./ovs/third-party/start_ovs.sh,安装成功后会默认添加一个br1的bridge。

技术分享

5.SFC搭建

下载sfc最新代码:https://github.com/opendaylight/sfc.git,将分支切换到stable/beryllium,不要使用master分支,坑太多。进入sfc目录,执行:mvn clean install-Dmaven.test.skip=True。完成编译后,进入sfc/sfc-karaf/target/assembly/bin目录下,执行sudo ./karaf。启动sfc环境。

技术分享

我们先查看sfc默认启动了哪些组件:(显示为X的表示安装)

opendaylight-user@root>feature:list |grep sfc

技术分享

1)odl-sfc-ui为sfc为用户提供的一个操作界面。

浏览器中输入http://127.0.0.1:8181/index.html可以看到有SFC的界面:

技术分享

2)odl-sfc-model为odl中核心逻辑处理模块,逻辑上联通北向接口和南向接口。

3)odl-sfc-provider/provider-rest为odl中sfc的北向接口模块。

4)odl-sfc-netconf/ovs/scf-openflow/of12/lisp/sb-rest为odl中sfc的南向接口模块。

 

6.SFC-DEMO环境搭建分析

6.1sfc-agent demo场景分析

在sfc代码中,sfc-py目录下提供了一个用于demo的sfc-agent,该agent实质为一个restconf的server,用于接收restconf的client的请求,将流程信息打印出来,方便实现sfc的南向接口的展示。其架构图为:

技术分享

sfc-agent需要python3的支持,ubuntu14.04系统自带python3.4。需要安装部分python包:cffi、 cryptography、pycrypto、paramiko。安装Sudo apt-get install libffi-dev和libssl-dev。

修改sfc/sfc-py/start_agent.sh,stable/beryllium分支中内容是:

python3.5 sfc/sfc_agent.py --rest --odl-ip-port $1 --auto-sff-name

将其改为:

python3.4 sfc/sfc_agent.py --rest --odl-ip-port 127.0.0.1:8181 --auto-sff-name

执行sudo start_agent.sh

技术分享

可以看出sfc-agent监听5000端口。

 

在odl-sfc界面中创建SF:

创建控制层面数据:


技术分享

创建数据平面映射:

技术分享

这里SFF1无需先进行创建,如果先创建SFF在将SF加入,在ovs模式下(下文会涉及)有bug。

sfc-agent将会收到odl发来的restconf的请求创建SF1:

技术分享

在odl-sfc界面中创建SFF:

创建控制层面数据:

技术分享

这里SFF1一定要和刚才创建SF中关联的SFF名字一样。

创建数据平面映射:


技术分享

关联SF:

技术分享sfc-agent将会收到odl发来的restconf的请求创建SFF1:

技术分享

这样就建立了SF和SFF的绑定,当SFF收到数据包后会将其发送到SF上,SF处理完成后将数据包在发送给SFF。在sfc/sfc-py /sfc目录下,有一个sff_client.py文件,该文件将模拟一个分类器将模拟数据包发送给SFF。具体操作参考sff_client.py中的 内容,这里不做过多介绍。

 

6.2sfc-ovs demo场景分析

Odl中实现了sfc和ovs的结合模型,但在测试过程中发现bug不少。这里简单介绍下其工作原理。其架构图为:


技术分享

启动ovs后设置连接的odl,执行sudo ovs-vsctl set-manager tcp:127.0.0.1:6640

技术分享

对于创建SF,我们依然可以使用sfc-agent来作为模拟工具;对于SFF的创建,采用OVS的模式。

创建控制层面数据:

技术分享

这里SFF1一定要和刚才创建SF中关联的SFF名字一样。

创建数据平面映射:

技术分享

关联SF:关联SF:技术分享

关联SF:

技术分享

在ovs上执行:sudo ovs-vsctl show

技术分享

当SFF创建时,同时会在ovs上创建对应的bridge,如果SF加入到SFF,则会创建对应的tunnel port。

 

创建Service function chain:

技术分享

创建Service function path:

技术分享

在sfc/sfc-py/sfc目录下,有一个sff_client.py文件,来模拟数据包的发送,在ovs上查看对应得流表:

技术分享

流表分析:

对于创建的一条service function path,会下发该path的默认流表:

cookie=0x14, duration=450.830s, table=1, n_packets=0, n_bytes=0, idle_age=450, priority=350, nsp=37 actions=drop

 

转发路径:

cookie=0x14, duration=450.783s, table=0, n_packets=3, n_bytes=138, priority=250, ip actions=goto_table:3

cookie=0x14, duration=450.784s, table=3, n_packets=3, n_bytes=138, priority=540, nsp=37, nsi=255 actions=load: 0x7f000001->NXM_NX_TUN_IPV4_DST[], goto_table:10

 

cookie=0xba5eba11ba5eba11, duration=451.432s, table=10, n_packets=1, n_bytes=138, priority=751, nsp=37, nsi=254, in_port=1  actions=move:NXM_NX_NSI[]->NXM_NX_NSI[],move:NXM_NX_NSP[]->NXM_NX_NSP[],move:NXM_NX_NSH_C1[]->NXM_NX_TUN_IPV4_DST[],move:NXM_NX_NSH_C2[]->NXM_NX_TUN_ID[0..31],IN_PORT

 

cookie=0xba5eba11ba5eba11, duration=1253.432s, table=10, n_packets=1, n_bytes=138, priority=751, nsp=37, nsi=255, in_port=1 actions=move:NXM_NX_NSH_C1[]->NXM_NX_NSH_C1[],move:NXM_NX_NSH_C2[]->NXM_NX_NSH_C2[],move:NXM_NX_TUN_ID[0..31]->NXM_NX_TUN_ID[0..31],IN_PORT

 

由此可以看出,nsp对应于service function path id号,用于识别具体的一条service chain,nsi对应于service function path index,用于识别SFF的nexthop,使用openflow reg字段用来识别各个context的metadata。最多支持8个。

 

6.3sfc-api分析

对于sfc的api,odl提供了非常详细的api供外界调用,具体可以参照http://127.0.0.1:8181/apidoc/explorer/index.html进行查看,对于和openstack的结合也应该十分方便,在plugin中实现sfc restconf client调用,即可对sfc的资源进行控制。

 

7.总结分析

ODL提供了SFC的功能,但测试到目前为止,功能还是比较完善的,提供demo样例基于仿真实验 。目前SFC项目活跃度从github上看比较低。部分模块的Commit时间比较old,贡献者大约20左右。但后续ODL和NFV的结合还是很有发展潜力的。

 

参考:

https://tools.ietf.org/html/draft-quinn-sfc-arch-05

https://wiki.opendaylight.org/view/Service_Function_Chaining:Main

https://tools.ietf.org/html/draft-ietf-sfc-nsh-00

 

 

浅析OpendayLight SFC

原文:http://99cloud.blog.51cto.com/11229594/1839662

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!