openflow协议之meter表简单实现

前言

       Openflow1.3以及后续的版本增加了meter表,基于此结构,OpenFlow Switch可以实现各种简单的QoS功能,比如速率限制等,再结合每个端口的队列(queues),可以实现更加复杂的QoS框架,例如DiffServ。

        一个meter可以衡量与它关联的数据包的速率,并进而可以控制其聚合速率。任何一个流表项(Flow Entry)都可以在其指令集(Instructions Set)里指定某一个Meter,从而控制与该流表项能够成功匹配的数据包的聚合速率。一条流表只能绑定一条meter表项(Meter Entry),一条meter表项能被多条流表绑定。

本实验环境基于centos7.6,Open vSwitch,ryu控制器和mininet实现

1、Openvswitch对meter表的支持简述

       查阅vSwitch官方的文档的Open vSwitch FAQ章节中的问题Does Open vSwitch support OpenFlow meters可知,Open vSwitch2.7版本的userspace datapath实现了对meter表的功能,Open vSwitch2.10版本的linux内核数据路径实现对meter表功能,本文采用当前最新的Open vSwitch版本2.10.1.相关问题的链接地址为:Quality of Service (QoS) — Open vSwitch 2.16.90 documentation

上文中提到两种类型的数据路径(datapath),事实上Open vSwitch 在不同的平台支持不同的数据路径,且不同的数据路径支持不同的功能集合。

目前之前4种数据路径:

  1. Linux upstream:基于Linux upstream自带的内核模块实现的datapath。由于linux内核版本差异,该类型的openvswitch 支持的功能根据不同发行版Linux 内核版本而不同。
  2. Linux OVS tree:通过OVS 源代码生成的内核模块实现的。
  3. Userspace: 也称为DPDK,dpif-netdev 或者dummy datapath。这是NetBSD,FreeBSD 和Mac OSX 仅支持的数据路径。
  4. Hyper-V:Windows 平台的数据路径。

下面列出不同的数据路径支持的功能:

四种datapath功能支持表

Feature

Linux upstream

Linux OVS tree

Userspace

Hyper-V

NAT

4.6

YES

Yes

NO

Connection tracking

4.3

YES

PARTIAL

PARTIAL

Tunnel - LISP

NO

YES

NO

NO

Tunnel - STT

NO

YES

NO

YES

Tunnel - GRE

3.11

YES

YES

YES

Tunnel - VXLAN

3.12

YES

YES

YES

Tunnel - Geneve

3.18

YES

YES

YES

Tunnel - GRE-IPv6

4.18

YES

YES

NO

Tunnel - VXLAN-IPv6

4.3

YES

YES

NO

Tunnel - Geneve-IPv6

4.4

YES

YES

NO

Tunnel - ERSPAN

4.18

YES

YES

NO

Tunnel - ERSPAN-IPv6

4.18

YES

YES

NO

QoS - Policing

YES

YES

YES

NO

QoS - Shaping

YES

YES

NO

NO

sFlow

YES

YES

YES

NO

IPFIX

3.10

YES

YES

NO

Set action

YES

YES

YES

PARTIAL

NIC Bonding

YES

YES

YES

YES

Multiple VTEPs

YES

YES

YES

YES

Meters

4.15

YES

YES

NO

Conntrack zone limit

4.18

YES

NO

N

      由表可知,基于linux内核的数据路径在内核版本为4.15以上才支持meter表功能,而centos7.6的内核版本为3.10,显然不支持该实验。为了确定是否支持meter表,可通过命令ovs-dpctl简单确定一下,如图1所示;而linux ovs tree类型的数据路径支持表中的所有功能,因此本文采用linux ovs tree类型的Open vSwitch.具体信息可以查看链接:Releases — Open vSwitch 2.16.90 documentation

图1 centos7.6原始内核对meter表支持情况图

