k8s Flannel 进化

  1. 介绍
    Flannel,VXLAN,接触过Kubernetes的同学应该都能说出这2个名词,那么再深入一点呢。
    Overlay,虚拟隧道,UDP。没错,我们继续往下看。
  2. UDP
    其实以UDP为后端的实现方式已经废弃了,不过其过程非常直观,适合学习。
    先描述一下环境:
    节点1
    1.容器c1的ip 10.96.1.2
    2.宿主机docker0 ip 10.96.1.1
    节点2
    1.容器c2的ip 10.96.2.3
    2.宿主机2 docker0 ip 10.96.2.1
    需求很简单,c1要访问到c2 。
    访问流程:
    1.c1容器要访问c2容器,10.96.2.3不在docker0网段里,走容器的默认路由,通过容器网关进入docker0
    2.到达宿主机后,下一跳取决于宿主机的路由规则,Flannel先建立了一系列路由规则,于是进入flannel0
    3.Flannel0发给另一机器上的Flannel0,Etcd上有记录目的机器IP,先匹配子网,Etcd中反查子网的宿主机IP,然后通讯
    4.接着把IP包封装为UDP包,发给宿主机2的8285端口,每台宿主机都在监听该端口
    5.由8285端口进入另一机器的Flannel应用,直接转给flannel0,用户态流向系统态,内核网络栈继续处理,路由表匹配
    6.根据路由表上网段,10.96.2.x,要发送给docker0
    7.docker0 继续充当二层交换机,把数据包发送给正确veth端口,出现在c2容器
    很清晰明白吧,可惜被废弃了,因为效率太差,我们再看个头疼的。
  3. VXLAN
    VXLAN,全名Virtual Extensible LAN 虚拟可扩展局域网,是Linux自带网络功能,解决了UDP性能的问题。
    再描述一下环境:
    节点1
    1.容器c1的ip 10.0.15.2
    2.宿主机docker0 ip 10.0.15…1
    节点2
    1.容器c2的ip 10.0.16.3
    2.宿主机2 docker0 ip 10.0.16.1
    需求很简单,c1要访问到c2 。
    访问流程:
    1.数据包仍然先到docker0,路由到flannel.1,需要找目标VTEP,该设备信息由每台宿主机上的flanneld进程维护,加入节点同时就会增加设备路由
    2.走16网段的包要发给flannel.1,网关是16.0,而16.0就是另一台上的VTEP设备
    3.VTEP间要想办法二层通信,源端收到包后,添加上目的端MAC,再发给目的端口
    4.方式封装,目的VTEP的MAC地址+目的容器的IP,称为内部数据帧
    5.需要再次封装,以通过eth0传输,又称为外部数据帧
    6.做法是在内部数据帧加VXLAN头及VNI,再封装到UDP包由flannel.1发出去,需要的IP由FDB提供,由虚拟的MAC地址指向节点2的IP地址
    7.第三次封装,IP头,MAC头,正常UDP包的传输操作 节点2宿主机,解析到VXLAN,按VNI交给flannel.1,flannel.1继续解包,按单机模式发给c2,居然有6个包头

以上便是VXLAN的大致传播过程,其中VTEP可以比照 企业vpn的使用经验,就是虚拟隧道两端的连接设备。

总结:仔细辨别的话,两种后端的差别比熊和熊猫的差别还大。你看出来了嘛,没有的话请再仔细看一遍。

猜你喜欢

转载自blog.csdn.net/myy1066883508/article/details/105951446