OpenStack L3网络QOS的实现思路

云计算 OpenStack
ML2-QOS只能做二层网络的流量限制,对于floating-IP级别的并不能生效,我们还是需要一个L3-QOS,来实现针对floating-IP和router设置QOS,且能够设置上行和下行流量。

 在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。

实现原理请参考这个脚本:

  1. #!/bin/bash 
  2.  
  3.  
  4. # kb or k: Kilobytes 
  5.  
  6. # mb or m: Megabytes 
  7.  
  8. # mbit: Megabits 
  9.  
  10. # kbit: Kilobits 
  11.  
  12. # To get the byte figure from bits, divide the number by 8 bit 
  13.  
  14.  
  15. # ex: tc_htb.sh restart qg-f5f0ed64-84 qrouter-d5b5b595-9ae2-49e9-8fd9-6ddbf6195702 
  16.  
  17.  
  18. TC=/sbin/tc 
  19.  
  20. if [ -n "$3" ]; then 
  21.  
  22. TC="/sbin/tc -n $3" #tc utility, IProute2-ss150706 
  23.  
  24. fi 
  25.  
  26. IF=$2 # Interface 
  27.  
  28. UPLD=1mbit # VM UPLOAD Limit 
  29.  
  30. DEF_UPLD=2mbit # VM UPLOAD Limit 
  31.  
  32. DNLD=10mbit # VM DOWNLOAD Limit 
  33.  
  34. DEF_DNLD=20mbit # VM DOWNLOAD Limit 
  35.  
  36. IP=192.168.252.168 # VM IP 
  37.  
  38. GW_IP=192.168.252.141 # Router GW IP 
  39.  
  40. HTB_U32="$TC filter add dev $IF protocol all parent 1: prio 1 u32" 
  41.  
  42. INGRESS_U32="$TC filter add dev $IF protocol all parent ffff:" 
  43.  
  44. start() { 
  45.  
  46. # UPLOAD TRAFFIC 
  47.  
  48. $TC qdisc add dev $IF root handle 1: htb default 1000 
  49.  
  50. $TC class add dev $IF parent 1: classid 1:1000 htb rate $DEF_UPLD #burst 100kb 
  51.  
  52. $TC qdisc add dev $IF parent 1:1000 handle 1001: sfq perturb 10 
  53.  
  54. $TC class add dev $IF parent 1: classid 1:1 htb rate $UPLD #burst 100kb 
  55.  
  56. $TC qdisc add dev $IF parent 1:1 handle 2: sfq perturb 10 
  57.  
  58. $HTB_U32 match IP src $IP/32 flowid 1:1 
  59.  
  60. # DOWNLOAD TRAFFIC 
  61.  
  62. $TC qdisc add dev $IF ingress 
  63.  
  64. $INGRESS_U32 prio 1 u32 match IP dst $GW_IP/32 police rate $DEF_DNLD burst 512kb mtu 64kb drop flowid :1 
  65.  
  66. $INGRESS_U32 prio 2 u32 match IP dst $IP/32 police rate $DNLD burst 256kb mtu 64kb drop flowid :1 
  67.  
  68.  
  69. rm() { 
  70.  
  71. $TC qdisc del dev $IF parent 1:1 
  72.  
  73. $TC filter del dev $IF protocol all parent 1: prio 1 
  74.  
  75. $TC class del dev $IF parent 1: classid 1:1 
  76.  
  77. $TC filter del dev $IF protocol all parent ffff: prio 2 
  78.  
  79.  
  80. stop() { 
  81.  
  82. $TC qdisc del dev $IF root 
  83.  
  84. $TC qdisc del dev $IF ingress 
  85.  
  86.  
  87. restart() { 
  88.  
  89. stop 
  90.  
  91. sleep 1 
  92.  
  93. start 
  94.  
  95.  
  96. show() { 
  97.  
  98. echo '==================================' 
  99.  
  100. $TC -s -d -p qdisc show dev $IF 
  101.  
  102. echo '==================================' 
  103.  
  104. echo -e '\n' 
  105.  
  106. echo '==================================' 
  107.  
  108. $TC class show dev $IF 
  109.  
  110. echo '==================================' 
  111.  
  112. echo -e '\n' 
  113.  
  114. echo '==================================' 
  115.  
  116. $TC -s -d -p filter show dev $IF 
  117.  
  118. echo '----------------------------------' 
  119.  
  120. $TC filter show dev $IF parent ffff: 
  121.  
  122. echo '==================================' 
  123.  
  124.  
  125. case "$1" in 
  126.  
  127. start) 
  128.  
  129. echo -n "Starting bandwidth shaping: " 
  130.  
  131. start 
  132.  
  133. echo "done" 
  134.  
  135. ;; 
  136.  
  137. stop) 
  138.  
  139. echo -n "Stopping bandwidth shaping: " 
  140.  
  141. stop 
  142.  
  143. echo "done" 
  144.  
  145. ;; 
  146.  
  147. restart) 
  148.  
  149. echo -n "Restarting bandwidth shaping: " 
  150.  
  151. restart 
  152.  
  153. echo "done" 
  154.  
  155. ;; 
  156.  
  157. rm) 
  158.  
  159. echo -n "Rm bandwidth shaping: " 
  160.  
  161. rm 
  162.  
  163. echo "done" 
  164.  
  165. ;; 
  166.  
  167. show) 
  168.  
  169. echo "Bandwidth shaping status for $IF:" 
  170.  
  171. show 
  172.  
  173. echo "" 
  174.  
  175. ;; 
  176.  
  177. *) 
  178.  
  179. pwd=$(pwd) 
  180.  
  181. echo "Usage: $(/usr/bin/dirname $pwd)/tc.bash {start|stop|restart|show}" 
  182.  
  183. ;; 
  184.  
  185. esac 
  186.  
  187. exit 0 

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