2、linux ovs tree类型Open vSwitch安装

  1. 如果系统之前装过Open vSwitch,需要卸载,具体卸载方法,依据之前的安装方法而定,本博主卸载Open vSwitch采用暴力美学的强删(不到万不得已再用):
    1. find / -name ovs* 找出所有包含ovs开头文件或文件夹并删掉除安装包以外的所有ovs开头的目录和文件
    2. find /-name openvswitch* 找出所有包含openvswitch开头的文件或文件夹并删除除安装包外的所有文件夹或文件
  2. 如果未安装过Open vSwitch则按以下步骤安装:
    1. 安装依赖:yum install rpm-build autoconf automake libtool systemd-units openssl openssl-devel python python-twisted-core python-zope-interface python-six desktop-file-utils groff graphviz procps-ng  libcap-ng libcap-ng-devel  dpdk-devel PyQt4  selinux-policy-devel
    2. rpmbuild –ba -D "kversion 3.10.0-957.el7.x86_64"  ~/rpmbuild/SOURCES/openvswitch-2.10.1/rhel/openvswitch-kmod-fedora.spec(如果执行失败,则将下载的Open vSwitch.tar.gz安装包和解压后的安装包复制到~/rpmbuild/SOURCES/目录下重新执行该命令。PS:博主的路径是在root下,读者可自行设定路径)
    3. 安装依赖:yum install python-sphinx unbound unbound-devel
    4. rpmbuild –ba –without check -D "kversion 3.10.0-957.el7.x86_64"     ~/rpmbuild/SOURCES/openvswitch-2.10.1/rhel/openvswitch- fedora.spec
  3. 安装新包,cd  rpmbuild/RPMS/x86_64,执行命令:
    1. yum localinstall –y *
    2. systemctl enable openvswitch
  4. 更新kernel openvswitch模块,如果安装过openvswitch,则执行1和2,如果新安装则只执行步骤2即可
    1. mv /lib/modules/3.10.0-957.el7.x86_64/kernel/extra/openvswitch/* /lib/modules/`uname -r`/updates/
    2. depmod –av
  5. 创建开机自动加载openvswitch 内核模块
    1. vim /etc/sysconfig/modules/openvswicth.modules
    2. 内容如下:modprobe openvswitch
    3. modprobe vport-geneve
    4. modprobe vport-gre
    5. modprobe vport-lisp
    6. modprobe vport-stt
    7. modprobe vport-vxlan
    1. 修改权限:chmod 755 /etc/sysconfig/modules/openvswicth.modules
    2. 重启,查看模块信息,确实已经加载了新版本:modinfo openvswitch
    3. 验证是否支持meter表功能:
      1. ovs-vsctl add-br s1
      2. ovs-dpctl show,无告警信息提示,则可初步确定可支持meter
      3. ovs-ofctl –O OpenFlow13 meter-features s1,如果支持meter表,则如图所示: 
图2 linux ovs tree的meter表功能

 3、meter表实验

  1. 启动sdn控制器ryu:ryu-manager –verbose ryu.app.simple_switch_13
  2. 启动mininet:mn –topo single,2 –switch ovsk,protocols=OpenFlow13 –controller remote –mac
  3. 建立连接后,查看流表:ovs-ofctl –O OpenFlow13 dump-flows s1,此时只有一条默认流表;
      1. 增加meter表:ovs-ofctl -O OpenFlow13 add-meter br0 meter=1,kbps,band=type=drop,rate=200,即限速为200kbps,无报错则添加成功
      2. 增加流表项:ovs-ofctl -O OpenFlow13 add-flow br0 in_port=1,actions=meter:1,output:2
      3. 再次执行查看流表命令,查看s1数据路径类型:ovs-vsctl get bridge s1 datapath_type,为默认的空字符,即system类型
      4. 查看meter表统计:ovs-ofctl -O OpenFlow13 meter-stats s1,此时除时间外其他为0
      5. mininet中执行xterm h1 h2,

        1. 测试udp业务,在h1虚拟主机中,执行iperf –u –c 10.0.0.2 –i 1 –t 100 –b 400k;h2虚拟主机中,执行:iperf –u –s –i 1,再次执行查看meter表统计命令,效果如图1所示,业务效果如图2所示
        2. 测试tcp业务,在h1虚拟主机中,执行iperf –c 10.0.0.2 –i 1 –t 100 –b 400k;h2虚拟主机中,执行:iperf –s –i 1,再次执行查看meter表统计命令,效果如图1所示,业务效果如图3所示

图 3 meter表项、流表项以及meter表数据流量统计
图4 udp限速效果图

图5 tcp通过meter表限速效果图

5、总结

    Meter表的限速功能对udptcp业务都生效,实现了预期目的

附录:如果是32位系统的话,需要手动rpm包安装dpdk和dpdk-devel,如果非首次安装ovs,需要将/lib/modules/3.10.0-862.el7.centos.plus.i686/extra下的所有文件复制到/lib/modules/3.10.0-862.el7.centos.plus.i686/updata下面

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值