白话Kubernetes网络
Posted 分布式实验室
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了白话Kubernetes网络相关的知识,希望对你有一定的参考价值。
基于这样的底层网络,Kubernetes设计了Pod - Deployment - Service的经典三层服务访问机制。
我们将这些方案依据配置的复杂度,分为“全自动”和“半自动”两类,就像是汽车中的自动挡和手动挡的差别。
“全自动”的解决方案使用起来简单,适用于标准网络环境的容器跨节点通信。
在Kubernetes的1.1版本中,发生了一件很重要的变化,那就是Kubernetes全面采纳CNI网络标准。
几乎在Kubernetes宣布采纳CNI以后的1个月,之前提到的“全自动”网络方案就悉数实现了CNI的插件,这也间接说明了CNI的简单。
那么CNI到底有多简单呢?举几个数字。
实现一个CNI插件需要的内容包括一个Json配置文件和一个可执行的文件(脚本或程序),配置文件描述插件的版本、名称、描述等基本信息,可执行文件就是CNI插件本身会在容器需要建立网络和需要销毁容器的时候被调用。
当一个CNI插件被调用时,它能够通过6个环境变量以及1个命令行参数(Json格式文本)来获得需要执行的操作、目标网络Namespace、容器的网卡必要信息,每个CNI插件只需实现两种基本操作:创建网络的ADD操作,和删除网络的DEL操作(以及一个可选的VERSION查看版本操作)。
那么面对这么多的社区CNI插件,我们怎样选择呢?
直观的说,既然是网络插件,在功能差不多的情况下,我们当然先关心哪个的速度快。
为此我此前专门做过一次对比测试,不过由于使用了公有云的网络环境(云上环境的不同主机之间相对位置不固定),在汇总数据的时候才发现测试结果偏离理论情况过于明显。
这个数据大家且当娱乐,不过对于同一种插件的不同工作模式(比如Flannel的三种模型)之间,由于是使用的相同的虚拟机测试,还是具有一定可参考性。
先抛开测试结果,从理论上说,这些CNI工具的网络速度应该可以分为3个速度等级。
最快的是Romana、Gateway模式的Flannel、BGP模式的Calico。
次一级的是IPIP模式的Calico、Swarm的Overlay网络、VxLan模式的Flannel、Fastpath模式的Weave。
要解释这些网络插件和模式速度不同的原因,我们需要先回到这些工具最初要解决的问题上来。那就是跨节点的网络不通。
为此,Flannel采用了几种处理方法(也就是Flannel的几种网络模式)。
早期时候用的比较多的一种方式是Overlay网络。
根据不同的封包方式,Flannel提供了UDP和Vxlan两种传输方法。
UDP封包使用了Flannel自定义的一种包头协议,数据是在Linux的用户态进行封包和解包的,因此当数据进入主机后,需要经历两次内核态到用户态的转换。
VxLAN封包采用的是内置在Linux内核里的标准协议,因此虽然它的封包结构比UDP模式复杂,但由于所有数据装、解包过程均在内核中完成,实际的传输速度要比UDP模式快许多。
但比较不幸的是,在Flannel开始流行的时候,大概2014年,主流的Linux系统还是Ubuntu 14.04或者CentOS 6.x,这些发行版的内核比较低,没有包含VxLAN的内核模块。因此多数人在开始接触Flannel时候,都只能使用它的UDP模式,因此Flanned一不小心落得了一个“速度慢”的名声,特别是在之后的Calico出来以后(其实Flannel的Gateway模式与Calico速度相当,甚至理论上还要快一点点,稍后解释)。
第二种思路是,既然在无法进行路由是因为网络中的节点之间没有路由信息,但Flannel是知道这个信息的,能不能把这个信息告诉网络上的节点呢?
这就是Flannel的Host-Gateway模式,在这种模式下,Flannel通过在各个节点上的Agent进程,将容器网络的路由信息刷到主机的路由表上,这样一来所有的主机就都有整个容器网络的路由数据了。
Host-Gateway的方式没有引入像Overlay中的额外装包解包操作,完全是普通的网络路由机制,它的效率与虚拟机直接的通信相差无几。
然而,由于Flannel只能够修改各个主机的路由表,一旦主机直接隔了个其他路由设备,比如三层路由器,这个包就会在路由设备上被丢掉。
这样一来,Host-Gateway的模式就只能用于二层直接可达的网络,由于广播风暴的问题,这种网络通常是比较小规模的,但近年来也出现了一些专门的设备能够构建出大规模的二层网络(就是我们经常听到的“大二层”网络)。
那么其他的CNI插件呢?
Calico的设计比较新颖,之前提到Flannel的Host-Gateway模式之所以不能跨二层网络,是因为它只能修改主机的路由,Calico把改路由表的做法换成了标准的BGP路由协议。
相当于在每个节点上模拟出一个额外的路由器,由于采用的是标准协议,Calico模拟路由器的路由表信息就可以被传播到网络的其他路由设备中,这样就实现了在三层网络上的高速跨节点网络。
这是一个从“只做假设”到“设定标准”到“内置实现”的很大的改变。
在Kubernetes的1.3版本以后,开始加入网络策略相关的支持。并且在1.7版本后结束了Beta阶段,成为正式API的一部分。
Q:Open vSwitch有测过么?
Q:Calico怎么做网段间的隔离?
Q:如果在Kubernetes里面需要做到平行网络,让每一个Pod获取一个业务IP,除了Bridge+Vlan的方式,还有更好的建议么?
Q:Calico BGP IPIP NAT三种模式分别怎么配置?原理是怎样的?其中IPIP还有两种模式,区别在哪?
Q:能麻烦具体介绍一下kube-proxy这种网络模式的优缺点吗,在测试过程中发现很不稳定,但是又没发现足够的证据。
点击阅读原文链接即可报名。
以上是关于白话Kubernetes网络的主要内容,如果未能解决你的问题,请参考以下文章
Kubernetes网络自学系列 | 打通CNI与Kubernetes:Kubernetes网络驱动