kubernetes calico網路qos設計
整體需求
實現pod網路流量的QoS,包括出口流量跟入口流量。
技術方案
底層技術方案使用linux核心iproute2包中tc(trafficcontrol)命令。Linux中的QoS分為入口(Ingress)部分和出口(Egress)部分,入口部分主要用於進行入口流量限速(policing),出口部分主要用於佇列排程(queuingscheduling)。大多數排隊規則(qdisc)都是用於輸出方向的,輸入方向只有一個排隊規則,即ingressqdisc。ingressqdisc本身的功能很有限(因為沒有快取只能實現流量的drop)。但可用重定向incomingpackets。通過Ingressqdisc
流量控制使用無分類演算法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]