使用案例

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

  1. $ Neutron router-create aaaa --ha True --ingress_rate 14mbit --ingress_burst 512kb --egress_rate 12mbit --egress_burst 512kb 
  2.  
  3. Created a new router: 
  4.  
  5. +-----------------------+--------------------------------------------------------------------------------------------------------+ 
  6.  
  7. | Field | Value | 
  8.  
  9. +-----------------------+--------------------------------------------------------------------------------------------------------+ 
  10.  
  11. | admin_state_up | True | 
  12.  
  13. | bandwidth | {"ingress_rate""14mbit""egress_rate""12mbit""egress_burst""512kb""ingress_burst""512kb"} | 
  14.  
  15. | distributed | False | 
  16.  
  17. | external_gateway_info | | 
  18.  
  19. | ha | True | 
  20.  
  21. | id | d2e8813a-6619-4784-a08a-2a2725fe2fb5 | 
  22.  
  23. | name | aaaa | 
  24.  
  25. | routes | | 
  26.  
  27. | status | ACTIVE | 
  28.  
  29. | tenant_id | 5e30ecc3c3434f24aa56801467ef1688 | 
  30.  
  31. +-----------------------+--------------------------------------------------------------------------------------------------------+ 
  32.  
  33. $ Neutron floatingIP-create --egress_rate 5mbit --egress_burst 150kb 
  34.  
  35. Created a new floatingIP: 
  36.  
  37. +---------------------+---------------------------------------------------+ 
  38.  
  39. | Field | Value | 
  40.  
  41. +---------------------+---------------------------------------------------+ 
  42.  
  43. | bandwidth | {"egress_rate""5mbit""egress_burst""150kb"} | 
  44.  
  45. | fixed_IP_address | | 
  46.  
  47. | floating_IP_address | 192.168.252.161 | 
  48.  
  49. | floating_Network_id | 9946adcc-041e-4c0f-91b6-96a9fb6254c0 | 
  50.  
  51. | id | 432f7dd6-b171-4de1-8e43-8069c42ee5a5 | 
  52.  
  53. | Port_id | | 
  54.  
  55. | router_id | | 
  56.  
  57. | status | DOWN | 
  58.  
  59. | tenant_id | 5e30ecc3c3434f24aa56801467ef1688 | 
  60.  
  61. +---------------------+---------------------------------------------------+ 

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

  1. $ Neutron router-update --admin-state-up False --ingress_rate 8mbit --ingress_burst 256kb 
  2.  
  3. $ Neutron router-update --admin-state-up True 

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

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

  1. $ Neutron floatingIP-disassociate --ingress_rate 7mbit --ingress_burst 256kb 
  2.  
  3. $ Neutron floatingIP-associate 

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

本文源自OpenStack中国社区与云头条、ZDNet\Solidot、CSDN、51CTO、infoQ、科技茱比、特大号、IDC圈等Top合作媒体联合举办的“我要直播奥斯汀”(http://www.openstack.cn/?p=4396)活动

保护期(2016.1.19-2016.1.26)内非合作媒体不得转载。

责任编辑:xinxiaoliang
相关推荐

2015-01-20 13:19:52

OpenStack网络层数据链路层

2017-09-21 13:46:50

VXLANL3网络Overlay

2021-10-20 19:14:30

缓存CacheCPU

2013-03-15 10:28:26

PTNLTEVPN

2010-08-19 09:39:00

L3路由交换技术

2023-01-31 09:12:16

CPU芯片缓存

2022-08-26 14:58:43

区块链比特币架构

2017-05-04 15:36:54

Openstack Q实现实践

2011-12-21 10:54:56

惠普激光打印机

2021-03-30 09:35:12

网络安全动态速览安全教育

2021-04-27 14:11:02

自动驾驶AI人工智能

2020-12-22 14:03:07

网络安全物联网

2020-04-17 13:35:15

OpenStack私有云云计算

2011-12-07 14:20:40

惠普激光打印机

2011-11-01 10:48:30

OKI激光打印机

2009-03-16 14:41:10

2010-08-30 13:18:18

QoS

2011-03-15 13:13:09

IMSNIPv6

2020-07-14 22:28:41

戴尔

2013-01-30 15:50:46

点赞
收藏

51CTO技术栈公众号