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:
在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
原文:http://99cloud.blog.51cto.com/11229594/1839662