calico的两种网络模式BGP和IP-IP性能分析

本文详细评测了Calico网络插件在不同场景下的性能表现,包括物理机、物理机到Pod、Pod到Pod之间的带宽和延迟,并对比了IPIP与BGP网络模式的优劣。

目前使用较多的网络插件有 flannel,calico,canel等,但是如果对比以上几种网络插件的性能,还是calico最受欢迎

一、calico概述
二、性能评测指标
三、物理机性能评测
四、物理机到pod之间的性能测评
五、pod到pod之间的性能测评
六、calico使用ipip网络模式
七、calico使用bgp网络模式


一、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延迟的平均值

1

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进行压测

1

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上执行测试脚本:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

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上执行测试脚本:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

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

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

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上执行测试脚本:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

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上执行测试脚本:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

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不能通信。

<think>我们正在讨论BGPCalico网络插件中如何实现容器路由通告。根据引用内容,特别是引用[1]、[2]、[3][4],我们可以总结如下: 引用[1]指出Calico的核心特性是基于BGP的路由信息分发机制,它利用BGP在自治系统(AS)间自动分发路由,替代了类似Flannel使用Etcdflanneld的方式,从而提升网络的可扩展性可靠性。 引用[2]描述了具体的工作方式:每个节点(物理机或虚拟机)上运行一个BGP Speaker(即CalicoBGP客户端),负责收集本节点上所有容器的路由信息(即每个容器的IP地址所在网段的路由)。然后,这些BGP Speaker将路由信息上报给同一机架(Rack)上的接入交换机的BGP Route Reflector。Route Reflector是一个BGP路由反射器,它通过iBGP(内部BGP)协议将这些路由信息分发到整个网络的三层路由功能中。 引用[3]补充了Calico的网络架构细节:它不在宿主机上创建网桥设备(如docker0或cni0),而是通过Veth Pair将容器网络接口直接连接到宿主机网络命名空间,并在宿主机上设置路由规则,使得宿主机可以直接路由到容器的IP地址。 引用[4]提到了Calico两种模式:IPIP模式BGP模式。在BGP模式下,Calico使用BGP通告容器路由,而不使用隧道封装(IPIP模式则使用隧道封装)。但无论哪种模式,BGP都用于路由通告。 因此,BGPCalico中实现容器路由通告的具体步骤如下: 1. **节点上的路由收集**:每个Calico节点上的Felix组件(负责管理路由ACL等)会为每个容器创建路由条目(例如,目标地址为容器IP,下一跳为宿主机的Veth Pair接口或直接指向容器所在的宿主机接口)。 2. **BGP Speaker(BIRD)**:每个节点上运行着BIRD(或GoBGP)作为BGP客户端(BGP Speaker)。它从Felix获取本节点的容器路由信息。 3. **路由通告**: - 在小型网络中,节点之间可以直接建立全互连的BGP邻居关系(node-to-node mesh),每个节点直接向其他所有节点通告自己的容器路由。 - 在大规模网络中,通过引入BGP Route Reflector(RR),节点只需与RR建立邻居关系。节点将容器路由通告给RR,RR再将这些路由反射给其他节点(或跨机架的节点)[^2]。 4. **路由注入**:宿主机收到其他节点的容器路由后,会将这些路由添加到自己的路由表中(例如,目标地址为某个容器IP/32,下一跳为对应宿主机的IP)。这样,当宿主机上的容器需要访问另一个节点上的容器时,数据包就会根据路由规则被转发到正确的宿主机。 5. **跨节点通信**:一旦路由被正确分发,跨节点的容器通信就可以通过三层路由直接进行(在BGP模式下),避免了额外的隧道封装开销。 注意:在IPIP模式下,即使使用BGP分发路由,数据包仍会被封装在IPIP隧道中(通过tunl0设备)。但在纯BGP模式下,没有隧道封装,直接依靠三层路由转发。 这里有一个简单的路由表示例: 假设节点A(IP: 10.0.0.1)上有一个容器(IP: 192.168.1.2)。节点A的BGP Speaker会向网络通告一条路由: ``` 目标网络:192.168.1.2/32,下一跳:10.0.0.1 ``` 其他节点(如节点B)学到这条路由后,当节点B上的容器要访问192.168.1.2时,就会将数据包路由到节点A(10.0.0.1)。 引用[5]提供了故障排查命令,例如使用`calicoctl node status`检查BGP邻居状态,使用`ip route get <目标PodIP>`检查路由是否正常。 总结:BGPCalico中作为路由分发的控制平面协议,负责将每个节点上的容器路由通告到整个集群,使得所有节点都知道如何到达其他节点上的容器。 相关问题: 1. CalicoBGP模式与IPIP模式在性能上有何差异? 2. 如何配置Calico使用BGP Route Reflector? 3. 在Calico中,BGP邻居关系建立失败可能的原因有哪些? </think>### BGPCalico 中实现容器路由通告的机制 Calico 通过 BGP 协议实现高效的容器路由分发,具体实现流程如下: #### 1. **节点路由本地化** 每个物理节点(宿主机)上的 Calico 组件完成以下工作: - 为节点上的每个容器创建一对 `veth pair` 虚拟网络设备,一端在容器内(如 `eth0`),另一端暴露在宿主机上(如 `caliXXX`)[^3] - 在宿主机路由表中添加容器 IP 的直连路由(例如): ```bash # 目标容器IP 下一跳接口 10.244.1.5/32 dev cali1234 ``` 此时节点已具备本地容器路由能力。 #### 2. **BGP Speaker 路由收集** 每台宿主机运行 **BIRD**(BGP 守护进程)作为 `BGP Speaker`: - 自动扫描宿主机路由表,识别容器 IP 路由条目 - 将容器路由封装为 BGP UPDATE 消息 - 路由属性示例: - 目标网络:`10.244.1.5/32` - 下一跳:宿主机的物理 IP(如 `192.168.0.10`) - AS 路径:本节点 AS 号(默认所有节点同属 AS 64512) #### 3. **路由分层分发**[^2] 根据网络规模采用不同拓扑: - **小型集群(直接互联)**: 节点间建立全互联 BGP 邻居关系,直接交换路由: $$ \text{Node A} \xrightleftharpoons[\text{BGP}]{} \text{Node B} \xrightleftharpoons[\text{BGP}]{} \text{Node C} $$ - **大型集群(路由反射器)**: ```mermaid graph LR Node1 --> RR(Route Reflector) Node2 --> RR Node3 --> RR RR --> Node1 RR --> Node2 RR --> Node3 ``` 节点仅与 `BGP Route Reflector`(通常部署在接入交换机)建立 iBGP 会话,反射器负责路由中转[^2]。 #### 4. **路由生效与跨节点通信** 当节点接收到 BGP 路由更新后: 1. 将远端容器路由加入本机路由表: ```bash # 目标容器IP 下一跳(远端宿主机IP) 10.244.2.8/32 via 192.168.0.20 dev eth0 ``` 2. 数据包转发流程(容器A→容器B): ```mermaid sequenceDiagram 容器A->>宿主机A: 目标IP=10.244.2.8 宿主机A->>宿主机B: 根据路由表转发 宿主机B->>容器B: 通过caliXXX接口直达 ``` 3. **无隧道开销**:纯 BGP 模式下数据包无额外封装(与 IPIP 模式本质不同)[^4]。 #### 5. **关键优势** - **实时性**:容器启停时路由秒级收敛 - **可扩展**:路由反射器避免 $O(N^2)$ 连接问题 - **网络可见性**:可通过标准网络工具(`ip route`)或 `calicoctl node status` 查看路由[^5] > 故障排查示例:当跨节点通信失败时,执行 `ip route get 10.244.2.8` 验证路由是否存在[^5]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

查里王

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值