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]




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