ODL Service Function Chaining
在网络通信过程中,包含各式各样的网络服务功能。既可以包含传统的像防火墙,NAT等功能,也有包含特定的网络应用功能(Service Function)。将特定的网络应用功能有序地组合起来,接着让流量通过这些服务功能就构成了网络服务链(Network Service Chain)。一般在数据中心环境下,往往会有网络服务链(Network Service Chaining)的部署需求,使得报文在数据中心传递的时候,能够经过各种各样的服务节点,保证安全、快速、稳定的网络服务。
SDN服务链基本概述
由于Overlay网络的发展,是的虚拟网络和物理网络分离,让数据中心的网络控制变得更加灵活,更具有扩展性。然而,在数据中心中,还存在很多介于虚拟网络和物理网络之间的中间件,如防火墙,QoS,负载均衡器等。这些中间件提供了必要的业务处理功能,即Service Function。灵活、便捷、高效、安全地调配流量到Service Function上处理,形成服务链(Service Function Chaining),这就是SFC项目要解决的问题。服务链可以理解为一种业务形式。
过去也有服务链的概念,但传统的网络服务链往往和网络拓扑紧密耦合、部署复杂,在服务链变更、扩容时,都需要改动网络拓扑,重新进行网络设备的配置。而云计算环境广泛使用虚拟化技术,具有动态性、高流动性、规模易变化、多租户等特点,传统网络的服务链无法满足这些需求,SDN的出现让服务链又焕发了生机。因此,当前再谈及服务链时,默认指的是SDN服务链。
与传统DC中配置的网络服务链相比,基于SDN的SFC具有如下的优势:
传统的网络服务链往往基于手工配置,很大程度上依赖于具体的网络拓扑,以至于网络设备之间的耦合性很大。而基于SDN的配置,可以动态的添加或者删除链表上的服务节点,不仅方便使用,而且解耦了网络设备之间的关联。
在数据流量经过链表的过程中,SFC还支持分类器与服务,服务与服务之间的上下文信息共享。
在传统的数据服务链中,数据包往往要经过过次分类,即多次解包、封包的过程。而在SFC中,这个过程大大缩减,一般只需在分类一次即可,使得整个过程更便捷、更高效。
基于OpenDaylight的服务链项目
OpenDaylight的SFC项目是整个控制器平台内部的一个功能模块。用户可以通过控制器提供的北向API来使用的SFC的功能,例如创建、更新或者删除Service Chain,还可以通过配置非透明的metadata数据段用来在Service Function的节点间实现数据共享。同时,项目可以向Controller的DataStore中注册、配置服务节点,并获取拓扑。南向也支持Netconf,Openflow12等协议。
SFC核心组件如下:
- Classification: 根据初始化的(配置好的)policy匹配数据流进行封装,然后转入到Service Function Chain中。
- Service Function(SF): 负责对收到的数据包进行特定功能的处理。作为一个逻辑上的组件,SF在具体实现的上可以是一个虚拟的元素,或者是嵌入在具体网络设备上的某种功能。常见的SF有:防火墙(firewall),WAN设备加速器,深层报文检测(Deep Packet Inspection,DPI),NAT等等。
Service Function Forwarder(SFF): 主要负责Service Function Chaining上的流量转发控制。
- Service Function Chain(SFC): SFC定义了一个抽象的Service Function有序集合。经过分类后的包要依次去遍历集合中的Service Function。比如:用户可以配置firewall->qos->dpi三种服务来构建一条SFC。
- Rendered Service Path(RSP) : 数据包实际行走的路径。
Service Function Path(Service Function Path): SFP是一个逻辑概念 它是介于SFC和RSP之间的一层抽象,有时候会将SFP与SFC等同。
那么,SFC项目是怎么综合起上述的组件进行工作的呢?
一种基于NSH封装头的机制是,使用ODL配置并下发一条Service Function Chain,每条Chain都有自己的标识。当host1发送数据包给host2,数据包首先会到分类器中进行筛选。分类出需要经过Service Function Chaining的数据包会进行封装,并打上NSH头。头中包含了很多信息,包括走哪一条服务链,服务链有几跳等。接着数据包会依次经过SFF,由SFF将数据包传递给SF或者下一跳的SFF,直到链的最后。
实验
系统环境
应用安装
应用名称 | 版本 | 验证方式 |
---|---|---|
Java | 1.8.0_221 | java -version |
Python | 3.5.2 | python -V |
Maven | 3.5.4 | mvn -version |
git | 2.7.4 | git --version |
命令安装
1.git安装
sudo apt-get install git
2.Maven安装
sudo apt-get install maven
3.Java安装
4.Python安装
自带的即可。
环境变量配置
- ~/.bashrc配置
alias python='/usr/bin/python3.5' #将环境变为默认的3.5 export MAVEN_OPTS="-Xmx1024" # mvn clean install 编译时建立堆,加快编译速度 export M3_HOME=/usr/local/apache-maven/apache-maven-3.5.4 # 似乎没啥用 export M3=$M3_HOME/bin # 似乎没啥用 maven环境另外放到了
- /etc/profile配置
export MAVEN_HOME=/usr/local/apache-maven/apache-maven-3.5.4 export JAVA_HOME=/usr/local/jdk1.8.0_221 export JRE_HOME=${JAVA_HOME}/jre export CLASSPATH=.:${JAVA_HOME}/lib:${JRE_HOME}/lib export PATH=${JAVA_HOME}/bin:$JRE_HOME/bin:$PATH export MAVEN_HOME=/usr/local/apache-maven/apache-maven-3.5.4 export PATH=${MAVEN_HOME}/bin:$PATH
注意,各应用安装路径可能不同,需要根据自己的调整 对应的路径。
下载编译
opendaylight sfc github地址如下:
https://github.com/opendaylight/sfc
1.用命令下载
git clone --branch release/oxygen-sr3 git@github.com:opendaylight/sfc.git
2.运行
mvn clean install -DskipTests
报错情况1
分析:以上错误原因是ODL编译过程中Maven会下载很多包,但是找不到下载的源需要在当前用户目录加上settings.xml。
解决:
可以在~/.m2/下查看有没有setting.xml文件
执行以下命令
wget -q -O - https://raw.githubusercontent.com/opendaylight/odlparent/master/settings.xml > ~/.m2/settings.xml
报错情况2
分析:由于bower版本太低问题。可以尝试升级bower。好像我没解决,然后换了版本(当前的O-sr3是可以用的版本)。
解决:换了opendaylight sfc版本。
报错情况3
分析:
这是在代码指定下载的bower,有时还会报错说太低而引发安全问题,对应的包情况在package.json中,如果有报这个错误,可以找到对应的package.json文件进行修改bower和node的版本。
解决:
找到与node_modules同级的package.json,进入进行修改
原来package.json
修改后:
{ "author": "Daniel Kuzma", "name": "opendaylight-sfc", "description": "openDayLight SFC UI", "version": "0.1.0", "homepage": "http://opendaylight.org", "license": "EPL-1.0", "bugs": "https://bugs.opendaylight.org/", "repository": { "type": "git", "url": "https://git.opendaylight.org/gerrit/sfc.git" }, "dependencies": {}, "devDependencies": { "bower": "~1.8.8" }, "engines": { "node": "~4.2.6" } }
3.运行成功举例
部署SFC
运行opendaylight,查看web界面的SFC是否正常
进入目录:.~~~karaf/target/assemblys/下
~/network-platform/oxygen-sr3-sfc/sfc/karaf/target/assembly$
1.如果有需要,删除opendaylight 相关组件、缓存如下。
rm instances/ journal/ data/cache/ -rf
2.运行opendaylight
运行
sudo ./bin/karaf
结果
3.安装必要组件
``` feature:install odl-netconf-api odl-netconf-mapping-api odl-netconf-util odl-netconf-netty-util odl-netconf-client odl-sfc-netconf odl-netconf-connector-all odl-netconf-notifications-api odl-mdsal-apidocs odl-mdsal-models odl-mdsal-binding odl-mdsal-binding-runtime odl-mdsal-common odl-mdsal-broker odl-mdsal-clustering-commons odl-mdsal-distributed-datastore odl-mdsal-remoterpc-connector odl-mdsal-broker-local odl-restconf odl-restconf-noauth odl-sfc-model odl-sfc-provider odl-sfc-provider-rest odl-sfc-ovs odl-sfc-ui odl-sfc-sb-rest odl-sfc-openflow-renderer ```
注意 如果组件安装不正确,将导致无法进入web界面查看。
可以使用list进行查看当前的状态以及log:tail查看日志信息。
# 查看已安装组件状态 opendaylight-user@root>list # 查看已安装组件 opendaylight-user@root>feature:list -i # 查找有某个名字的组件,比如sfc opendaylight-user@root>feature:list | grep sfc
4.访问Web地址
```http://192.168.29.137:8181/index.html```
测试
启动ODL提供的测试用例,进入如下,
~/network-platform/oxygen-sr3-sfc/sfc/sfc-py$
目录,执行如下命令,start_agent会在后台模拟ODL的南向设备。
./start_agent.sh 172.17.172.45:8181
在SFC-Web界面进行接下来的操作以及观察对应在运行stare_agent.sh脚本窗口的运行情况。
1.使用ODL WEB创建SF
窗口情况:第一个红框
2.创建SN
agent窗口无输出。
3.创建SFF
SFF1与SF1以及node1
窗口情况:第二个红框
查看Service Node情况如下所示
4.创建SFC
点击Service Function Chain,先将左侧建立的SF拖动到右侧的Servie Chain中。
然后点击旁边的一个保存图标。命名为Chain-1-Path-1
第一次点击保存,WEB页面提示创建成功,但后台start_agent提示出错。如下图所示。
原因分析:根据错误提示,分析是由于部署SFC过程中获取本地接口IPV6地址出错导致“sff_name”变量为空,然后异常退出,目前暂时不用IPV6,屏蔽掉这段代码:
file:~~~~/sfc/sfc-py/sfc/common/odl_api.py +321
从部署的第一步重新开始,再到这一步的窗口情况:第三个红框
5.启动客户端脚本,模拟发包
进入如下下目录
~/network-platform/oxygen-sr3-sfc/sfc/sfc-py/sfc$
输入命令:
python3.5 sff_client.py --remote-sff-ip 172.17.172.45 --remote-sff-port 4789 --sfp-id 128 --sfp-index 255
其中,remote-sff-ip是sff的ip,sff-port则为sff的端口,是刚才创建时填写的值。--sfp-id 的值要点击Service Function Path--> Rendered Service Path查看。如下图所示,sfp-id为16。sfp-index为255。
防火墙和SFF成功接收到数据包,如下图所示。
。
搭建两个SF的拓扑,进行发包。这个情况报错了,没有成功,错误原因暂时没有找到。主要时根据博客进行搭建的,有些错误不一样,但是该博主基本错误都提到了,步骤也非常仔细,非常感谢详细的分享!!
报错如下图所示:
参考链接:
博客:https://blog.csdn.net/dpcraft/article/details/78790108
博客:https://blog.csdn.net/u010827484/article/details/81223889
sdnlab: https://www.sdnlab.com/13826.html
opendaylight-sfc: https://wiki.opendaylight.org/view/Service_Function_Chaining:Main#Building_SFC
思科PPT Cisco Network Service Chaining Solutions:
https://wenku.baidu.com/view/b5cc0bee5acfa1c7ab00cc11.html