近期了解到一些k8s网络模型,包括单机/跨机虚拟网络,涉及UDP/Host-GW/VXLAN/eBPF等方案。
咱先从最简单的单宿主机多容器模型说起。
这里的docker0是个虚拟的二层网络设备,打通宿主机上各容器间的二层网络。
实现跨宿主机的容器间网络,一般是在宿主机的容器间模拟一层Overlay,具体可分为以下3种模式:
以flannel框架为例:
UDP的方案构建起了一个3层的Overlay网络,且能够跨多个子网通信,算是比较完整的方案了,但因为存在性能问题,所以逐渐被废弃。
性能问题具体原因是网络包在应用层和内核态之间多次复制传输,导致了网络性能下降。
以flannel框架为例:
利用vtep这个linux内核功能,构建一个二层的容器Overlay网络。
如上图所示,容器的二层网络数据被放在宿主机的UDP网络包中,能够跨宿主机甚至跨子网传输,其中flannel相关模块负责在编码和解码网络包。
vtep在内核中解析和编码容器数据并传给网卡,解决了UDP的性能问题。
相当于vxlan的优化版本。
上面的vxlan存在的问题:iptable在大规模动态容器集群的规则管理和更新会成为性能瓶颈。
引入eBPF,它运行在linux内核,且能够被注入代码规则对网络字节数据进行过滤,用它来实现数据包的转发和过滤,性能和功能都能够满足要求。
以Cilium为例:
通过宿主机作为网关,对虚拟网络的包进行转发的模式。
好处是减少网络包的封装导致性能下降;
坏处是宿主机的路由规则比较多,调试或管理有一定的成本,如果容器规模大了,路由较多也会成为性能瓶颈;
在宿主机二层互通的基础上,构建虚拟三层网络。可以看到数据帧的二层地址是真实的,三层地址是虚拟机的。
为了跨子网通信,虚拟网络需要开启IPIP模式,将虚拟三层的包放在正常宿主机的跨子网IP包中,到了对端再解析出内部的虚拟网络IP包。
这种性能损耗跟vxlan差不多。
BGP协议根据虚拟网络的宿主机IP与虚拟机子网的对应关系,配置路由器的路由规则,打通虚拟机的三层网络。
但这种模式需要交换机的路由管理权限。
感谢您的阅读!
如果看完后有任何疑问,欢迎拍砖。
欢迎转载,转载请注明出处:http://www.yangrunwei.com/a/129.html
邮箱:glowrypauky@gmail.com
QQ: 892413924