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

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


随着微服务,DevOps等概念的诞生,k8s变得越来越受欢迎,为了应对快速的产品迭代和产品更新需求,很多公司都在把业务转移到相应的k8s集群中,那么当我们使用k8s时,最重要的一部分就是网络性能,当线上环境部署大量机器时,网络是影响客户体验的重要因素,所以当使用k8s时,需要先进行网络性能测试,目前使用较多的网络插件有flannel,calico,canel等,但是如果对比以上几种网络插件的性
能,还是calico最受欢迎,所以这篇文章将会带领大家了解网络插件calico

一、calico概述

1.calico介绍

Calico是一个纯三层的网络插件,calicobgp模式类似于flannelhost-gw

calico方便集成 OpenStack这种 IaaS云架构,为openstack虚拟机、容器、裸机提供多主机间通信。

2.calico原理

calico是一个纯三层的虚拟网络,它没有复用dockerdocker0网桥,而是自己实现的, calico网络不对数据包进行额外封装,不需要NAT和端口映射,扩展性和性能都很好。Calico网络提供了DockerDNS服务, 容器之间可以通过hostname访问,Calico在每一个计算节点利用LinuxKernel实现了一个高效的vRouter(虚拟路由)来负责数据转发,它会为每个容器分配一个ip,每个节点都是路由,把不同host的容器连接起来,从而实现跨主机间容器通信。而每个vRouter通过BGP协议(边界网关协议)负责把自己节点的路由信息向整个Calico网络内传播——小规模部署可以直接互联,大规模下可通过指定的BGProute reflector来完成;Calico基于iptables还提供了丰富而灵活的网络策略,保证通过各个节点上的ACLs来提供多租户隔离、安全组以及其他可达性限制等功能。

3.calico网络模式

1IPIP

把一个IP数据包又套在一个IP包里,即把IP层封装到IP层的一个 tunnel,它的作用其实基本上就相当于一个基于IP层的网桥,一般来说,普通的网桥是基于mac层的,根本不需要IP,而这个ipip则是通过两端的路由做一个tunnel,把两个本来不通的网络通过点对点连接起来;

calicoipip模式部署完毕后,node上会有一个tunl0的网卡设备,这是ipip做隧道封装用的,也是一种overlay模式的网络。当我们把节点下线,calico容器都停止后,这个设备依然还在,执行 rmmodipip命令可以将它删除。

2BGP

边界网关协议(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

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网络模式可以大幅提升不同节点间容器的通信网络传输速率,但是一个节点不能访问另一个节点的容器。

相关实践学习
通过Ingress进行灰度发布
本场景您将运行一个简单的应用,部署一个新的应用用于新的发布,并通过Ingress能力实现灰度发布。
容器应用与集群管理
欢迎来到《容器应用与集群管理》课程,本课程是“云原生容器Clouder认证“系列中的第二阶段。课程将向您介绍与容器集群相关的概念和技术,这些概念和技术可以帮助您了解阿里云容器服务ACK/ACK Serverless的使用。同时,本课程也会向您介绍可以采取的工具、方法和可操作步骤,以帮助您了解如何基于容器服务ACK Serverless构建和管理企业级应用。 学习完本课程后,您将能够: 掌握容器集群、容器编排的基本概念 掌握Kubernetes的基础概念及核心思想 掌握阿里云容器服务ACK/ACK Serverless概念及使用方法 基于容器服务ACK Serverless搭建和管理企业级网站应用
相关文章
|
5天前
|
NoSQL 关系型数据库 MySQL
《docker高级篇(大厂进阶):4.Docker网络》包括:是什么、常用基本命令、能干嘛、网络模式、docker平台架构图解
《docker高级篇(大厂进阶):4.Docker网络》包括:是什么、常用基本命令、能干嘛、网络模式、docker平台架构图解
91 56
《docker高级篇(大厂进阶):4.Docker网络》包括:是什么、常用基本命令、能干嘛、网络模式、docker平台架构图解
|
17天前
|
安全 Docker 容器
docker的默认网络模式有哪些
Docker 默认网络模式包括:1) bridge:默认模式,各容器分配独立IP,可通过名称或IP通信;2) host:容器与宿主机共享网络命名空间,性能最优但有安全风险;3) none:容器隔离无网络配置,适用于仅需本地通信的场景。
31 6
|
1月前
|
域名解析 网络协议 虚拟化
vmware 提供的三种网络工作模式
本文介绍了VMware虚拟机的三种网络工作模式:Bridged(桥接模式)、NAT(网络地址转换模式)和Host-Only(仅主机模式)。桥接模式将虚拟机与主机通过虚拟网桥连接,实现与物理网络的直接通信;NAT模式通过虚拟NAT设备和DHCP服务器使虚拟机联网;Host-Only模式则将虚拟机与外网隔离,仅与主机通信。此外,文章还简要介绍了网络相关的基础知识,包括主机名、IP地址、子网掩码、默认网关和DNS服务器。
63 3
|
2月前
|
安全 定位技术 数据安全/隐私保护
|
2月前
|
负载均衡 应用服务中间件 数据安全/隐私保护
docker swarm 创建 Swarm 模式下的网络
【10月更文挑战第14天】
54 6
|
29天前
|
网络协议 算法 数据库
OSPF 与 BGP 的互操作性:构建复杂网络的通信桥梁
OSPF 与 BGP 的互操作性:构建复杂网络的通信桥梁
39 0
|
2月前
|
存储 前端开发 JavaScript
链动模式融合排队免单:扩散用户裂变网络、提高复购
将链动2+1与排队免单结合的模式及链动3+1模式转化为可运行代码涉及多个技术领域,包括后端开发、前端开发、数据库设计等。本文提供了一个简化的技术框架,涵盖用户管理、订单处理、奖励计算、团队结构等核心功能,并提供了示例代码。同时,强调了安全性、测试与部署的重要性,以确保系统的稳定性和合规性。
|
1月前
|
Docker 容器
【赵渝强老师】Docker的None网络模式
Docker容器在网络方面实现了逻辑隔离,提供了四种网络模式:bridge、container、host和none。其中,none模式下容器具有独立的网络命名空间,但不包含任何网络配置,仅能通过Local Loopback网卡(localhost或127.0.0.1)进行通信。适用于不希望容器接收任何网络流量或运行无需网络连接的特殊服务。
|
1月前
|
Docker 容器
【赵渝强老师】Docker的Host网络模式
Docker容器在网络环境中是隔离的,可通过配置不同网络模式(如bridge、container、host和none)实现容器间或与宿主机的网络通信。其中,host模式使容器与宿主机共享同一网络命名空间,提高性能但牺牲了网络隔离性。
|
1月前
|
Kubernetes Docker 容器
【赵渝强老师】Docker的Container网络模式
Docker容器在网络环境中彼此隔离,但可通过配置不同网络模式实现容器间通信。其中,container模式使容器共享同一网络命名空间,通过localhost或127.0.0.1互相访问,提高传输效率。本文介绍了container模式的特点及具体示例。
下一篇
DataWorks