原文鏈接:https://mp.weixin.qq.com/s/688PEOWBhXxDz0eQpd1ydw
目前使用較多的網絡插件有flannel,calico,canel等,但是如果對比以上幾種網絡插件的性能,還是calico最受歡迎
一、calico概述
1.calico介紹
Calico是一個純三層的網絡插件,calico的bgp模式類似於flannel的host-gw
calico方便集成 OpenStack這種 IaaS雲架構,為openstack虛擬機、容器、裸機提供多主機間通信。
2.calico原理
calico是一個純三層的虛擬網絡,它沒有復用docker的docker0網橋,而是自己實現的, calico網絡不對數據包進行額外封裝,不需要NAT和端口映射,擴展性和性能都很好。Calico網絡提供了DockerDNS服務, 容器之間可以通過hostname訪問,Calico在每一個計算節點利用LinuxKernel實現了一個高效的vRouter(虛擬路由)來負責數據轉發,它會為每個容器分配一個ip,每個節點都是路由,把不同host的容器連接起來,從而實現跨主機間容器通信。而每個vRouter通過BGP協議(邊界網關協議)負責把自己節點的路由信息向整個Calico網絡內傳播——小規模部署可以直接互聯,大規模下可通過指定的BGProute reflector來完成;Calico基於iptables還提供了豐富而靈活的網絡策略,保證通過各個節點上的ACLs來提供多租戶隔離、安全組以及其他可達性限制等功能。
3.calico網絡模式
1)IPIP
把一個IP數據包又套在一個IP包里,即把IP層封裝到IP層的一個 tunnel,它的作用其實基本上就相當於一個基於IP層的網橋,一般來說,普通的網橋是基於mac層的,根本不需要IP,而這個ipip則是通過兩端的路由做一個tunnel,把兩個本來不通的網絡通過點對點連接起來;
calico以ipip模式部署完畢后,node上會有一個tunl0的網卡設備,這是ipip做隧道封裝用的,也是一種overlay模式的網絡。當我們把節點下線,calico容器都停止后,這個設備依然還在,執行 rmmodipip命令可以將它刪除。
2)BGP
邊界網關協議(BorderGateway Protocol, BGP)是互聯網上一個核心的去中心化的自治路由協議。它通過維護IP路由表或‘前綴’表來實現自治系統(AS)之間的可達性,屬於矢量路由協議。BGP不使用傳統的內部網關協議(IGP)的指標,而是基於路徑、網絡策略或規則集來決定路由。因此,它更適合被稱為矢量性協議,而不是路由協議,通俗的說就是將接入到機房的多條線路(如電信、聯通、移動等)融合為一體,實現多線單IP;
BGP 機房的優點:服務器只需要設置一個IP地址,最佳訪問路由是由網絡上的骨干路由器根據路由跳數與其它技術指標來確定的,不會占用服務器的任何系統;
官方提供的calico.yaml模板里,默認打開了ip-ip功能,該功能會在node上創建一個設備tunl0,容器的網絡數據會經過該設備被封裝一個ip頭再轉發。這里,calico.yaml中通過修改calico-node的環境變量:CALICO_IPV4POOL_IPIP來實現ipip功能的開關:默認是Always,表示開啟;Off表示關閉ipip。
二、性能評測指標
1.ping延遲: 用ping測試hosts之間和pods之間的延遲
2.帶寬測試: 用iperf測試hosts之間和pods之間的帶寬
3.HTTP性能測試: 部署單進程nginx server並使用apache benchmark(ab)測試
三、物理機性能評測
1.ping延遲:
登錄到master1節點,運行ping master2 測試延遲
通過下面的腳本例子計算ping延遲的平均值
ping master2 | head -n 20 | gawk '/time/ {split($8, ss, "="); sum+=ss[2]; count+=1;} END{print sum/count "ms";}'
結論:相互之間多次ping測試。延遲一般在60-64ms
2.iperf帶寬:
(1)查看物理機帶寬
登錄到master1節點
ethtool ens160
上面可以看到物理機帶寬為萬兆
(2)用iperf開始測試帶寬
登陸到master1和master2節點,安裝iperf,yum install iperf -y
在master2上啟動iperf服務
iperf server:iperf -s 顯示如下:
在master1上啟動客戶端命令:
iperf -c master2 -i 1
iperf -c master2 -u -t 60 -b 1000M
iperf -c master2 -u -t 60 -b 2000M
結論:物理機iperf帶寬4.51 Gbits/sec
3.nginx benchmark
在master1節點運行一個nginx的pod
docker run --name nginx-test -p 8050:80 nginx
在master2節點通過ab進行壓測
ab -n 90000 -c 50 http://172.16.0.1:8050/
四、物理機到pod之間的性能測評
1.帶寬
測試master1到node3節點上的pod之間的帶寬
運行一個iperf3的pod
kubectl run iperf3 --image=networkstatic/iperf3 --replicas=3 -- iperf3 -s
kubectl get pods -o wide
iperf3 -c 10.244.5.149 -i 1
結論:master1和node3上的pod之間的帶寬是4.06Gbits/s
五、pod到pod之間的性能測評
1.帶寬
測試node3上的pod到node2上的pod的帶寬
登錄到node3上的pod
kubectl exec -it iperf3-57d88c87b4-89kxw -- /bin/sh
iperf3 -c 10.244.4.213 -i 1
結論:node3上的pod和node2上的pod之間的帶寬是5.40Gbits/s
六、calico使用ipip網絡模式
1.測試帶寬,測試10次取平均值:
(1) 物理機到物理機/master1------>master2
在master2上 iperf3 -s
在master1上執行測試腳本:
cat iperftest.sh #!/bin/bash for i in {1..10}; do if [ "$i" -eq "1" ] then iperf3 -c master2 > iperf3data else iperf3 -c master2 >> iperf3data fi done cat iperf3data | grep sender | awk '{print $7}' > sender cat iperf3data | grep receiver | awk '{print $7}' > receiver awk '{sum += $1};END {print "sender Avg= ",sum/NR}' sender awk '{sum += $1};END {print "receiver Avg= ",sum/NR}' receiver
結論:
sender Avg= 5.07
receiver Avg= 5.068
(2)物理機到pod/master1------>node3上的pod(pod:iperf3-57d88c87b4-89kxw ip:10.244.5.149)
在master1上執行測試腳本:
cat iperftest.sh #!/bin/bash for i in {1..10}; do if [ "$i" -eq "1" ] then iperf3 -c 10.244.5.149 > iperf3data else iperf3 -c 10.244.5.149 >> iperf3data fi done cat iperf3data | grep sender | awk '{print $7}' > sender cat iperf3data | grep receiver | awk '{print $7}' > receiver awk '{sum += $1};END {print "sender Avg= ",sum/NR}' sender awk '{sum += $1};END {print "receiver Avg= ",sum/NR}' receiver
結論:
sender Avg= 4.436
receiver Avg= 4.435
(3).pod到pod/node3節點pod((pod:iperf3-57d88c87b4-89kxw ip:10.244.5.149))------>node2上的pod(pod:iperf3-57d88c87b4-fmkcj ip:10.244.4.213 )
在node3的pod上執行測試腳本:
kubectl exec -it iperf3-57d88c87b4-89kxw -- /bin/sh
cat iperftest.sh #!/bin/bash for i in {1..10}; do if [ "$i" -eq "1" ] then iperf3 -c 10.244.4.213 > iperf3data else iperf3 -c 10.244.4.213 >> iperf3data fi done cat iperf3data | grep sender | awk '{print $7}' > sender cat iperf3data | grep receiver | awk '{print $7}' > receiver awk '{sum += $1};END {print "sender Avg= ",sum/NR}' sender awk '{sum += $1};END {print "receiver Avg= ",sum/NR}' receiver
結論:
sender Avg= 4.76
receiver Avg= 4.75889
2.測試ping延時,測試20次取平均值:
(1).物理機到物理機/master1------>master2
登錄到master1節點,運行ping master2 測試延時
通過下面的腳本例子計算ping延遲的平均值
ping master2 | head -n 20 | gawk '/time/ {split($8, ss, "="); sum+=ss[2]; count+=1;} END{print sum/count "ms";}'
結論:多次ping取平均值,延遲一般在0.189158ms
(2).物理機到pod/master1------>node3上的pod(pod:iperf3-57d88c87b4-89kxw ip:10.244.5.149)
ping 10.244.5.149 | head -n 20 | gawk '/time/ {split($7, ss, "="); sum+=ss[2]; count+=1;} END{print sum/count "ms";}'
結論:多次ping取平均值,延遲一般在0.297368ms
(3).pod到pod/node3節點pod((pod:iperf3-57d88c87b4-89kxw ip:10.244.5.149))------>node2上的pod(pod:iperf3-57d88c87b4-fmkcj ip:10.244.4.213 )
kubectl exec -it iperf3-57d88c87b4-89kxw -- /bin/bash
ping 10.244.4.213 | head -n 20 | awk '/time/ {split($7, ss, "="); sum+=ss[2]; count+=1;} END{print sum/count "ms";}'
結論:多次ping取平均值,延遲一般在0.312ms
七、calico使用bgp網絡模式
1.測試帶寬,測試10次取平均值:
(1).物理機到物理機/master1------>master2
在master2上 iperf3 -s
在master1上執行測試腳本:
cat iperftest.sh #!/bin/bash for i in {1..10}; do if [ "$i" -eq "1" ] then iperf3 -c master2 > iperf3data else iperf3 -c master2 >> iperf3data fi done cat iperf3data | grep sender | awk '{print $7}' > sender cat iperf3data | grep receiver | awk '{print $7}' > receiver awk '{sum += $1};END {print "sender Avg= ",sum/NR}' sender awk '{sum += $1};END {print "receiver Avg= ",sum/NR}' receiver
結論:
sender Avg= 5.081
receiver Avg= 5.079
(2).物理機到pod/master1------>node3上的pod(pod:iperf3-57d88c87b4-wbpqn ip:10.244.5.156)
在master1上執行測試腳本:
cat iperftest.sh #!/bin/bash for i in {1..10}; do if [ "$i" -eq "1" ] then iperf3 -c 10.244.5.156 > iperf3data else iperf3 -c 10.244.5.156 >> iperf3data fi done cat iperf3data | grep sender | awk '{print $7}' > sender cat iperf3data | grep receiver | awk '{print $7}' > receiver awk '{sum += $1};END {print "sender Avg= ",sum/NR}' sender awk '{sum += $1};END {print "receiver Avg= ",sum/NR}' receiver
結論:
sender Avg= 4.679
receiver Avg= 4.679
(3).pod--->pod
結論:跨節點pod之間不能通信
2.測試ping延時,測試20次取平均值:
(1).物理機到物理機/master1------>master2
登錄到master1節點,運行ping master2 測試延時
通過下面的腳本例子計算ping延遲的平均值
ping master2 | head -n 20 | gawk '/time/ {split($8, ss, "="); sum+=ss[2]; count+=1;} END{print sum/count "ms";}'
結論:多次ping取平均值,延遲一般在0.188842ms
(2).物理機到pod/master1------>node3上的pod(pod:iperf3-57d88c87b4-wbpqn ip:10.244.5.156)
ping 10.244.5.156 | head -n 20 | gawk '/time/ {split($7, ss, "="); sum+=ss[2]; count+=1;} END{print sum/count "ms";}'
結論:多次ping取平均值,延遲一般在0.268053ms
(3).pod到pod節點
結論:跨節點pod之間不能通信
上述兩種網絡模式網絡性能總結表
結論:
calico使用BGP網絡模式通信網絡傳輸速率較好,但是跨節點后pod不能通信。