OpenStack L3网络QOS的实现思路

news/2024/7/6 2:47:17 标签: 云计算, OpenStack

在L版的ReleaseNotes里面我们看到Neutron已经支持了 ML2-QOS 特性, 这个特性可以让我们针对L2-Port和L2-Net做流量QOS设置, 这是一个非常实用的特性,在之前的版本中,对于虚机网络流量QOS,我们只能通过Flavor来去设置QOS, Flavor-QOS不是很灵活,这会让我去维护很多个Flavor来保证不同的QOS需求。

但是ML2-QOS只能做二层网络的流量限制,对于floating-IP级别的并不能生效,而且ML2-QOS依托于OpenVswitch本身的特性, 且OpenVswitch的QOS只能设置单向流量(虚机上行流量)。

我们还是需要一个L3-QOS,来实现针对floating-IP和router设置QOS,且能够设置上行和下行流量。

TC是基础

在Linux系统上,无论去使用怎样的工具,本质上都要使用TC来做流量控制。 如上面所说,针对floating-IP和router的QOS设置,我们必须让TC规则作用在对应的Net-namespace上:

图片描述

使用HTB来控制虚机的上行流量,使用Ingress来控制虚机的下行流量:

图片描述

此处需要注意的是,TC的版本不能太低,否则TC不能支持在namespace下设置规则,如果你是ubuntu系统, 建议至少使用这个版本IProute2_4.1.1-1ubuntu1_amd64。
实现原理请参考这个脚本:

\#!/bin/bash
\#
\#  kb or k: Kilobytes
\#  mb or m: Megabytes
\#  mbit: Megabits
\#  kbit: Kilobits
\#  To get the byte figure from bits, divide the number by 8 bit
\#
\#  ex: tc_htb.sh restart qg-f5f0ed64-84 qrouter-d5b5b595-9ae2-49e9-8fd9-6ddbf6195702
#
TC=/sbin/tc
if [ -n "$3" ]; then
    TC="/sbin/tc -n $3" #tc utility, IProute2-ss150706
fi
IF=$2           # Interface
UPLD=1mbit          # VM UPLOAD Limit
DEF_UPLD=2mbit          # VM UPLOAD Limit
DNLD=10mbit          # VM DOWNLOAD Limit
DEF_DNLD=20mbit          # VM DOWNLOAD Limit
IP=192.168.252.168  # VM IP
GW_IP=192.168.252.141  # Router GW IP
HTB_U32="$TC filter add dev $IF protocol all parent 1: prio 1 u32"
INGRESS_U32="$TC filter add dev $IF protocol all parent ffff:"

start() {
    # UPLOAD TRAFFIC
    $TC qdisc add dev $IF root handle 1: htb default 1000
    $TC class add dev $IF parent 1: classid 1:1000 htb rate $DEF_UPLD #burst 100kb
    $TC qdisc add dev $IF parent 1:1000 handle 1001: sfq perturb 10

    $TC class add dev $IF parent 1: classid 1:1 htb rate $UPLD #burst 100kb
    $TC qdisc add dev $IF parent 1:1 handle 2: sfq perturb 10
    $HTB_U32 match IP src $IP/32 flowid 1:1
    # DOWNLOAD TRAFFIC
    $TC qdisc add dev $IF ingress
    $INGRESS_U32 prio 1 u32 match IP dst $GW_IP/32 police rate $DEF_DNLD burst 512kb mtu 64kb drop flowid :1
    $INGRESS_U32 prio 2 u32 match IP dst $IP/32 police rate $DNLD burst 256kb mtu 64kb drop flowid :1
}
rm() {
    $TC qdisc del dev $IF parent 1:1
    $TC filter del dev $IF protocol all parent 1: prio 1
    $TC class del dev $IF parent 1: classid 1:1
    $TC filter del dev $IF protocol all parent ffff: prio 2

}
stop() {
    $TC qdisc del dev $IF root
    $TC qdisc del dev $IF ingress
}
restart() {
    stop
    sleep 1
    start
}
show() {
    echo '=================================='
    $TC -s -d -p qdisc show dev $IF
    echo '=================================='
    echo -e '\n'
    echo '=================================='
    $TC class show dev $IF
    echo '=================================='
    echo -e '\n'
    echo '=================================='
    $TC -s -d -p filter show dev $IF
    echo '----------------------------------'
    $TC filter show dev $IF parent ffff:
    echo '=================================='
}
case "$1" in
  start)
    echo -n "Starting bandwidth shaping: "
    start
    echo "done"
    ;;
  stop)
    echo -n "Stopping bandwidth shaping: "
    stop
    echo "done"
    ;;
  restart)
    echo -n "Restarting bandwidth shaping: "
    restart
    echo "done"
    ;;

  rm)
    echo -n "Rm bandwidth shaping: "
    rm
    echo "done"
    ;;
  show)

    echo "Bandwidth shaping status for $IF:"
    show
    echo ""
    ;;
  *)
    pwd=$(pwd)
    echo "Usage: $(/usr/bin/dirname $pwd)/tc.bash {start|stop|restart|show}"
    ;;
