当前位置: 首页 > 科技观察

七张图带你搞懂 Kubernetes Flannel 高性能网络插件的两种常用工作模式

时间:2023-03-16 22:51:45 科技观察

七张图带你理解KubernetesFlannel高性能网络插件的两种常用工作模式以太网帧封装在四层UDP报文中,通过三层网络传输,形成虚拟二层网络。VXLAN报文格式如下:VXLAN使用VTEP(VXLANTunnelEndpoint)打包解包,是VXLAN隧道的起点或终点:在发送端,源VTEP将原始报文封装成一个VXLAN消息并将其发送给PeerVTEP。在接收端,VTEP将解包VXLAN消息并将原始第2层数据帧转发给预期的接收方。VTEP可以是独立的网络设备,如交换机,也可以是部署在服务器上的虚拟设备。例如,当使用顶层交换机(TOR)作为VTEP时,VXLAN网络模型如下:但显然,在flannel中,VTEP能力是通过Linux虚拟机网络设备实现的。在VXLAN模式下,VTEP的作用由flannel.1虚拟网卡承担。2、VXLAN模式VXLAN是Flannel默认推荐的模式。当我们使用默认配置安装Flannel时,它会为每个节点分配一个24位子网,并在每个节点上创建两个VMNIC:cni0和flannel.1。cni0是一个桥接设备,类似于docker0,节点上的所有Pod都以vethpair的形式连接到cni0上。flannel.1是一个VXLAN类型的设备,作为VTEP实现VXLAN报文的解包。从内核3.7版本开始,Linux开始支持VXLAN。到3.12版本,支持已经完成。节点内通信显然,一个节点内的容器间通信可以通过cni0网桥完成,不涉及任何VXLAN报文的拆包。例如,在下图中,Node1的子网为10.244.0.1/24,PodA10.244.0.20和PodB10.224.0.21通过cni0网桥进行通信。跨节点通信下面重点分析跨节点容器通信过程。假设有两个节点Node1和Node2,Node1的PodA要和Node2的PodB通信,它们之间的通信过程如下图所示:大致总结一下整个过程:发送端:在PodA中发起ping10.244.1.21,ICMP数据包通过cni0网桥后由flannel.1设备处理。flannel.1设备是一个VXLAN类型的设备,负责VXLAN报文的拆包。所以在发送端,flannel.1将原来的L2包封装成一个VXLANUDP包,然后从eth0发送出去。接收端:Node2收到UDP包,发现是VXLAN类型的包,交给flannel.1解包。根据解包后得到的原始数据包中的目的IP,将原始数据包通过cni0网桥发送给PodB。flannel.1应该处理哪些IPflanneld可以从etcd中获取所有节点的子网情况,并据此为每个节点配置路由,将所有属于非本地节点的子网IP路由到flannel.1中处理。节点的子网路由由cni0网桥处理。[root@Node1~]#ipr...10.244.0.0/24devcni0protokernelscopelinksrc10.244.0.1#Node1子网为10.224.0.0/24,本地PodIP由cni0处理10.244.1.0/24via10.244.1.0devflannel.1onlink#Node2子网为10.224.1.0/24,Node2的PodID由flannel.1处理...如果节点信息发生变化,flanneld也会同步修改路由信息。flannel.1VXLAN封装的封装过程就是将二层以太网帧封装成四层UDP报文的过程。要从原始的L2帧生成原始的L2帧,flannel.1需要知道:内部源/目标IP地址内部源/目标MAC地址内部源/目标IP地址是已知的,即PodA/PodBPodIPs,在插图分别是10.224.0.20和10.224.1.20。内层源/目的MAC地址应该结合路由表和ARP表得到。根据路由表①得知下一跳地址为10.224.1.0,关联ARP表②得到下一跳的MAC地址,即目的MAC地址:Node2_flannel.1_MAC;报文应该是从flannel.1虚拟网卡发出的,所以源MAC地址就是flannel.1的MAC地址。需要注意的是,这里ARP表的条目②并不是通过ARP学习得到的,而是flanneld为每个节点预先设置的,由flanneld维护,没有过期时间。#查看ARP表[root@Node1~]#ipn|grepflannel.110.244.1.0devflannel.1lladdrba:74:f9:db:69:c1PERMANENT#PERMANENT表示永不过期有了以上信息,flannel.1就可以构建InnerLayer2Ethernet帧:外层VXLANUDP包需要将原来的L2帧封装成VXLANUDP包,flannel.1也需要填写源/目的IP地址。如前所述,VTEP是VXLAN隧道的起点或终点。因此,目的IP地址是对端VTEP的IP地址,从FDB表中获取。在FDB表③中,dst字段表示VXLAN隧道的目的端点(peerVTEP)的IP地址,即VXLANDUP报文的目的IP地址。FDB表也是由flanneld预先在每个节点上维护的。FDB表(Forwardingdatabase)用于保存二层设备中MAC地址与端口的关系,就像交换机中的MAC地址表一样。二层设备在转发二层以太网帧时,根据FDB表项找到对应的端口。比如很多vethpair网卡连接到cni0网桥。当bridge要向Pod转发以太网帧时,FDB表根据Pod网卡的MAC地址查询FDB表,可以找到对应的veth网卡,从而实现联通。可以使用bridgefdbshow查看FDB表:[root@Node1~]#bridgefdbshow|grepflannel.1ba:74:f9:db:69:c1devflannel.1dst192.168.50.3selfpermanent源IP地址信息来自flannel。1自己设置网卡,根据本地192.168.50.2,源IP地址为192.168.50.2。[root@Node1~]#ip-dashowflannel.16:flannel.1:mtu1450qdiscnoqueuestateUNKNOWNgroupdefaultlink/ether32:02:78:2f:02:cbbrdff:ff:ff:ff:ff:ffpromiscuity0vxlanid1local192.168.50.2deveth0srcport00dstport8472nolearningageing300noudpcsumnoudp6zerocsumtxnoudp6zerocsumrxnumtxqueues1numrxqueues1gso_max_size65536gso_max_segs65535inet10.244.0.0/32brd10.244.0.0scopeglobalflannel.1valid_lftforeverpreferred_lftforeverinet6fe80::3002:78ff:fe2f:2cb/64scopelinkvalid_lftforeverpreferred_lftforever至此,flannel.1已经得到了所有完成VXLAN封包所需的信息,最终通过eth0发送一个VXLANUDPMessage:Flannel'sVXLANmodeimplementsaVXLANnetworkmodelinwhichallPodsbelongtothesamelargelayer-2networkbystaticallyconfiguringroutingtable,ARPtable,andFDBtableinformation,combinedwiththeVXLANvirtualnetworkcardflannel.1.3.Host-gwmodeIntheaboveVXLANexample,Node1andNode2areactuallytwovirtualmachinesusingbridgemodeinthesamehost,thatistosay,theyareinaLayer2network.InthecaseofLayer2networkinterworking,youcandirectlyconfiguretheLayer3routingofthenodestocommunicatewithoutusingVXLANtunnels.使用host-gw模式需要修改ConfigMapkube-flannel-cfg,将Backend.Type由vxlan改为host-gw,然后重启所有kube-flannelPod:...net-conf.json:|{"Network":"10.244.0.0/16","Backend":{"Type":"host-gw"//<-改为host-gw}}...host-gw方式的通信过程如图下图注意:在host-gw模式下,不再需要flannel.1虚拟机网卡,因为不涉及VXLAN包解包。flanneld负责为每个节点设置路由,将对应节点的Pod子网的下一跳地址指向对应节点的IP,如图中路由表①所示。[root@Node1~]#ipr...10.244.0.0/24devcni0protokernelscopelinksrc10.244.0.110.244.1.0/24via192.168.50.3deveth0#Node2子网的下一跳地址指向Node2的publicip。...host-gw是最好的表现者,因为没有数据包解包的成本。但一般情况下,云环境不支持host-gw模式,私有化部署场景可以考虑。