众所周知,虽然容器提供了应用程序打包,Kubernetes 提供了用简单的容器化组件编写大型复杂应用程序的能力,但这两种技术缺乏在其特定堆栈之外进行通信的常用方法。
在部署 Kubernetes 环境时,我们一般要求网络遵循以下规则:
对此,开发者有两种类型的网络可进行设置:
Kubernetes 默认网络:此解决方案的方法是创建具有 IP 范围的虚拟网桥,然后在每个主机上手动添加主机之间的路由。使用 Google 或 Amazon 云解决方案,可以进行手动配置。但是这个方法的弊端是当开发者不能完全坚持配置下去时,管理配置将变得十分困难。
CNI 及其插件:第二个解决方案是使用容器网络接口(CNI)和网络插件。此方法可以自动生成基本配置,让网络的创建和管理变得更加容易。如今,CNI 也成为网络供应商、项目与 Kubernetes 集成的标准方法。
❝*注:2016 年 CoreOS 发布了 CNI。2017 年 5 月, CNI 被 CNCF 技术监督委员会投票决定接受为托管项目。 ❞
在使用或创建 CNI 插件时,开发者主要使用三种解决方案:Calico、Flannel 和 WeaveNet。另外,Canal、Kube-router、Romana、JuniperContrail 和 TungstenFabric 方案也有一些有趣的特点。
那么重点来了!这么多 CNI 之间有什么区别?哪个性能最好?哪个性能最弱?
本文参考自 Benchmark results of Kubernetes network plugins (CNI) over 10Gbit/s network (Updated: August 2020),主要用来记录阅读的心得分享,详细全文请点选上述链接观看。
本篇文章的环境基于下列版本:
内容是 2020 8月份时进行的实测结果
该文用到的所有测试工具全部都开源并放到 Github上,对其有兴趣的可以到这边观看内容 benchmark-k8s-cni-2020-08 或是阅读本文的第一大章节,有介绍一些工具的使用。
文章中针对三款CNI (Calico, Canal, WeaveNet) 测试看看检测 MTU 的功能基于 TCP/UDP 下的性能如何:
从上述的结果中可以看到 Auto MTU 的性能都非常差,原因并不是 Auto MTU 没有效,而是因为这些 CNI 目前根本没有支持 Auto MTU 的做法,而 Calico 直到 3.7 版本才正式支持 Auto MTU 这个功能,而且根据作者的测试其功能良好。
作者认为对于这种需要设定 Jumbo frames 的环境下,如果没有 Auto MTU 的话,管理员则需要手动去设定这些 MTU,所以非常希望每个 CNI 能够去细化 Auto MTU 的功能来自动检测并且设定,减少管理员需要人工介入的需求。
至于其他的 CNI 为什么没有测试,因为他们都有实际 Auto-MTU 的功能:
其中 Kube-router 这边作者标示为None,估计可能是根本不能设定 MTU。
这章节主要会用来对比这些在正确 MTU 设定下不同 CNI 之间的性能。
原文中是用 CPU(%) 以及 Memory (MB) 来画图,數字愈低代表使用量愈低:
这上面可以观察到:
剩下的资源使用量都差不多,我认为可以算是同一个等级
❝Kube-OVN > Cilium > 剩下全部> WeaveNet/Flannel ❞
接下来看一下 Pod to Pod ,这边的方式是直接用 Pod 的 IP 来连接,并不是任何用 Service 这种方式。
Pod-to-Pod scenario
从上面的数据可以观察到:
接下来观察一下这个测试中,不同 CNI 的资源消耗量,原文中是用 CPU(%) 以及 Memory (MB) 来画图,數字愈低代表使用量越低:
从上面的结论观察,我认为跟空闲的情况差不多,唯一的差异就是 Weavenet 从最少使用量的 CNI 变成第三高
❝Kube-OVN > Cilium > WeaveNet > 剩下全部 ❞
从上面的数据可以观察到:
从上面的结论观察,跟空闲对比起来比较有一些变化:
剩下的等级差不多
❝Kube-OVN > Cilium > WeaveNet/Antrea/Kube-Router > Calico/Canal/Flannel > 裸机 ❞
这个情况下则是探讨透过 Service 来连接目标 Pod,也是基于TCP/UDP 来测试,其 中Service 则是基于ClusterIP 的设定才测试。
从上面的数据可以观察到:
从上面的结论观察,跟空闲比较起来比较有一些变化:
剩下的等级差不多
❝Kube-OVN > Cilium > WeaveNet/Antrea > Kube-Router/Calico/Canal/Flannel > 裸机 ❞
相对于 Pod to Pod 的情况来看, Pod to Service 中 Antrea 的性能消耗更高,从第四名跃升到第三名。
从上面的数据可以观察到:
从上面的结论观察,跟空闲比较起来比较有一些变化
❝Kube-OVN/Cilium > WeaveNet/Antrea/Kube-Router > Calico/Canal/Flannel ❞
这边没有任何的数据测试,除了Flannel 外,剩下的CNI 都有实现 Ingress/Egress (往内/往外) 的 Network Policies,很棒!
测试的 CNI 解决方案中,只有四套有支持加密的部分,分别是:
这边可以观察到:
从上面的结论观察,跟空闲比较起来比较有一些变化:
从上面的结论观察,跟空闲比较起来比较有一些变化:
这边可以观察到其结果与 Pod-to-Pod 是差不多的,因此结论完全一致:
根据上述的全部来源,我们可以绘制数张总结表格,性能的部分采用相对比较,对原始数字有兴趣的可以参考其公开的 Github 专案。
评比标准: 好>普通>不好
这边使用一些缩写
这边使用一些缩写
同时评比的概念是使用的资源多寡,采用相对等级
超高>有点高>普通>少
透过图表可以观察到:
参考资料: