实现pod网络流量的QoS,包括出口流量跟入口流量。
底层技术方案使用linux内核iproute2包中tc(trafficcontrol)命令。Linux中的QoS分为入口(Ingress)部分和出口(Egress)部分,入口部分主要用于进行入口流量限速(policing),出口部分主要用于队列调度(queuingscheduling)。大多数排队规则(qdisc)都是用于输出方向的,输入方向只有一个排队规则,即ingressqdisc。ingressqdisc本身的功能很有限(因为没有缓存只能实现流量的drop)。但可用重定向incomingpackets。通过Ingressqdisc把输入方向的数据包重定向到虚拟设备ifb,而ifb的输出方向可以配置多种qdisc,就可以达到对输入方向的流量做队列调度的目的。
流量控制使用无分类算法tbf(令牌桶算法)。令牌桶过滤器(TBF):只允许以不超过事先设定的速率到来的数据包通过,同时允许短暂突发流量朝过设定值。TBF很精确,对于网络和处理器的影响都很小,实现是针对数据的字节数进行的,而不是针对数据包进行,常用于网关限速。
对容器做流量控制即在宿主机对相应的interface做流控,所以interface的ingress流量对应pod的egress流量,interface的egress流量对应pod的ingress流量。
1.容器ingress流量
方案一:(限流所有流量)
#tc qd add dev calic8794bc5a1c root tbf rate 256kbit burst 10000 latency 50ms
//速率256kbit 突发传输10k 最大延迟50ms
rate限制的传输速率用位来计算
latency确定了一个包在TBF中等待传输的最长等待时间.
burst桶的大小,以字节计.指定了最多可以有多少个令牌能够即刻被使用.
方案二:(***)
tc qdisc add dev calic8794bc5a1c root handle 3: htb default 30
tc class add dev calic8794bc5a1c parent 3: classid 3:3 htb rate 10mbit
//tc class add dev calic8794bc5a1c parent 3:3 classid 3:30 htb rate 6mbit ceil 10mbit
//tc class add dev calic8794bc5a1c parent 3:3 classid 3:33 htb rate 4mbit ceil 10mbit
tc filter add dev calic8794bc5a1c protocol ip parent 3:0 prio 1 u32 match ip src 10.10.102.66/32 flowid 3:3
tc filter add dev calic8794bc5a1c parent 3:0 protocol ip handle 3 fw flowid 3:33
iptables -t mangle -A PREROUTING ! -s 192.168.0.0/16 -j MARK --set-mark 3
2.容器egress流量(用ingressqdisc和ifb做interface上ingress方向的队列调度)
方案一:(限流所有流量)(加上haproxy可以限制外部流量)
#tc qdisc add dev calic8794bc5a1cingress
#tc filter add dev calic8794bc5a1c parent ffff: protocol ip prio 1 u32match ipdst 0.0.0.0/0police rate 10mbit burst 10000 drop flowid :1
方案二:(用ifb转发流量使用tbf限流)
#modprobe ifb
#ip link set dev ifb0 up
#tc qdisc add dev calic8794bc5a1cingress
#tc filter add dev calic8794bc5a1cparent ffff: protocol ip u32 match u320 0(ipdst 0.0.0.0/0)flowid1:1 action mirred egress redirect dev ifb0
#tc qdisc add dev ifb0 root tbfrate 256kbit burst 10000 latency 50ms
方案三:(内核3.19iproute2 4.1以上才支持)
tc filter add dev caliXXX parent ffff: protocol ip u32 match u32 0 0 action connmark action mirred egress redirect dev ifb0 flowid ffff:1
方案四:(***)
#tc qdisc add dev ifb0 root handle 1: htb
#tc class add dev ifb0 parent 1: classid 1:1 htb rate 6mbit burst 15k
#tc class add dev ifb0 parent 1:1 classid 1:10 htb rate 5mbit burst 15k
#tc class add dev ifb0 parent 1:1 classid 1:20 htb rate 3mbit ceil 6mbit burst 15k
#tc class add dev ifb0 parent 1:1 classid 1:30 htb rate 1kbit ceil 6mbit burst 15k
#tc qdisc add dev ifb0 parent 1:10 handle 10: sfq perturb 10
#tc qdisc add dev ifb0 parent 1:20 handle 20: sfq perturb 10
#tc qdisc add dev ifb0 parent 1:30 handle 30: sfq perturb 10
#tc filter add dev ifb0 protocol ip parent 1:0 prio 1 u32 match ip src 192.168.40.175/32 flowid 1:10
#tc filter add dev ifb0 protocol ip parent 1:0 prio 2 flowid 1:30(错误)
//tc filter add dev ifb0parent 1:0 protocol ip handle 4 fw flowid 1:30
//iptables-t mangle -A OUTPUT -s 192.168.0.0/16 -d 10.10.102.0/24 -j MARK--set-mark 4
配置
apiVersion: v1
kind: Pod
metadata:
name: qos
annotations:
kubernetes.io/ingress-bandwidth: 3M
kubernetes.io/egress-bandwidth: 3M
spec:
containers:
- name: net-test
imagePullPolicy: Never
image: net-test
command: [./run.sh]