
本文简介全栈云的网络模型和流量隔离需求,并从流控原理、流控实现方案到落地方案进行研究。

全栈云SDN网络(软件定义网络)
为什么采用SDN?
传统网络方案复杂且难以自动化,无法满足大型数据中心虚拟主机网络管理的更高要求。
传统二层的VLAN方式只支持4096个,无法满足网络的隔离需求。
传统网络只能监控数据包的流入和流出,在针对业务层面的质量保证和监控措施很难实施,无法保证端到端的业务体验。
底层VLAN、网关、防火墙等物理资源的部署仍然通过手工配置,限制了计算资源的部署与自由迁移。
全栈云SDN方案
全栈云提供两种SDN:VPC网络和VBC网络。
1. 虚拟专有网络(VPC)
VPC是一个二层隔离,内部三层互通的虚拟网络网络,功能上由Vxnet、DVR(分布式虚拟路由器)和KVR(核心虚拟路由器)组成。Vxnet通过DVR完成二层隔离和三层互通,KVR实现VPC高级功能。SDN自定义的逻辑隔离网络空间,由用户自定义的,云上的服务资源可部署VPC内,如云主机、负载均衡、云数据库等。
VPC基于隧道技术来实现,支持自定义网段划分、IP地址和路由策略等,通过安全组和网络ACL(访问控制)等实现多层安全防护,VPC也可以通过VPN或专线与数据中心联通。
2. 虚拟基础网络(VBC)
云上所有用户共享公共网络资源池,用户之间未做逻辑隔离,IP地址由系统统一分配,相同的内网IP无法分配给不同用户。IP地址全行统一规划、网络可达,资源之间的缺乏有效的相互隔离,需要补充隔离,全栈云采用微隔离主机防火墙的方案进行隔离。
VBC是所有租户共享的网络,一般是/24位网段,一个基础网络最多252台虚拟机。基础网络主要由DVR组成,实现二层和三层的互通。
当前全栈云基础网络架构下,默认提供单网卡。网卡的带宽由管理流量、业务流量、存储流量、NAS流量等共享。

流量隔离方案
多网卡情况下,业务流量和管理流量使用不同的网卡,每个网卡在创建的时候会限定速率。突增的管理流量不会影响业务带宽的使用,此种方式可保证业务流量带宽不会被非业务流量挤占。全栈云正在建设多网卡的基础网络架构,从云底座丰富支持和控制能力。
目前使用单网卡情况下,业务流量和其它流量未分离,使用的都是同一块网卡,管理流量或者NAS流量可能会挤占业务流量带宽。而在业务系统中,业务流量优先级最高,需要通过限制非业务流量的带宽,保证在任何时候非业务流量的带宽上线是受控的。

单网卡下流量控制方案
流量控制是什么?
流量控制是一套用于网络包控制的队列系统和算法机制的总称。
它包含如下功能:
SHAPING: 网络流量的塑性,不单只降低可用带宽。也可以用于防止流量激增(用于发送数据)。
SCHEDULING:调度网络传输,提升网络应用的交互性(用于发送数据)。
POLICING:相对于SHAPING用于发送数据,而POLICING用于控制接收数据。
DROPPING:丢弃超出带宽限制的网络包(用于发送和接收数据)。
CLASSIFYING: 对不同的网络包进行分类,发往不同的发送队列。
MARKING: 修改网络包内容
Linux kernel流量控制实现
在linux中用于使用kernel原生Traffic Control(TC)功能进行网络流量控制,TC规则有两个重要属性,分别type(类型)和queues(队列)。
TC概念中,队列分为无类队列,有类队列。
无类队列只有一条队列,只有一种队列规则(qdisc);在无类队列中,最简单的是pfifo_fast队列,采取先入先出的算法,只能延迟数据包发送或丢弃数据包,不能对数据包进行调度,即改变数据包发送顺序。
而有类队列分为很多类(class),数据包到达时,根据不同的数据包类型,源目的ip,端口等等属性,被筛选器(filter)划分进不同的类中,不同的类可能有不同的队列规则,不同的类也可以继续划分,嵌套下去。
type就相当于不同的队列,具有不同的队列规则;queues就相当于有类队列的不同类。
HTB(hieratchical token bucket)类型使用了”tc”的htb队列,分层次的令牌桶队列,属于有类队列。HTB是Hierarchy Token Bucket的缩写。通过在实践基础上的改进,它实现了一个丰富的连接共享类别体系。使用HTB可以很容易地保证每个类别的带宽,虽然它也允许特定的类可以突破带宽上限,占用别的类的带宽。HTB可以通过TBF(Token Bucket Filter)实现带宽限制,也能够划分类别的优先级。
TBF(token bucket filter)类型,采取上面提到的令牌桶的算法,而htb就是在tbf的基础上修改为了有类队列,其核心算法还是令牌桶算法。
HFSC(hieratchical fair service curve)类型,对应了”tc”中的hsfc队列,分层次的公平服务曲线队列,它同时除了针对带宽,还针对延迟对数据包进行调度。

