专栏名称: 云技术实践
关注云计算,云技术,云运维,云存储,存储,分布式,OpenStack,SDN,Ceph,虚拟化,运维,分享在云计算/虚拟化/运维项目实施中的资讯、经验、技术,坚持干货。
目录
相关文章推荐
架构师之路  ·  设计原本,架构师必读(新书上架,送福利) ·  6 天前  
架构师之路  ·  世界上最SB的事情就是... ·  5 天前  
架构师之路  ·  认知层次不同的人,是很难沟通的 ·  1 周前  
51好读  ›  专栏  ›  云技术实践

《OpenDaylight》第一章:OpenDaylight原理(中)

云技术实践  · 公众号  · 架构  · 2017-05-06 20:03

正文

编者按


《OpenDaylight Coolbook》这本书由云技术社区志愿者翻译组翻译,因为没有出版纸质书的计划,本书的翻译只会翻译重点章节。


翻译的过程是译者和作者思想沟通的过程,也是一个学习的过程,中间充满艰辛,也充满快乐,欢迎大家加入云技术社区翻译小组,一起交流、学习、提高,加入请联系群主(群主微信:xiaolikvm,群穿越使者北极熊微信:hadxiaer),也欢迎大家推荐好的英文技术资料到云技术社区,由社区会组织翻译,一起共同学习。


云技术越来越成熟,但是云计算网络技术目前有好几个流派,OpenDaylight就是其中之一,《OpenDaylight Coolbook》侧重概念及实战,阅读本书可以快读了解OpenDaylight。


以下社区优秀翻译参加了本书的翻译:

云技术社区 金牌翻译 韩卫    第一章

云技术社区 金牌翻译 邓嘉浩  第三章

云技术社区 金牌翻译 路君    第四章

云技术社区 金牌翻译 刘志红  第五章

云技术社区 金牌翻译 罗晶    第六章

云技术社区 金牌翻译 罗莹    第九章

云技术社区 金牌翻译 孟驰    第十章

云技术社区 金牌翻译 文杰    第十一章


校对

云技术社区 金牌翻译 陈海  第一,三,四章

云技术社区 金牌翻译 陈建永 第五,六,九章

云技术社区 金牌翻译 黄继敏 第十,十一章  


在此感谢他们辛苦而卓越的付出!

前接《OpenDaylight》第一章:OpenDaylight原理(上)


4、基础分布式交换


OpenDaylight中的基础分布式交换,由L2Switch提供了二层的交换功能。该服务构建于OpenFlowPlugin之上,因为它用于OpenFlow交换机的连接和交互。

L2Switch项目有以下特性和组件:

  • 包处理(Packet Handler):解析传入的数据包并分发,定义了一个包的生命周期为三个阶段:解析,修改,传输。

  • 环路消除(Loop Remover):检测网络环路并消除。

  • ARP处理(Arp Handler):处理包处理服务发送过来的ARP包。

  • 地址跟踪(Address Tracker):汇总网络中MAC和IP地址

  • 主机跟踪(Host Tracker):跟踪网络中的主机位置

  • L2Switch主程序:创建流表到交换机中


预备条件  


本单元介绍的操作需要一个OpenFlow交换机。如果没有,可以使用一个安装了OVS的Mininet-vm。你可以从https://github.com/mininet/mininet/wiki/Mininet-VM-Images下载mininet-vm。任何版本都可以。


操作指南  


1.使用karaf脚本启动OpenDaylight karaf发行版本。使用这个脚本你可以访问到karaf CLI。

$ ./bin/karaf

2.安装面向用户的特性功能以及需要的所有依赖

OpenDaylight-user@root>feature:install odll2switch-switch-ui

3.用mininet创建一个网络

用以下用户名及口令,登录mininet-vm

Username: mininet
Password: mininet

如果以前有名为br0的桥接,用以下命令行删除:

mininet@mininet-vm:~$ sudo ovs-vsctl del-br br0

创建拓扑:

mininet@mininet-vm:~$ sudo mn --controller=remote,ip=${CONTROLLER_IP} \
--topo=linear,3 --switch ovsk,protocols=OpenFlow13