esac
exit 0

将上面的实现原理整合到自己维护的Neutron源码中。

使用案例

除了在底层支持L3-QOS外,还需要在Neutron-api层面支持设置具体属性值, 比如创建一个具有带宽限制的router或者floatingIP:

$ Neutron router-create aaaa --ha True --ingress_rate 14mbit --ingress_burst 512kb --egress_rate 12mbit --egress_burst 512kb
Created a new router:
+-----------------------+--------------------------------------------------------------------------------------------------------+
| Field                 | Value                                                                                                  |
+-----------------------+--------------------------------------------------------------------------------------------------------+
| admin_state_up        | True                                                                                                   |
| bandwidth             | {"ingress_rate": "14mbit", "egress_rate": "12mbit", "egress_burst": "512kb", "ingress_burst": "512kb"} |
| distributed           | False                                                                                                  |
| external_gateway_info |                                                                                                        |
| ha                    | True                                                                                                   |
| id                    | d2e8813a-6619-4784-a08a-2a2725fe2fb5                                                                   |
| name                  | aaaa                                                                                                   |
| routes                |                                                                                                        |
| status                | ACTIVE                                                                                                 |
| tenant_id             | 5e30ecc3c3434f24aa56801467ef1688                                                                       |
+-----------------------+--------------------------------------------------------------------------------------------------------+

$ Neutron floatingIP-create <ext-Net> --egress_rate 5mbit --egress_burst 150kb
Created a new floatingIP:
+---------------------+---------------------------------------------------+
| Field               | Value                                             |
+---------------------+---------------------------------------------------+
| bandwidth           | {"egress_rate": "5mbit", "egress_burst": "150kb"} |
| fixed_IP_address    |                                                   |
| floating_IP_address | 192.168.252.161                                   |
| floating_Network_id | 9946adcc-041e-4c0f-91b6-96a9fb6254c0              |
| id                  | 432f7dd6-b171-4de1-8e43-8069c42ee5a5              |
| Port_id             |                                                   |
| router_id           |                                                   |
| status              | DOWN                                              |
| tenant_id           | 5e30ecc3c3434f24aa56801467ef1688                  |
+---------------------+---------------------------------------------------+

修改已有router的带宽规则,并让其生效:

$ Neutron router-update <router-id> --admin-state-up False --ingress_rate 8mbit --ingress_burst 256kb
$ Neutron router-update <router-id> --admin-state-up True

注意这个过程中,连到这个router的所有机器都会断网

修改已有floatingIP的带宽规则,并让其生效:

$ Neutron floatingIP-disassociate <fIP-id> --ingress_rate 7mbit --ingress_burst 256kb
$ Neutron floatingIP-associate <fIP-id> <Port-id>

