kubernetes calico网络qos设计


整体需求

实现pod网络流量的QoS,包括出口流量跟入口流量。

技术方案

底层技术方案使用linux内核iproute2包中tctrafficcontrol)命令。LinuxQoS分为入口(Ingress)部分和出口(Egress)部分,入口部分主要用于进行入口流量限速(policing),出口部分主要用于队列调度(queuingscheduling)。大多数排队规则(qdisc)都是用于输出方向的,输入方向只有一个排队规则,即ingressqdiscingressqdisc本身的功能很有限(因为没有缓存只能实现流量的drop)。但可用重定向incomingpackets。通过Ingressqdisc把输入方向的数据包重定向到虚拟设备ifb,而ifb的输出方向可以配置多种qdisc,就可以达到对输入方向的流量做队列调度的目的。

流量控制使用无分类算法tbf(令牌桶算法)。令牌桶过滤器(TBF)只允许以不超过事先设定的速率到来的数据包通过,同时允许短暂突发流量朝过设定值TBF很精确,对于网络和处理器的影响都很小,实现是针对数据的字节数进行的,而不是针对数据包进行,常用于网关限速

对容器做流量控制即在宿主机对相应的interface做流控,所以interfaceingress流量对应podegress流量,interfaceegress流量对应podingress流量。

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流量(用ingressqdiscifbinterfaceingress方向的队列调度)

方案一:(限流所有流量)(加上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 0ipdst 0.0.0.0/0flowid1: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]




發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章