文章目录
- Open vSwitch安装及部署
- Open vSwitch 桥管理
-
- 桥相关的基本概念
- 常用的 桥命令,进行 桥和端口的添加、删除、查看等操作
- Open vSwitch流表管理
-
- Open vSwitch流表的基本概念。
- 常用的流表命令,进行流表的添加、删除、查看等操作
- Open vSwitch 端口镜像
-
- 端口镜像的作用,利用Open vSwitch设置端口映射
- Open vSwitch QoS设置
-
- QoS(Quality of Service)等相关 络知识
- 利用Open vSwitch调控 络性能
- Open vSwitch流量监控
-
- 部署sFlow Collector和sFlow Agent
- 使用sFlow对Mininet模拟的Open vSwitch端口流量进行监控
Open vSwitch安装及部署
这一部分我参考了一篇大佬的博客:ubuntu安装运行Open vSwitch
Open vSwitch 桥管理
桥相关的基本概念
??在 络中,交换机和桥概念类似,Open vSwitch是一个虚拟交换软件,也就是说,Open vSwitch实现了 桥的功能。学习Open vSwitch的第一步要弄清楚 桥的概念。 桥是连接两个局域 的设备,工作在数据链路层,根据MAC地址来转发帧。在Open vSwitch中创建一个 桥后,此时 络功能不受影响,但是会产生一个虚拟 卡,之所以会产生一个虚拟 卡,是为了实现接下来的 桥(交换机)功能。有了这个 桥以后,还需要为这个 桥增加端口(port),一个端口就是一个物理 卡,当 卡加入到这个 桥之后,其工作方式就和普通交换机的一个端口的工作方式类似了。
??创建桥的时候会创建一个和桥名字一样的接口,并自动作为该桥的一个端口,那么这个虚拟接口的作用,一方面是可以作为交换机的管理端口,另一方面也是基于这个虚拟接口实现了桥的功能。Open vSwitch的内核模块实现了多个“数据路径”,每个都可以有多个vports。每个数据路径也通过关联流表(flow table)来设置操作,而这些流表中的流都是用户空间在 文头和元数据的基础上映射的关键信息,一般的操作都是将数据包转发到另一个vport。当一个数据包到达一个vport,内核模块所做的处理是提取其流的关键信息并在流表中查找这些关键信息,当有一个匹配的流时它执行对应的操作,如果没有匹配,它会将数据包送到用户空间的处理队列中,作为处理的一部分,用户空间可能会设置一个流用于以后碰到相同类型的数据包可以在内核中执行操作。
常用的 桥命令,进行 桥和端口的添加、删除、查看等操作
ovs-vsctl关于 桥管理的常用命令如下:
命令 | 含义 |
---|---|
init | 初始化数据库(前提数据分组为空) |
show | 打印数据库信息摘要 |
add-br BRIDGE | 添加新的 桥 |
del-br BRIDGE | 删除 桥 |
list-br | 打印 桥摘要信息 |
list-ports BRIDGE | 打印 桥中所有port摘要信息 |
add-port BRIDGE PORT | 向 桥中添加端口 |
del-port [BRIDGE] PORT | 删除 桥上的端口 |
get-controller BRIDGE | 获取 桥的控制器信息 |
del-controller BRIDGE | 删除 桥的控制器信息 |
set-controller BRIDGE TARGET | 向 桥添加控制器 |
Open vSwitch流表管理
Open vSwitch流表的基本概念。
??OpenFlow是用于管理交换机流表的协议,ovs-ofctl是Open vSwitch提供的命令行工具。在没有配置OpenFlow控制器的模式下,用户可以使用ovs-ofctl命令通过OpenFlow协议连接Open vSwitch来创建、修改或删除Open vSwitch中的流表项,并对Open vSwitch的运行状况进行动态监控。
??在OpenFlow白皮书中,Flow被定义为某个特定的 络流量。例如,一个TCP连接就是一个Flow,或者从某个IP地址发出来的数据包,都可以被认为是一个Flow。支持OpenFlow协议的交换机应该包括一个或多个流表,流表中的条目包含:数据包头的信息、匹配成功后要执行的指令和统计信息。当数据包进入OVS后,会将数据包和流表中的流表项进行匹配,如果发现了匹配的流表项,则执行该流表项中的指令集。相反,如果数据包在流表中没有发现任何匹配,OVS会通过控制通道把数据包发到OpenFlow控制器中。
常用的流表命令,进行流表的添加、删除、查看等操作
ovs-ofctl关于流表管理的常用命令如下表所示。
命令 | 含义 |
---|---|
show SWITCH | 输出OpenFlow信息 |
dump-ports SWITCH PORT | 输出端口统计信息 |
dump-ports-desc SWITCH | 输出端口描述信息 |
dump-flows SWITCH | 输出交换机中所有的流表项 |
dump-flows SWITCH FLOW | 输出交换机中匹配的流表项 |
add-flow SWITCH FLOW | 向交换机中添加流表项 |
add-flows SWITCH FILE | 在文件中向交换机添加流表项 |
mod-flows SWITCH FLOW | 修改交换机的流表项 |
del-flows SWITCH FLOW | 删除交换机的流表项 |
??对于add-flow、add-flows和mod-flows这3个命令,还需要指定要执行的动作actions=[target],[target]…,一个流规则中可能有多个动作,按照指定的先后顺序执行。
常见的流表操作如下表所示。
操作 | 说明 |
---|---|
output:port | 输出数据包到指定端口,port指端口的OpenFlow端口编 |
mod_vlan_vid | 修改数据包中的VLANtag |
strip_vlan | 移除数据包中的VLANtag |
mod_dl_src/mod_dl_dest | 修改源或者目标MAC地址信息 |
mod_nw_src/mod_nw_dst | 修改源或者目标IPv4地址信息 |
resubmit:port | 替换流表的in_port字段,并重新进行匹配 |
load:value->dst[start, end] | 写数据到指定字段 |
??在OVS中,流表项作为ovs-ofctl的参数,采用如下的格式:字段=值,如果有多个字段,可以用逗 或空格分开,一些常用的字段列举如下表所示。
字段名称 | 说明 |
---|---|
in_port=port | 传递数据包端口的OpenFlow端口编 |
dl_vlan=vlan | 数据包的VLANTag值,范围0-4095,0xffff代表不包含VLANTag |
dl_src(dst)= | 匹配源/目标MAC地址 |
dl_type=ethertype | 匹配以太 协议类型:0x800代表IPv4;0x86dd代表IPv6;0x806代表ARP |
nw_src(dst)=ip[/netmask] | 匹配源或目标IPv4地址,可以使用IP地址或域名 |
nw_proto=proto | 与dl_type协同使用,匹配IP/IPv6编 |
table=number | 流表编 ,范围0-254,默认为0 |
reg=value[/mask] | 交换机中寄存器的值 |
Open vSwitch 端口镜像
端口镜像的作用,利用Open vSwitch设置端口映射
??端口镜像(port Mirroring)是把交换机一个或多个端口(VLAN)的数据镜像到一个或多个端口的方法。在一些交换机中,我们可以通过对交换机的配置来实现将某个端口上的数据包,拷贝一份到另外一个端口上,这个过程就是端口镜像。
- 端口映射:把在公 的地址转翻译成私有地址,或者反过来。比如你通过路由器用ADSL上百度,你本机地址是192.168.1.10,但百度看到的IP地址是你的路由器的IP地址。百度把数据发送给路由器,你的路由器通过内置的端口映射表把数据转发给你。
- 端口镜像:把一个端口上的数据同时发送到原端口和另外一个端口,相当于另外一个端口得到了一个复本。它跟端口映射的主要区别在于:映射的目的是转发,而镜像的目的是复制!
??这里原文中写的是端口映射,可能是笔误,所以这里就统一为端口镜像。
- ovs-vsctl set interface vif1.0 ingress_policing_rate=10000
- ovs-vsctl set interface vif1.0 ingress_policing_burst=8000
??上面两行命令,把虚拟端口vif1.0的最大接收速率设置为10000kbps,桶大小设置为8000kb。策略使用了简单的令牌桶(token bucket)算法。我们以一定的速度不断生成令牌,除非令牌桶装满。每接收一个包,需要消耗一个令牌;如果没有令牌了,就会把新到达的包丢弃。如果到达包的速度大于令牌的生成速度,那么令牌很快消耗干净,新到达的包只能丢弃,那么接收包的速度很快就降下来,和令牌的生成速度一致。所以接收包的速度依赖于令牌的生成速度,换句话说,不能大于令牌的生成速度,也就是最大接收速率,即ingree_policing_rate的值,单位是kbps。如果到达包的速度小于令牌的生成速度,那么令牌很快堆满令牌桶,这时到达包的速度突然增大,令牌桶中有足够的令牌。这一瞬间可供消耗的令牌有桶中的令牌,也有不断生成的令牌,导致接收包的速度也会突然增大,大于令牌的生成速度,也就是大于我们设置的最大接收速率,称为突发接收速率。这时虽然突发接收速率大于最大接受速率,但是也是有限制的,最多增加的速率(最大突发接收速率减去最大接收速率)依赖于桶的大小,换句话说,增加的吞吐量不能大于桶的大小,即ingress_policing_burst的值,单位是kb。在上面的例子中,如果所有包的大小都是1kb,那么最多增加的速率达到8000kbps,最大突发接收速率达到18000kbps。
??注:接口和端口是两个比较容易混淆的概念。一般是物理上的概念,主机后面的就是接口,有KVM接口、以太 接口、同步串口等,也可以是逻辑上的概念比如VLAN的interface。端口是TCP/UDP协议的一个概念,用来区分某种应用,例如telnet的端口是23、而www的端口是80等。Open vSwitch既可以针对 络接口,也可以针对端口设置QoS,本实验中的QoS设置就是一个针对接口设置QoS的用例。
利用Open vSwitch调控 络性能
一、检验环境
ifconfig查看主机ip;两台主机之间进行ping操作确保互通
二、测试主机间的吞吐量
在主机1上执行以下命令,确认Open vSwitch进程。
执行以下命令,创建 桥br0,并将eth0 卡挂接到br0。
将eth0挂接到br0后,ovs云主机无法与其他主机通信,执行以下命令将eth0的IP赋给br0,如下图所示。
说明:利用ingress_policing_rate设置eth0端口最大速率(kbps),ingress_policing_burst设置最大浮动速率(kbps)。
执行以下命令启动客户端,测量服务器与主机之间的吞吐量,如下图所示。
使用sFlow对Mininet模拟的Open vSwitch端口流量进行监控
一、部署sFlow Collector
??首先,要想安装sFlow的话,首先要安装JAVA,我参考了一篇大佬的博客:(我选择了直接命令行安装,因为也挺快的,环境也是用的虚拟机Ubuntu18.04)
- 更新软件包列表:
- 安装openjdk-8-jdk:
- 查看java版本,看看是否安装成功:
结果如下图:
二、部署sFlow Agent
步骤1 选择主机1,单击终端图标,进入命令行终端。执行 su root切换到root用户。
步骤2 执行如下命令,进入root家目录,启动Mininet服务,模拟搭建一个交换机下挂2个主机的 络拓扑结构,结果如下图所示。
这里的screen真不知道是个什么东西,下面还没做,我环境崩了,重新搭一下先
步骤4 执行h1 ifconfig命令,查看h1的 卡信息,如下图所示。
步骤6 执行su root切换到root用户,然后执行如下命令把eth0端口IP复制给s1。
说明:通过eth0端口是无法监控到Mininet内部两个主机的ping测试。因此需要把eth0端口IP复制给s1,由s1端口作为sFlow Agent来监听。其中192.168.1.4是主机1的IP地址。
步骤7 输入ifconfig |more命令查看配置后的各端口状态,如下图所示。
注意:该命令执行的次数和需要开启sflow的 桥的数目有关,有几个 桥,就需要执行几次此命令。参数说明如下:
agent:虚拟机对应的某个监控流量的 卡,本实验用s1 卡产生和监控流量。
target:sFlow Collector的IP,默认端口6343。
bridge:需要开启sflow的 桥。
步骤10 配置完成后,输入如下命令查看已经配置的Agent信息。
三、查看监控结果
步骤1 登录主机1,输入http://localhost:8008 ,在登录sFlow Collector Web页面,查看Agents选项卡,可知已将虚拟机1(192.168.1.4)加到监控对象。

声明:本站部分文章及图片源自用户投稿,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!