注意这个过程中,floatingIP是从解绑到绑定。

本文源自CSDN与OpenStack中国社区等Top合作媒体联合举办的“我要直播奥斯汀”(http://www.openstack.cn/?p=4396)活动

保护期(2016.1.19-2016.1.26)内非合作媒体不得转载,媒体合作请联系: editor@openstack.cn,关注OpenStack 奥斯汀峰会,请关注我要直播奥斯汀”!

本文作者来自Niusmallnan (东网科技)张智博 。

责编:魏伟,关注OpenStack和Docker,欢迎投稿,weiwei@csdn.net


http://www.niftyadmin.cn/n/1840296.html

相关文章

专访微垣,独家揭秘阿里云容器服务

从诞生到现在&#xff0c;Docker就被吸引了全世界的关注&#xff0c;甚至被认为是能够改变世界的那只“箱子”&#xff0c;关于Docker技术的任何新闻都能引起业界的强烈关注。毋庸置疑&#xff0c;这一领域吸引了众多的创业者&#xff0c;许多年轻的创业者开始在这个领域开拓自…

jmeter测试计划配置

用户定义的变量&#xff1a; 测试计划上可以添加用户定义的变量。一般添加一些系统常用的配置。如果测试过程中想切换环境&#xff0c;切换配置&#xff0c;一般不建议在测试计划上添加变量&#xff0c;因为不方便启用和禁用&#xff0c;一般是直接添加用户自定义变量组件。如&…

电商SPU SKU

SPU Standard Product Unit &#xff08;标准化产品单元&#xff09; SPU是商品信息聚合的最小单位&#xff0c;是一组可复用、易检索的标准化信息的集合&#xff0c;该集合描述了一个产品的特性。通俗点讲&#xff0c;属性值、特性相同的商品就可以称为一个SPU。 SKUstock ke…

JavaScript中几种 获取元素的方式

1.根据id获取元素document.getElementById("id属性的值");2.根据标签名字获取元素document.getElementsByTagName("标签的名字");3.根据name属性的值获取元素document.getElementsByName("name属性的值");4.根据类样式的名字获取元素 document.g…

明明只要几千行代码能搞定,为什么偏偏要写几万行?

明明只要几千行代码能搞定&#xff0c;为什么偏偏要写几万行&#xff1f; 写程序是一种创作&#xff0c;不能算是苦力。不能每天在电脑前枯坐十几个小时&#xff0c;否则超时作业&#xff0c;只会让自己的脑袋更糊涂&#xff0c;无法分心进行深入创作。 在创作程序的期间&#…

活动预告 |优软中国+智能硬件服务研讨会即将启幕,整合服务引领行业发展

活动预告 |优软中国智能硬件服务研讨会即将启幕&#xff0c;整合服务引领行业发展 从全球来看&#xff0c;生活智慧化与生产智能化需求正驱动智能硬件市场日益繁荣&#xff0c;技术突破与融合创新孕育着发展新机遇&#xff0c;“互联网智能硬件”影响将迅速向工业、医疗、交通、…

Kubernetes部署(四):ETCD集群部署

相关内容&#xff1a; Kubernetes部署&#xff08;一&#xff09;&#xff1a;架构及功能说明Kubernetes部署&#xff08;二&#xff09;&#xff1a;系统环境初始化Kubernetes部署&#xff08;三&#xff09;&#xff1a;CA证书制作Kubernetes部署&#xff08;四&#xff09;&…

我用Flutter实现了艾宾浩斯记忆知识的app

背景在我们的工作生活中&#xff0c;各种身份的你&#xff0c;是否有记不住东西的困惑&#xff0c;如&#xff1a;1、作为学生&#xff0c;特别是文科生&#xff0c;临近考试&#xff0c;才发现自己有一大堆的东西没记住&#xff0c;慌慌张张上战场&#xff0c;结果挂科了&…