通用的流量控制与Linux TC的实现对应关系如下:


流量控制能解决哪些问题
Limit total bandwidth to a known rate; TBF, HTB with child class(es).
限制带宽
Limit the bandwidth of a particular user, service or client; HTB classes and classifying with a filter. traffic.
限制指定用户或服务的带宽
Maximize TCP throughput on an asymmetric link; prioritize transmission of ACK packets, wondershaper.
Reserve bandwidth for a particular application or user; HTB with children classes and classifying.
为特定服务保留带宽
Prefer latency sensitive traffic; PRIO inside an HTB class.
选择延迟敏感的通信
Managed oversubscribed bandwidth; HTB with borrowing.
管理超限使用带宽
Allow equitable distribution of unreserved bandwidth; HTB with borrowing.
Ensure that a particular type of traffic is dropped; policer attached to a filter with a drop action.
丢弃特定类型的网络包

如何进行流量控制
1. 为网卡单独设置qdiscs
tc qdisc add dev eth0 root fq_codel
tc qdisc del dev eth0 root
2. 更改系统默认qdiscs
net.core.default_qdisc = pfifo_fast
3. 查看当前qdisc配置
tc qdisc show dev eth0
tc -s qdisc show dev eth0
4. 使用 classful hfsc实现对特定ip或网段的流量限速
实现脚本编写示例:tc1.sh
tc qdisc add dev eth0 root handle 1:0 hfsc default 1 (添加hfsc ,默认的class 为1)
//添加2个class, 对应不同的速率限制, classid分别为1,2,3,4 ,速率上限分别为1mbit,2mbit
tc class add dev eth0 parent 1:0 classid 1:1 hfsc sc rate 1mbit ul rate 1mbit
tc class add dev eth0 parent 1:0 classid 1:2 hfsc sc rate 2mbit ul rate 2mbit
//添加一个 filter对发往目的ip地址进行网络速率限制
tc filter add dev eth0 protocol all parent 1: u32 match ip dst 192.168.1.73 flowid 1:1
//添加一个filter对发往目的ip网段进行网络速率限制
tc filter add dev eth0 protocol all parent 1: u32 match ip dst 192.169.11.0/24 flowid 1:2
5. 使用htb实现对特定ip或网段的流量限速
实现脚本编写示例:tc2.sh(与tc1.sh类似 )
tc qdisc add dev eth0 root handle 1:0 htb default 1
tc class add dev eth0 parent 1:0 classid 1:1 htb rate 1mbit ceil 1mbit
tc class add dev eth0 parent 1:0 classid 1:2 htb rate 2mbit ceil 2mbit
tc filter add dev eth0 protocol all parent 1: u32 match ip dst 192.168.1.73 flowid 1:1
tc filter add dev eth0 protocol all parent 1: u32 match ip dst 192.169.11.0/24 flowid 1:2

验证
节点A:192.168.11.16
节点B:192.168.1.73
节点C:192.169.11.5
1. 在节点A上执行tc1.sh

2. 在节点B启动iperf server,在节点A启动iperf client对节点B进行压测,可以看出速度限制在1Mbits/sec以下:
iperf3 -c 192.168.1.73 -i 1 -t 20 -P 8

3. 在节点C启动iperf server,在节点A启动iperf client对节点C进行压测,可以看出速度限制在2Mbits/sec以下:
iperf3 -c 192.169.11.5 -i 1 -t 20 -P 8


单网卡下全栈云的流控方案集成
通过上面的方式,只要确定了管理流量中各类型管理流量、业务流量、存储流量、NAS流量的网络地址段划分,按照网段实现基于hfsc流控机制或基于htb流控机制的脚本,把脚本加入基础镜像流水线,在创建业务节点的时候对非业务流量进行自动配置,业务流量不设流量限制,实现全栈云自动集成。

作者 | 邹秋波
视觉 | 王朋玉
统筹 | 郑 洁







