Kubernetes系列学习文章 - 网络实现(八)
| 导语 前面介绍了很多K8S的概念以及架构方面的东西,这里我们说说K8S的网络。云计算里面的网络向来是复杂的,因为里面牵扯到硬件网络跟虚拟网络的交互。尤其是虚拟网络,比较抽象,如果不搞清楚,一些问题排障将寸步难行。
一、虚拟化网络基础
我们知道计算有虚拟化,这是因为现在的CPU有VT-X技术,存储也可以虚拟化,比如ceph技术。那么同样网络也有虚拟化,我们一般称作SDN技术(Software Defined Network),软件定义网络。
传统硬件网络里有网线、网口、交换机、路由器、防火墙等概念,那么虚拟化网络里同样也有对应的概念。因为虚拟环境的模型参考现实环境的模型来设计,这个有利于架构的对接和理解,节约相关成本。
同时虚拟网络底层也需要物理网络来支撑(好比计算里需要物理CPU支撑,存储底层需要实实在在的硬盘),中间通过网络虚拟化平台把物理层网络软件定义成了虚拟组网,如下图。网络虚拟化的出现,促进了云计算的发展,毕竟每一种IT资源都要具备弹性的优点。
2. Pod之间的互通
Pod之间要进行互通,那么存在两种情况:一种是同一个Node节点里Pod间的互通,另外一种是不同Node节点里的Pod之间相互连通。
2.1 同一Node,Pod间的互通
安装部署了K8S的node节点,如果使用了docker作为运行时,默认会创建一个叫docker0的网桥,这个docker0就是Linux Bridge模式。每个Pod都会分配一个固定的IP,这个IP跟这个docker0是同一个网段,而且每个Pod都会通过veth-pair方式连接到这个docker0上。你可以把每个Pod想象成一个VM虚拟机,然后每个虚拟机连接在了这个docker0的二层交换机上,如下图所示:
各种连接方式下的性能测试对比
其次除了性能,我们也要考虑资源消耗(毕竟消耗意味着成本),下面是内存和CPU两种资源消耗情况对比。最上面的绿色条是裸金属环境条件(用作基准对比),紫色的那条是没用任何CNI插件的数据(也是用于基准测试对比)。
我们可以看出内存消耗这块Flannel最小427M(排除kube-router来看),Calico也还不错441M;CPU这块Flannel跟Calico也不相上下,Flannel:5.7%,Calico:5.9%。
从性能和资源消耗来看Flannel和Calico都不相上下,选择哪个都OK。Flannel的优势就是精简,但是不支持NetworkPolicies(网络策略),而Calico就是功能齐全,但是不支持自动设置MTU值(MTU值对网络性能影响还是很大的,如果没设置对的话)。
如果你的环境对于安全要求非常高,不在乎性能和资源消耗的话可以选择Cilium和WeaveNet插件,它们有加密模式。这两个如果要从它们俩选择一个,从资源消耗这块来看,WeaveNet会更有优势。
上面测试结果都来自ITNEXT的文章《Benchmark results of Kubernetes network plugins (CNI) over 10Gbit/s network (Updated: April 2019)》,这篇文章做了专业的压测分析(测试时间是2019.4月),大家可以仔细阅读看看:
文章链接:https://itnext.io/benchmark-results-of-kubernetes-network-plugins-cni-over-10gbit-s-network-updated-april-2019-4a9886efe9c4(貌似需要访问外国网站)
总结
本篇文章从基本的网络虚拟化概念讲起,依次讲述了K8S的网络实现方式和CNI网络插件。网络虚拟化这块是云计算业界的一个难点,这块通常相对复杂点,如果要展开说其实有很多知识要去学习。本文抛砖引玉只介绍了一些基本的知识,希望对大家有用。