使用该命令将会创建一个虚拟网络带有3个交换机,并连接到指定${CONTROLLER}的控制器。主机与交换机间会建立连接。

最终OpenDaylight-inventory中会三个OpenFlow节点

type: GET
headers:
   Authorization: Basic YWRtaW46YWRtaW4=
url:
http://localhost:8080/restconf/operational/OpenDaylight-inventory:nodes

请求返回以下内容:

--[cut]-
{
    "id": "OpenFlow:1",
    --[cut]-
},
{
    "id": "OpenFlow:2",
    --[cut]-
},
{
    "id": "OpenFlow:3",
    --[cut]-

4.使用mininet产生网络流量

在两个host之间使用ping

mininet> h1 ping h2

执行以上命令可以看到,host1 可以ping通 host2。

在所有主机之间执行:

mininet> pingall

pingall命令会让所有主机ping其他主机。

5.检查地址观察

得益于地址跟踪模块,使得观察交换机端口(节点连接器)上的地址元组的功能能够得以实现。

这个信息将保存到OpenFlow节点连接器,能被以下请求查询:

type: GET
headers:
Authorization: Basic YWRtaW46YWRtaW4=
url:
http://localhost:8080/restconf/operational/OpenDaylight-inventory:nodes/node/OpenFlow:1/nodeconnector/OpenFlow:2:1

请求将返回如下内容:

{
"nodes": {
"node": [
{
"id": "OpenFlow:2",
"node-connector": [
{
"id": "OpenFlow:2:1",
--[cut]--
"address-tracker:addresses": [
{
"id": 0,
"first-seen": 1462650320161,
"mac": "7a:e4:ba:4d:bc:35",
"last-seen": 1462650320161,
"ip": "10.0.0.2"
}
]
},
--[cut]—

这个结果意味着mac地址为7a:e4:ba:4d:bc:35的主机发送了一个包到switch2,switch2的port1处理了入口包。

6.检查主机地址,添加点到节点和交换机

type: GET
headers:
  Authorization: Basic YWRtaW46YWRtaW4=
url:
http://localhost:8080/restconf/operational/network-topology:network-topology/topology/flow:1/

将返回以下内容:

    --[cut]--

    host:c2:5f:c0:14:f3:1d
    
        host:c2:5f:c0:14:f3:1d
    
    
        OpenFlow:3:1
        
        host:c2:5f:c0:14:f3:1d
        true
    
    
        2
        c2:5f:c0:14:f3:1d
        1462650434613
        10.0.0.3
        1462650434613
    
    c2:5f:c0:14:f3:1d

    --[cut]—

Address标签包含了mac地址和IP地址映射信息,attachment-port定义了mac地址和IP地址之间的映射。

7.检查每个链接的STP协议

STP协议状态可以是转发,意味着数据包在活动链路上流动,或丢弃,链路无效时指示数据包不发送。

检查链路状态,发送以下请求:

type: GET
headers:
  Authorization: Basic YWRtaW46YWRtaW4=
url:
http://localhost:8181/restconf/operational/OpenDaylight-inventory:nodes/node/OpenFlow:2/nodeconnector/OpenFlow:2:2

返回如下信息:

{
    "node-connector": [
        {
        "id": "OpenFlow:2:2",
        --[cut]--
        "stp-status-aware-node-connector:status":"forwarding",
        "OpenDaylight-port-statistics:flow-capable-nodeconnector-statistics": {}
        }
        }
    ]
}

在这个例子中,所有的数据包从switch2的port2进入,在连接建立完成的链路转发。

8.检查成功创建的链路

为了检查已成功创建的链路,我们将发送和第6步一样的请求,观察响应中不同的部分。

type: GET
headers:
  Authorization: Basic YWRtaW46YWRtaW4=
url:
http://localhost:8080/restconf/operational/network-topology:network-topology/topology/flow:1/

不同的部分如下:

--[cut]--

host:7a:e4:ba:4d:bc:35/OpenFlow:2:1


host:7a:e4:ba:4d:bc:35
host:7a:e4:ba:4d:bc:35


OpenFlow:2
OpenFlow:2:1



OpenFlow:3:1/host:c2:5f:c0:14:f3:1d


OpenFlow:3:1
OpenFlow:3


host:c2:5f:c0:14:f3:1d
host:c2:5f:c0:14:f3:1d


--[cut]—

它表示在早期设置拓扑时建立的链路。 它也提供了源,目标节点和终止点。


工作原理  


OpenFlowPlugin项目在OpenFlow交换机和OpenDaylight之间提供了基础的通信通道。二层发现被ARP监听器和应答器处理。使用L2switch,OpenDaylight可以学习和跟踪网络实体地址。最后,使用图像算法,可以发现最短网络路径,以及消除网络环路。


更多信息  


可以修改或增加L2Swtich组件的基础配置


配置L2Switch  


用以下步骤修改配置:

1.执行上面提到的1和2两步

2.停止OpenDaylight:

OpenDaylight-user@root>logout

3.进入目录$ODL_ROOT/etc/OpenDaylight/karaf/

4.打开需要修改的配置文件

5.执行修改

6.保存并重新执行操作指南提到的步骤,新的配置就能生效


5、使用LACP绑定链路


OpenDaylight的LACP项目是实现了链路聚合控制协议(LACP)。

这个方法使用在自动发现,聚合已知的OpenDaylight网络和外部设备的链路,比如有LACP能力的交换。使用LACP能增加链路快速恢复能力,聚合带宽。

LACP协议作为IEEE以太网规范802.3ad首次发行,后来作为802.1AX用于桥接和管理组。

LACP模块监听传统交换机(非OpenFlow)生成的LACP控制包。


预备条件  


本单元介绍的操作需要一个OpenFlow交换机,没有的话,可以安装ovs,使用Mininet-vm代替。 下载mininet-vm:https://github.com/mininet/mininet/wiki/Mininet-VM-Images


Ovs用户  


Ovs版本大于等于2.1才能使用组表。如果提前下载了mininet-vm,你可以创建一个新的VM,更新ovs版本。更新mininet,可以使用以下命令:

$ cd /home/mininet/mininet/util 
$ ./install.sh -V 2.3.1

这个脚本会更新你的包,操作可能会失败。如果真的失败了,运行命令重新执行脚本

$ sudo apt-get update --fix-missing

重新运行脚本,几分钟后,新版本ovs就安装好了

mininet@mininet-vm:~$ sudo ovs-vsctl show 
1077578ef495-46a1-a96b-441223e7cc22 
ovs_version: "2.3.1"

为了使用LACP,必须保证传统(不是OpenFlow的)交换机已经配置了LACP模式,允许LACP插件回应报文。

本节内容的样例代码可以参考:

https://github.com/jgoodyear/OpenDaylightCookbook/tree/master/chapter1/chapter1-recipe5


操作指南  


1.使用karaf脚本启动OpenDaylight karaf发行版本。使用这个脚本你可以访问到karaf CLI。

$ ./bin/karaf

2.安装面向用户的特性功能以及所有依赖,开启LACP功能

OpenDaylight-user@root>feature:install odl-lacp-ui

3.创建mininet网络

登入mininet-vm

Username: mininet
Password: mininet

创建拓扑

mininet@mininet-vm:~$ sudo mn --controller=remote,ip=${CONTROLLER_IP} \
--topo=linear,1 --switch ovsk,protocols=OpenFlow13

这条命令创建了一个虚拟网络,包含一个交换机,连接到${CONTROLLER_IP}。

我们最终会在OpenDaylight-inventory中找到一个OpenFlow节点。

type: GET
headers:
Authorization: Basic YWRtaW46YWRtaW4=
url:
http://localhost:8080/restconf/operational/OpenDaylight-inventory:nodes

会返回以下信息

--[cut]-
{
"id": "OpenFlow:1",
--[cut]-
}   

4.打开一个新的终端访问mininet实例,确保处理LACP数据包的流条目已经安装:

mininet@mininet-vm:~$ sudo ovs-ofctl -O OpenFlow13
dump-flows s1
OFPST_FLOW reply (OF1.3) (xid=0x2):
cookie=0x3000000000000003, duration=185.98s, table=0, n_packets=0, n_bytes=0,
priority=5,dl_dst=01:80:c2:00:00:02,dl_type=0x8809 actions=CONTROLLER:65535
流使用了ethertype 0x8809,也就是一种LACP定义。

5.使用mininet CLI,我们在switch1(s1)和host1(h1)之间添加一个新的链路,然后聚合两条链路。

mininet> py net.addLink(s1, net.get('h1'))

mininet> py s1.attach('s1-eth2')

6.配置 host1(h1)作为传统交换机。我们创建一个bond口,模式类型设置成LACP。我们需要在mininet实例的/etc/modprobe.d目录下创建一个新的文件。

使用第4步的终端窗口访问目录,创建bonding.conf,包含内容:

alias bond0 bonding
options bonding mode=4

mode=4是指LACP,默认超时时间是很长的

7.使用mininet CLI,创建和配置bond口,添加bound物理网卡,h1-eth0和h1-eth1作为bound口的成员口。启动接口:

mininet> py net.get('h1').cmd('modprobe bonding')
mininet> py net.get('h1').cmd('ip link add bond0 type bond')
mininet> py net.get('h1').cmd('ip link set bond0 address ${MAC_ADDRESS}')
mininet> py net.get('h1').cmd('ip link set h1-eth0 down')
mininet> py net.get('h1').cmd('ip link set h1-eth0 master bond0')
mininet> py net.get('h1').cmd('ip link set h1-eth1 down')
mininet> py net.get('h1').cmd('ip link set h1-eth1 master bond0')
mininet> py net.get('h1').cmd('ip link set bond0 up')

确保修改${MAC_ADDRESS}为一个合适的mac地址。

一旦创建的bond0接口up了,host1会发送LACP数据包到switch1。OpenDaylight LACP模块会在switch1上创建链路聚合组。

可视化bound接口,可以执行以下命令:

mininet> py net.get('h1').cmd('cat /proc/net/bonding/bond0')

8.最后看下switch1 表,group table会有一个新的条目带有type=select:

mininet@mininet-vm:~$ sudo ovs-ofctl -O OpenFlow13 dump-groups s1
OFPST_GROUP_DESC reply (OF1.3) (xid=0x2):
group_id=41238,type=select,bucket=weight:0, actions=output:1,bucket=weight:0,actions=output:2
group_id=48742,type=all,bucket=weight:0, actions=drop

注意第一个条目:type是select,这意味着分组由组中的单个桶处理,以及两个具有相同的权重的桶。 每个桶表示交换机上的给定端口,端口1(s1-eth1)和2(s1-eth2)。

9.在交换机上应用链路聚合组,flow应该声明建立连接的组表条目的group_id,在我们的例子中是

group_id=41238。这里的flow用于ARP以太帧(dl_tpye=0x0806)。
sudo ovs-ofctl -O OpenFlow13 add-flow s1
dl_type=0x0806,dl_src=SRC_MAC,dl_dst=DST_MAC,actions=group:60169


工作原理  


OpenFlowPlugin项目在OpenFlow交换机和OpenDaylight之间提供了基础的通信通道。LACP项目实现了链路聚合控制协议作为MD-SAL的一个服务。使用包处理服务,可以接收和处理LACP包。基于一个周期性的状态机,可以定义是否要保持聚合。


相关阅读:

《OpenDaylight》第一章:OpenDaylight原理(上)

高端私有云项目交流群,欢迎加入!


加入中国最活跃的kubernetes技术讨论QQ群,加群主QQ:502207183,并注明城市、行业、技术方向。

交流 分享 提升

云技术社区成立于2014年,国内最大的云技术交流平台,分享在云计算/虚拟化项目实施中的资讯、经验和技术,坚持干货。旗下运营:云技术实践、云技术、桌面云之云潮涌动等公众号,以及相关的微信群和QQ群,覆盖云计算领域的技术人群,加入云技术社区微信、QQ群请点击订阅号菜单“群和活动”。