Kubernetes是一个伟大的容器"乐队"。但它不管理Pod-to-Pod通信的网络。这是容器网络接口(CNI)插件的使命,它是实现容器集群工具(Kubernetes,Mesos,OpenShift等)的网络抽象的标准化方法。

但重点是:这些CNI之间有什么区别?哪一个性能最好?哪一个最精瘦?

本文展示了我在10Gbit / s网络上进行的基准测试的结果。这些结果也是在2018年11月15日在马赛(法国)的Devops D-DAY 2018年的一次会议上提出的。

基准背景

基准测试是在通过Supermicro 10Gbit交换机连接的三台Supermicro裸机服务器上进行的。服务器通过DAC SFP +无源电缆直接连接到交换机,并在激活巨型帧(MTU 9000)的同一VLAN中设置。

Kubernetes 1.12.2在Ubuntu 18.04 LTS上运行,运行Docker 17.12(此版本的默认docker版本)。

为了提高可重复性,我们选择始终在第一个节点上设置主设备,在第二个服务器上设置基准测试的服务器部分,在第三个服务器上设置客户端部分。这是通过Kubernetes部署中的NodeSelector实现的。

以下是我们将用于描述基准测试结果和解释的比例:

 

缩放结果的解释

为基准选择CNI

此基准测试仅关注集成在 文档“bootstrap a cluster with kubeadm” 部分中的CNI列表。在提到的8个CNI中,我们不会测试“JuniperContrail / TungstenFabric”CNI,因为它需要3.10内核(ubuntu 18.04运行的是4.15内核)。

以下是我们将要比较的CNI列表:

  • 印花布v3.3
  • 运河v3.3(实际上是Flannel用于网络+ Calico用于防火墙)
  • Cilium 1.3.0
  • 法兰绒0.10.0
  • Kube-router 0.2.1
  • Romana 2.0.2
  • WeaveNet 2.4.1

安装

CNI最容易设置,我们的第一印象就是最好的。即使所有CNI都被描述为非常容易设置,但遵循文档还不足以安装Cilium和Rom​​ana。Cilium需要一个ETCD数据存储区才能实现功能,我们必须搜索其文档的minikube部分才能找到一个单行部署方法。Romana缺乏维护,因此无法处理Kubernetes 1.11对“未准备”节点上应用的Toleration所引入的最新更改(在CNI设置之前)。因此,Romana不会在一段时间内部署并让您的节点“未准备就绪”!这需要修复Romana安装Yaml文件中存在的所有部署/守护进程的Tolerations。

如前所述,服务器和交换机都配置了Jumbo帧激活(通过将MTU设置为9000)。我们非常感谢CNI可以自动发现要使用的MTU,具体取决于适配器。事实上,Cilium,Flannel和Romana是唯一能够正确自动检测MTU的人。大多数其他CNI在github中引发了一些问题以启用MTU自动检测,但是现在,我们需要通过修改Calico,Canal和Kube路由器的ConfigMap或WeaveNet的ENV var来手动修复它。

也许您想知道错误的MTU会产生什么影响?这是一个图表,显示WeaveNet与默认MTU和WeaveNet与Jumbo帧之间的区别:

 

MTU设置对带宽性能的影响

以下是设置结果的摘要:

 

设置基准测试结果摘要

安全

在比较这些CNI的安全性时,我们谈论两件事:它们加密通信的能力,以及它们对Kubernetes网络策略的实现(根据实际测试,而不是来自他们的文档)。

可以加密通信的面板唯一的CNI是WeaveNet。这是通过将加密密码设置为CNI的ENV变量来完成的,这很容易做到。

在网络政策实施方面,通过实施Ingress和Egress规则,Calico,Canal和Cilium是最好的面板。Kube-router和WeaveNet实际上只实现了Ingress规则。Flannel和Romana不实施网络政策。(Nota bene:Romana的文档是指网络策略的实现,但这是通过自定义Romana资源而不是Kubernetes网络策略实现的)

以下是结果摘要:

 

安全基准测试结果摘要

性能

该基准测试显示每次测试的三次运行(至少)的平均带宽。我们正在测试TCP和UDP性能(使用iperf3),真实应用程序,如HTTP(使用nginx和curl),或FTP(使用vsftpd和curl),最后是使用SCP协议进行应用程序加密的行为(使用OpenSSH服务器和客户端)。

对于所有测试,我们还在裸机节点(绿色条)上运行基准测试,以比较CNI与本机网络性能的有效性。为了与我们的基准比例保持一致,我们在图表上使用以下颜色:

  • 黄色=非常好
  • 橙色=好
  • 蓝色=一般
  • 红色=差

结果如下:

 

TCP性能

