近几年随着云计算和数据中心建设的高速发展,传统网络协议为了适应各种需求场景,组网方式也越来越复杂。SDN在云计算中可以使整个计算网络垂直开放,让网络具有软件编程能力,能够有效解决网络系统所面临的资源规模扩展受限、组网灵活性差的问题。
那什么是SDN呢,SDN全称为(Software?Defined?Network),就是软件定义网络,用软件编排网络,API开发,云平台租户组网,支持原生云编排,适合多种应用程序。
三个常见应用场景
租户网络
每个租户都有独立的私有网络和子网,在这种场景中,不同租户间的资源设备相互隔离。一个租户可以在自己的私有网络内创建多个子网。租户可以创建虚拟路由器,将虚拟网络和外部网络 连接起来。
跨数据中心网络
在大二层网络中,采用SDN技术可以将分布在不同数据中心的设备资源,跨中心整合在同一个网络内,多用于跨数据中心业务容灾,或用于跨数据中心灵活调配资源。
网络虚拟化
通过SDN的可编程方式,实现交换机、路由器、防火墙、Qos、负载均衡等网络设备的整合,在很短的时间内,即可生成独立虚拟网络。
经过上面对SDN理论的讲解,相信大家已经对SDN技术有所了解,由于SDN应用场景较多,限于篇幅,本次只用软件编排来完成SDN流量的出入方向的改变。下面介绍用Mininet来模拟SDN在云计算中实际应用场景。
Mininet介绍
Mininet可以创建一个真实的虚拟网络,支持OpenFlow、OpenvSwith等多种网络协议在宿主机上运行真实的设备内核、交换机和应用程序代码。
特性
-
支持OpenFlow、OpenvSwitch等软定义网路
-
支持系统级还原测试
-
支持复杂的自定义拓扑
-
提供Python API ,方便多人协作开发
-
硬件移植性好
-
高扩展性
-
支持上千台主机的网络结构
SDN实践部分
mininet的安装
╱ 下载Mininet的镜像文件 ╱
https://github.com/mininet/mininet/releases
╱ 本次测试环境 ╱
操作系统:Ubuntu 20.04.1 LTS(需安装系统图形界面,可支持Mininet图形操作)
内存:4G(如果想模拟更多设备和场景,可适当增加内存)
用户名:EBCloud
系统环境详见下图:
╱ 账户登录 ╱
建立用户EBCloud登录,2.2.0以后版本支持可视化,在 ../mininet/mininet/examples 目录下提供 miniedit.py 脚本,切换到相应目录下,在终端中执行:
sudo ~/mininet/mininet/examples/miniedit.py
即打开了MiniEdit可视化操作界面,左边从上到下分别是主机、OpenvSwitch 交换机、传统交换机、 传统路由器、链路、控制器。点击后在屏幕上点击可将设备放置到界面中。
mininet常用命令
创建网络拓扑常用参数:
-c # 释放之前创建拓扑时占用的未释放的资源
-h # 查看帮助
–topo # 在mininet启动时通过命令行定义拓扑
–custom # 用于创建自定义拓扑
–switch # 定义要使用的交换机,默认使用oVSK交换机
–controller # 定义要使用的控制器,如果没有指定则使用mininet中默认的控制器
–mac # 自动设置设备的MAC地址从而使MAC地址更易读
Mininet 内部交互常用命令:
help # 获取帮助列表
nodes # 查看网络拓扑中结点的状态
links # 显示链路健壮性信息
net # 显示网络拓扑
dump # 显示每个节点的接口设置和表示每个节点的进程的PID
pingall # 在网络中的所有主机之间执行ping测试
pingpair # 只测试前两个主机的连通性
iperf # 两个节点之间进行iperftcp带宽测试(iperf h1 n2)
iperfudp # 两节点之间进行iperfudp带宽测试(iperfudp bw h1 h2)
link # 禁用或启用节点间链路(link s1 s2 up启用,link s1 s2own禁用s1和s2之间的链路)
h1 ping h2 # h1和h2节点之间执行ping测试
h1 ifconfig # 查看host1的IP等信息
xterm h1 # 打开host1的终端
exit # 退出mininet登录
建立SDN网络拓扑
从左边拖拽出来设备即可组成拓扑,后台会自动生成配置,可拖动左侧边栏的主机 Host、交换机 Switch、路由器 Router、网络链路 NetLink、控制器Controller等组件到右侧空白处,实现拓扑的可视化仿真。
将4台主机、2台 Switch 和1台Controller 拖出,并用网线连接,形成下图所示的网络拓扑
右键点击主机和Controller,选择设置Properties:主机部分主要是设置ip,每台主机都需要操作;Controller 部分主要是设置控制器类型,此处可保留默认设置,如果是外部控制器,要选择RemoteController,之后填上Controller的ip,如果是本机则按照默认127.0.0.1 即可。点击左上角的Edit,进行全局设置,此时在默认设置的基础上,勾选“Start CLI”,将OpenFlow 1.1 1.2 1.3全部勾选。
net命令查看拓扑
可以看到h1和h2主机与EBCLOUD_s1连接,h3和h4主机与EBCLOUD_s2连接
现在已经对网络可以实现命令编排了,例如:
link EBCLOUD_s2 h1 down #禁用 EBCLOUD_s2 和 h1 之间的链路。
link EBCLOUD_s2 h1 up #连接 EBCLOUD_s2 和 h1 之间的链路。
流表的操作
h1如果和h2通信,通信先过s1,s1流表中没有inport=2流表项,就发送packin消息给控制器,控制器收到后下发packout消息给s1,s1根据收到的流表转发数据包给s2,s2流表中也没有匹配项,也需要发packin给控制器,控制器下发packout,s2进行转发给h2.
h2收到消息后给h1发送数据包,先给s2,s2也没有inport=2的流表项,联系控制器packin-packout,s2再转发给s1,s1已经有了inport=2的流表项,直接转发给h1。
流表的常用命令
查看流表
dpctl dump-flows
添加流表(1号端口进,2号端口出的转发流表)
dpctl add-flow in_port=1,actions=output:2
添加丢弃数据包流表(2号端口进,丢弃数据包)
dpctl add-flow in_port=2,actions=drop
删除所有交换机的所有流表
dpctl del-flows
删除所有交换机的特定流表项(输出2号端口进的流表项)
dpctl del-flows in_port=2
删除某个交换机的流表(删除s1中从2号端口进的流表项)
sh ovs-ofctl del-flows s1 in_port=2
输入dpctl dump-flows查看流表项:
可见上图中s1和s2还没有生成流表信息。
执行一下pingall后再查看流表项,就可以看到s1和s2生成了很多流表项:
第一条其中的in_port=\”s1-eth1\”表示从s1的1号端口进,actions=output:\”s1-eth2\”表示从s1的2号端口出的转发动作,dl_src,dl_dst分别为原MAC地址和目的MAC地址。
执行dpctl del-flows即可删除所有流表。
执行手动添加流表
dpctl add-flow in_port=1,actions=output:2
再dpctl dump-flows查询流表可以看到s1和s2都生成了1号端口进2号端口出的流表:
再添加一条从2号端口进1号端口出的流表:
dpctl add-flow in_port=2,actions=output:1
执行h1 ping h2,即可ping通,ctrl+c退出ping。
再执行h1 ping h3,无法ping通,原因是没有s2的3号端口转发的流表。s2根据流表只能1号端口进转发给2号端口出,3号端口连接的h3无法收到数据包。
删除交换机s1中从2号端口进入的所有流表
sh ovs-ofctl del-flows s1 in_port=2
再查看流表可以看到被删除。
删除所有交换机中输入端口为1的流表项
dpctl del-flows in_port=1
删除所有交换机中输入端口为2的流表项
dpctl del-flows in_port=2
再查看流表可见s1和s2中都没有流表项。
添加丢弃从2号端口进的数据包的流表项:dpctl add-flow in_port=2,actions=drop
再执行pingall,发现只有h3和h4之间是互通的。因为2号端口进的数据包都匹配到流表项需要丢弃,h3从3号端口进的和h4从4号端口进的没有流表项匹配,就向控制器申请下发流表。
再dpctl dump-flows查询流表,可以观察到s2中新增加了3号4号端口的流表项。
如果把2号端口和3号端口的进的流表禁用,只保留4号进的,会下发流表发出数据表,所以pingall都不能通
删除所有流表后再执行pingall,控制器此时会下发所有端口流表项。手动添加被丢弃2号和3号端口的流表项,再执行pingall,会发现所有通信任然正常。
因为手动添加的流表项和控制器下发的流表项共同存在,控制器下发的流表优先级最高,所以手动添加的流表项会失败。
到此,SDN的流量编排实践就结束了,要记得mininet只是模拟网络环境,并不是SDN核心部分,但是对SDN的特性部分理解很重要。
总结
最后总结一下SDN在云计算中的几点优势:
-
网络可编程
-
网络抽象化
-
可降低云中心运营成本
-
设备灵活调度
-
整网感知管理
-
支持原生云编排,适合SaaS的多种应用程序
目前数据中心多数已经采用扁平化架构,SDN网络在自动化运维,集中管理以及扩容中有着极大应用空间。本期讨论就到此为止,尽请期待下次分享!