OpenDaylight SFC环境搭建 Demo

时间:2019-10-22
本文章向大家介绍OpenDaylight SFC环境搭建 Demo,主要包括OpenDaylight SFC环境搭建 Demo使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

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

原文地址:https://www.cnblogs.com/Pan-xi-yi/p/11722334.html