我们可以在TCP结果上看到所有CNI都非常好,除了WeaveNet加密,因为加密过程会大大降低性能。

 

UDP性能

在UDP基准测试中,WeaveNet加密的结果比TCP更差(大约1/3因子)。没有加密的WeaveNet只是其他一些但仍然合理(97%的裸机性能)。我们可以注意到Kube-router和Romana比裸机更快(小于1%):测试已重复运行多次,结果稳定。

 

HTTP性能

即使HTTP是基于TCP的协议,现实应用似乎也会对性能产生影响。该测试基本上是一个10GB随机字节的文件(以避免可能的压缩副作用),由nginx提供,并从curl客户端下载。WeaveNet Encrypted现在以TCP性能的17%运行,而Cilium似乎也在处理这个测试时出现了一些问题。没有加密的WeaveNet,法兰绒和运河也落后于其他CN

FTP性能

使用FTP测试,结果与HTTP非常相似,只是WeaveNet未加密的行为与Cilium类似,两者都落后于其他CNI。WeaveNet加密像往常一样,性能非常低。此测试与HTTP的情况相同,只是我们在匿名模式下用VSFTPD替换nginx。

SCP表现

使用SCP,我们使用OpenSSH服务器和客户端在scp上传输10GB随机文件。我们可以清楚地看到,即使裸机性能也比以前低得多。所有CNI都相当,除了WeaveNet Encrypted,它遭受双重加密(SCP +网络加密)。

以下是CNIs表现的总结:

 

表现基准测试结果摘要

资源消耗

现在让我们比较这些CNI在负载很重的情况下如何处理资源消耗(在TCP 10Gbit传输期间)。在性能测试中,我们将CNI与裸金属(绿色条)进行比较。对于资源消耗测试,我们还显示在没有任何CNI设置的情况下闲置(紫色条)的新鲜Kubernetes的消耗。然后我们可以计算出CNI真正消耗了多少。

让我们从内存方面开始吧。以下是传输期间以MB为单位的平均节点RAM使用率(无缓冲区/缓存)。

 

平均节点RAM使用率(无缓冲区/缓存)

我们可以清楚地看到Flannel是最瘦的,只比没有CNI的Kubernetes多20MB。Calico,Canal,Kube-router和Romana都接近法兰绒,而WeaveNet稍稍落后于WeaveNet,这表明加密对内存消耗没有影响。纤毛比其他纤维消耗更多的记忆。

现在,让我们看看CPU消耗。警告:图形单位不是百分比,而是permil。因此,裸金属的1 permil实际上是0.1%。结果如下:

 

permil的平均CPU使用率(不是百分比)

Calico和Flannel比没有CNI的kubernetes节点消耗不到1%的CPU,以实现10Gbit TCP传输,这是非常好的。Kube-router和Romana落后1.5%。WeaveNet uncrypted和Canal都很高,3%的开销,但不如WeaveNet加密和Cilium,每个都超过4%。对于WeaveNet加密,这是非常合乎逻辑的,因为完整的10Gbit流是加密的,因此使用CPU来实现这一点。但是,在这种情况下,Cilium不会比加密的CNI消耗更多。

以下是资源消耗部分的摘要:

 

资源消耗总结

摘要

以下是所有汇总结果的概述:

 

所有结果的快速摘要

结论

最后一部分是主观的,并传达了我自己对结果的解释。如果你在相应的场景中,我建议使用以下CNI:

  • 您的群集中有低资源节点(只有几GB的RAM,很少的内核),并且您不需要安全功能,请使用Flannel。这是我们测试过的最精简的CNI。而且,它与许多架构兼容(amd64,arm等)。
  • 出于安全原因,您需要加密网络,请使用WeaveNet。如果您使用巨型帧并通过在环境变量中提供密码来激活加密,请不要忘记设置MTU大小。但话说回过来,忘掉性能,这就是加密的代价。
  • 对于其他常见用法,我会推荐Calico。就像WeaveNet一样,如果您使用的是巨型帧,请不要忘记在ConfigMap中设置MTU。事实证明,它在资源消耗,性能和安全性方面具有多用途和高效性。Calico已经在非常大的集群上工作,并且具有非常有趣的BGP功能。
 

