K8S Network Model

作者:杨润炜
日期:2022/3/27 22:49

近期了解到一些k8s网络模型,包括单机/跨机虚拟网络,涉及UDP/Host-GW/VXLAN/eBPF等方案。

Single Host

咱先从最简单的单宿主机多容器模型说起。
single-host
这里的docker0是个虚拟的二层网络设备,打通宿主机上各容器间的二层网络。

Multi Hosts

实现跨宿主机的容器间网络,一般是在宿主机的容器间模拟一层Overlay,具体可分为以下3种模式:

  • UDP
  • VXLAN
  • Host-GW

UDP

以flannel框架为例:
UDP
UDP的方案构建起了一个3层的Overlay网络,且能够跨多个子网通信,算是比较完整的方案了,但因为存在性能问题,所以逐渐被废弃。
性能问题具体原因是网络包在应用层和内核态之间多次复制传输,导致了网络性能下降。
udp-p

VXLAN

以flannel框架为例:
vxlan
利用vtep这个linux内核功能,构建一个二层的容器Overlay网络。
如上图所示,容器的二层网络数据被放在宿主机的UDP网络包中,能够跨宿主机甚至跨子网传输,其中flannel相关模块负责在编码和解码网络包。

vtep在内核中解析和编码容器数据并传给网卡,解决了UDP的性能问题。
vtep

Why vxlan use UDP but not tcp or ip?

  • UDP面向连接,不包含状态和其它重传等保证传输可靠的策略,延迟和传输性能更高;
  • 状态和保证可靠策略需要在虚拟网络的相应层次要管理;
  • UDP端口提供了更灵活的负载均衡的潜能。

Why we need virtual Layer 2 network?

  • 虚拟机能够在多个子网间进行动态迁移,因为动态迁移要保持虚拟机的ip和TCP不变,所以需要让虚拟机的二层网络不变,这就需要虚拟二层网络。
  • 能够实现资源的多租户分配,用VNI标识(在vxlan header中),如上例的flannel.1就是租户1。
    virtual-layer-2

vxlan+eBPF

相当于vxlan的优化版本。

上面的vxlan存在的问题:iptable在大规模动态容器集群的规则管理和更新会成为性能瓶颈。
引入eBPF,它运行在linux内核,且能够被注入代码规则对网络字节数据进行过滤,用它来实现数据包的转发和过滤,性能和功能都能够满足要求。

以Cilium为例:
vxlan_ebpf

Host-GW

通过宿主机作为网关,对虚拟网络的包进行转发的模式。
好处是减少网络包的封装导致性能下降;
坏处是宿主机的路由规则比较多,调试或管理有一定的成本,如果容器规模大了,路由较多也会成为性能瓶颈;

Single LAN

single-lan
在宿主机二层互通的基础上,构建虚拟三层网络。可以看到数据帧的二层地址是真实的,三层地址是虚拟机的。

Multi LAN

IPIP

为了跨子网通信,虚拟网络需要开启IPIP模式,将虚拟三层的包放在正常宿主机的跨子网IP包中,到了对端再解析出内部的虚拟网络IP包。
这种性能损耗跟vxlan差不多。
ipip

BGP

BGP协议根据虚拟网络的宿主机IP与虚拟机子网的对应关系,配置路由器的路由规则,打通虚拟机的三层网络。
但这种模式需要交换机的路由管理权限。
bgp

Reference

感谢您的阅读!
如果看完后有任何疑问,欢迎拍砖。
欢迎转载,转载请注明出处:http://www.yangrunwei.com/a/129.html
邮箱:glowrypauky@gmail.com
QQ: 892413924