Kubernetes(k8s)网络插件(CNI)的基准测试对比的更多相关文章

  1. kubernetes 配置网络插件 flannel

    概述 在学习docker时知道docker有四种常用的网络模型 bridge:桥接式网络 joined:联盟式网络,共享使用另外一个容器的网络名称空间 opened:容器直接共享使用宿主机的网络名称空 ...

  2. k8s入坑之路(9)k8s网络插件详解

    Flannel: 最成熟.最简单的选择 Calico: 性能好.灵活性最强,目前的企业级主流 Canal: 将Flannel提供的网络层与Calico的网络策略功能集成在一起. Weave: 独有的功 ...

  3. Kubernetes CNI网络插件

    CNI 容器网络接口,就是在网络解决方案由网络插件提供,这些插件配置容器网络则通过CNI定义的接口来完成,也就是CNI定义的是容器运行环境与网络插件之间的接口规范.这个接口只关心容器的网络连接,在创建 ...

  4. k8s西游记 - 切换网络插件IP池

    前言 最近在另一个k8s集群中,搭建了kong网关,在配置OIDC插件时,希望使用Memcahe代替Cookie来存储会话信息,于是把部署在同一局域网Memcahe的内网IP,比如:192.168.1 ...

  5. k8s网络之设计与实现

    k8s网络主题系列: 一.k8s网络之设计与实现 二.k8s网络之Flannel网络 三.k8s网络之Calico网络 K8s网络设计与实现是在学习k8s网络过程中总结的内容.在学习k8s网络各种插件 ...

  6. 容器网络插件那么多,博云为什么基于OVS深度自研?

    背景 从2015年开始,博云开始基于Kubernetes和容器帮助客户交付应用管理平台.在开始阶段,博云选择了业界使用度非常广泛且成熟稳定的calico作为默认的网络方案并在calico方面积累了大量 ...

  7. kubernetes/k8s CRI分析-容器运行时接口分析

    关联博客:kubernetes/k8s CSI分析-容器存储接口分析 概述 kubernetes的设计初衷是支持可插拔架构,从而利于扩展kubernetes的功能.在此架构思想下,kubernetes ...

  8. Kubernetes(K8s) 安装(使用kubeadm安装Kubernetes集群)

    背景: 由于工作发生了一些变动,很长时间没有写博客了. 概述: 这篇文章是为了介绍使用kubeadm安装Kubernetes集群(可以用于生产级别).使用了Centos 7系统. 一.Centos7 ...

  9. 3.kubernetes的CNI网络插件-Flannel

    目录 1.1.K8S的CNI网络插件-Flannel 1.1.1.集群规划 1.1.2.下载软件.解压.软链接 1.1.3.最终目录结构 1.1.4.拷贝证书 1.1.5.创建配置 1.1.6.创建启 ...

随机推荐

  1. Linux下virtualenv与virtualenvwrapper详解

    在使用 Python 开发的过程中,工程一多,难免会碰到不同的工程依赖不同版本的库的问题: 亦或者是在开发过程中不想让物理环境里充斥各种各样的库,引发未来的依赖灾难. 此时,我们需要对于不同的工程使用 ...

  2. Flask拾遗总汇1

    目录 1.flask的路由分发方式 2.请求响应相关 3.flask配置文件拾遗(config) 4.路由系统参数配置 4.1 可传入参数: 4.2 常用路由系统有以上五 5.反向生成URL: url ...

  3. 目标检测论文解读7——YOLO v2

    背景 YOLO v1检测效果不好,且无法应用于检测密集物体. 方法 YOLO v2是在YOLO v1的基础上,做出如下改进. (1)引入很火的Batch Normalization,提高mAP和训练速 ...

  4. 回顾Python装饰器

    函数装饰器(function decorator)可以对函数进行“标注”,给函数提供更多的特性. 在理解装饰器之前需要理解闭包(closure).Python3.0 引入了保留关键字 nonlocal ...

  5. 使用ARP获取局域网内设备IP和MAC地址

    根据Arp列表数据,查询本地设备在线状态 使用 arp -a 获得所有内网地址,首先看Mod对象 public struct MacIpPair { public string HostName; p ...

  6. 怎么认Destsoon标签条件

    看准一个标签认条件 如: <!--{php $tags=tag("moduleid=18&table=club_group_18&condition=status=3 ...

  7. 23-C#笔记-正则表达式

    等用的时候,可以现查. 参考: http://www.runoob.com/csharp/csharp-regular-expressions.html

  8. 05-C#笔记-基本变量

    1. 不支持括号初始化: 2. 支持强制类型转化: 3.运算规则同C++ 参考: http://www.runoob.com/csharp/csharp-variables.html

  9. 【cf补题记录】Codeforces Round #608 (Div. 2)

    比赛传送门 再次改下写博客的格式,以锻炼自己码字能力 A. Suits 题意:有四种材料,第一套西装需要 \(a\).\(d\) 各一件,卖 \(e\) 块:第二套西装需要 \(b\).\(c\).\ ...

  10. ##ant 打包apk

    ant 打包apk 1. 参考: Android Ant 批量多渠道打包实例 单个渠道类似操作,只不过不用修改build.xml文件 2. 修改ant debug的包签名,使用和release版本相同 ...