vxlan模式

vxlan是一种overlay技术,跟之前提到的udp模式思路是类似,但是具体实现不太一样:

  1. udp模式是在用户态实现的,数据会先经过tun网卡,到应用程序,应用程序再做隧道封装,再进一次内核协议栈,而vxlan是在内核当中实现的,只经过一次协议栈,在协议栈内就把vxlan包组装好
  2. udp模式的tun网卡是三层转发,使用tun是在物理网络之上构建三层网络,属于ip in udp,vxlan模式是二层实现,overlay是二层帧,属于mac in udp
  3. vxlan由于采用mac in udp的方式,所以实现起来会设计mac地址学习,arp广播等二层知识,udp模式主要关注路由

关于交换机以及网桥,mac地址相关的文章可以查看docker网络之网桥

flannel vxlan原理

vxlan是一种虚拟隧道通信技术,通过三层网络搭建虚拟的二层网络,与tap隧道有点相似,不过tap的虚拟交换机功能要在用户层实现。vxlan同样是基于udp的(为什么很少看到基于tcp的隧道?)

vxlan在内核当中实现,当数据包使用vxlan设备发送数据时,会打上vlxan的头部信息,在发送出去,对端解包,并根绝VNI把原是报文发送到目的服务器。

看起来很简单,这里面有两个最基本的问题:

  1. 由于是隧道技术,overlay层使用的是二层转发,那么overlay就需要填充二层mac地址
  2. 假设已经完成了mac地址填充,那么就涉及到underlay包发到对端的地址的问题。

只要解决了这两个问题,vxlan通信理论上就没问题。

flannel会操作三个表,路由表,arp表和二层转发表fdb。

为了让对端数据从vtep设备发出,封装成vxlan,需要添加路由表,但是和udp隧道不一样的是,udp隧道的tun网卡可以不填ip(linux),vtep是填充了一个32位掩码的ip了,vxlan的路由不仅指定了发送网卡,也指定了下一跳为对端vtep的ip,因为vxlan是mac in udp,而mac地址需要根据邻居子系统的arp表去查,arp表又需要依赖到ip地址,所以需要配置下一跳的ip地址为对端vtep的ip地址。

由于指定了下一跳是对端vtep的ip,那么内核需要查找到下一跳的mac地址来填充二层头,物理链路的解决方法是通过arp广播,但是在虚拟链路同样行不通,flannel会将对端vtep的mac地址写入到arp表当中。

通过mac地址表和arp表,就可以完成overlay的封包了,也就是解决了第一个问题。

第二个问题flannel的解法是使用fdb表,通过fdb表将对端vtep设备的mac地址配置dst port为对端物理网卡的ip,这样vxlan在underlay层面发送到对端的能力就有了。

以k8s为例子观察flannel的vxlan的路由表,arp表以及fdb表。

root@iZj6cce64o4g9pho18oib7Z:~# kubectl get nodes -o wide
NAME                      STATUS   ROLES    AGE   VERSION   INTERNAL-IP      EXTERNAL-IP   OS-IMAGE             KERNEL-VERSION       CONTAINER-RUNTIME
izj6ccaz331dob0wr9fqsxz   Ready    <none>   8d    v1.19.3   172.31.185.158   <none>        Ubuntu 18.04.2 LTS   4.15.0-48-generic    docker://18.9.7
izj6cce64o4g9pho18oib7z   Ready    master   8d    v1.19.3   172.31.185.160   <none>        Ubuntu 18.04.5 LTS   4.15.0-117-generic   docker://19.3.13

master节点

root@iZj6cce64o4g9pho18oib7Z:~# ifconfig eth0 --------------> eth0为物理网卡,ip为172.31.185.160
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500inet 172.31.185.160  netmask 255.255.240.0  broadcast 172.31.191.255inet6 fe80::216:3eff:fe06:37b8  prefixlen 64  scopeid 0x20<link>ether 00:16:3e:06:37:b8  txqueuelen 1000  (Ethernet)RX packets 8369  bytes 3234898 (3.2 MB)RX errors 0  dropped 0  overruns 0  frame 0TX packets 7046  bytes 3450313 (3.4 MB)TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0root@iZj6cce64o4g9pho18oib7Z:~# ifconfig flannel.1 ----------------> flannel.1 为vni为1的vtep设备,配置地址为10.244.0.0/32
flannel.1: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1450inet 10.244.0.0  netmask 255.255.255.255  broadcast 10.244.0.0inet6 fe80::3041:a4ff:fe8d:767f  prefixlen 64  scopeid 0x20<link>ether 32:41:a4:8d:76:7f  txqueuelen 0  (Ethernet)RX packets 0  bytes 0 (0.0 B)RX errors 0  dropped 0  overruns 0  frame 0TX packets 0  bytes 0 (0.0 B)TX errors 0  dropped 13 overruns 0  carrier 0  collisions 0root@iZj6cce64o4g9pho18oib7Z:~# ip ro ----------> 路由表,配置10.244.1.0/24网段走flannel.1网卡,下一跳是10.244.1.0(node1的vtep ip)
default via 172.31.191.253 dev eth0 proto dhcp src 172.31.185.160 metric 100
10.244.0.0/24 dev cni0 proto kernel scope link src 10.244.0.1
10.244.1.0/24 via 10.244.1.0 dev flannel.1 onlink
root@iZj6cce64o4g9pho18oib7Z:~#root@iZj6cce64o4g9pho18oib7Z:~# arp -n  ---------> arp表,指定10.244.1.0的mac地址为ee:70:9b:d2:dc:73(node1的vtep mac地址)
Address                  HWtype  HWaddress           Flags Mask            Iface
10.244.1.0               ether   ee:70:9b:d2:dc:73   CM                    flannel.1root@iZj6cce64o4g9pho18oib7Z:~# bridge fdb show dev flannel.1 -------> fdb表,ee:70:9b:d2:dc:73的underlay转发至node1(172.31.185.158)
ee:70:9b:d2:dc:73 dst 172.31.185.158 self permanent

node1
同样,在node1上,有反向的路由,arp,fdb等信息

root@iZj6ccaz331dob0wr9fqsxZ:~# ifconfig eth0 --------------> eth0为物理网卡,ip为172.31.185.158
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500inet 172.31.185.158  netmask 255.255.240.0  broadcast 172.31.191.255ether 00:16:3e:06:ac:11  txqueuelen 1000  (Ethernet)RX packets 25435  bytes 7615440 (7.6 MB)RX errors 0  dropped 0  overruns 0  frame 0TX packets 25438  bytes 8053385 (8.0 MB)TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0root@iZj6ccaz331dob0wr9fqsxZ:~# ifconfig flannel.1----------------> flannel.1 为vni为1的vtep设备,配置地址为10.244.1.0/32
flannel.1: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1450inet 10.244.1.0  netmask 255.255.255.255  broadcast 10.244.1.0inet6 fe80::ec70:9bff:fed2:dc73  prefixlen 64  scopeid 0x20<link>ether ee:70:9b:d2:dc:73  txqueuelen 0  (Ethernet)RX packets 0  bytes 0 (0.0 B)RX errors 0  dropped 0  overruns 0  frame 0TX packets 0  bytes 0 (0.0 B)TX errors 0  dropped 7 overruns 0  carrier 0  collisions 0root@iZj6ccaz331dob0wr9fqsxZ:~# ip ro ----------> 路由表,配置10.244.1.0/24网段走flannel.1网卡,下一跳是10.244.0.0(master的vtep ip)
10.244.0.0/24 via 10.244.0.0 dev flannel.1 onlinkroot@iZj6ccaz331dob0wr9fqsxZ:~# arp -n ---------> arp表,指定10.244.0.0的mac地址为32:41:a4:8d:76:7f(node1的vtep mac地址)
Address                  HWtype  HWaddress           Flags Mask            Iface
10.244.0.0               ether   32:41:a4:8d:76:7f   CM                    flannel.1root@iZj6ccaz331dob0wr9fqsxZ:~# bridge fdb show dev flannel.1-------> fdb表,32:41:a4:8d:76:7f 的underlay转发至node1( 172.31.185.160)
32:41:a4:8d:76:7f dst 172.31.185.160 self permanent

通过以上配置,保证master和node能够通过flannel的vxlan backend进行通信,如果再加入一个node2,那么master和node1上均会新增node的路由,arp,fdb三个表的配置,同样,node2也会新增master和node1的信息,保证能够通信。因此,和udp模式不一样的是,udp模式只需要加入一条大的路由表,再在应用程序做路由,vxlan在内核自己做的转发。

flannel的vxlan实现

有上面的基础,flannel只是将以上路由表,arp表,fdb表的添加和移除操作做一个编程实现,自动的添加和删除路由表。

flannel原理之vxlan模式相关推荐

  1. flannel原理之vxlan模式解析

    作者:刘海峰,IT行业资深码农,从事.net/java/go语言开发十余年,长期关注springcloud/k8s/linux网络相关的技术,现为滴普科技容器产品首席架构师. 前言 上一章介绍完fla ...

  2. flannel 原理 之 TUN模式

    flannel 原理 之 TUN模式 首先,TUN模式 原理详见 https://wonderful.blog.csdn.net/article/details/113105456 ,通常用来两个私网 ...

  3. Flannel的两种模式解析(VXLAN、host-gw)

    Flannel是为Kubernetes设计的一种简单易用的容器网络解决方案,将所有的Pod都组织在同一个子网的虚拟大二层网络中.Flannel支持的后端转发方式有许多种,本文将介绍其中两种,VXLAN ...

  4. 【转】flannel网络的VXLAN及host-gw

    http://www.fly63.com/article/detial/1738 VXLAN是Linux内核本身支持的一种网络虚拟化技术,是内核的一个模块,在内核态实现封装解封装,构建出覆盖网络,其实 ...

  5. Flannel host-gw 和 vxlan

    Overview Flannel 是 LCK 默认采用的网络插件方案,默认条件下 LCK 使用的是 vxlan 的模式,私有化场景下,如果确定客户的主机都在一个子网内,可以使用 host-gw 模式提 ...

  6. 无人机基础知识:多旋翼无人机飞行原理及飞行模式

    无人机基础知识:多旋翼无人机飞行原理及飞行模式 力的来源 飞行原理 横滚运动 俯仰运动 偏航运动 升降运动 无人机的控制模式 纯手动模式 姿态模式 定高模式 悬停模式 其它模式 在此篇博客分析了 无人 ...

  7. 第28节 防火墙基本知识、工作原理及工作模式

    防火墙基本知识.工作原理及工作模式 1 防火墙概述 1.1 基本概念 1.2 与路由器对比 1.3 防火墙的基本功能 1.4 衡量防火墙性能的5大指标 2 区域隔离 2.1 区域概念 2.2 隔离思路 ...

  8. 企业运维实战--k8s学习笔记 k8s网络通信、Flannel vxlan模式简介、calico网络插件替换、网络策略范例总结

    1.k8s网络通信 k8s通过CNI接口接入其他插件来实现网络通讯.目前比较流行的插件有flannel,calico等. CNI插件存放位置:# cat /etc/cni/net.d/10-flann ...

  9. flannel原理初探针对0.1.0版本

    flannel flannel是针对k8s设计的三层的网络解决方案.在k8s中为了使pod之间能够使用一种偏平的网络架构,从而完成跨Pod的网络通信. 官网给的原理图如下: flannel 使用TUN ...

最新文章

  1. 2 并发编程--开启进程的两种方式
  2. ListView Viewholder的坑 线性布局的坑
  3. 隐马尔可夫HMM中viterbi算法
  4. oracle 表空间的相关操作
  5. android 添加广告用proguard混淆后不显示问题解决方法
  6. 我不建议你这样进军人工智能……
  7. 2015年第六届蓝桥杯 - 省赛 - C/C++大学A组 - A. 方程整数解
  8. 关于 SENDKEYS 的代码
  9. 关于vue中Cannot read property 'length' of undefined 导致:数据不显示问题【自己经验参考】
  10. python中如何表示_新行在Python中是如何表示的?
  11. hdu 1518 dfs+剪枝
  12. linux操作系统命令及流程图,计算机操作系统与简单命令
  13. 通过this()调用有参构造方法
  14. QQ配置文件解密(转)
  15. 使用JQuery快速高效制作网页交互特效第六章课后
  16. C++ 输入输出加速挂(ACM竞赛常用)
  17. 【Windows批处理】批处理压缩包内加密pdf文件解密
  18. js 5文钱可以买一只公鸡,3文钱可以买一只母鸡,一文钱可以买3只小鸡,现在100文买100只鸡,请问各多少只
  19. 永久关闭smartGit弹出“非商业用途”的30s界面
  20. 微信小程序消息订阅超详细流程步骤

热门文章

  1. shell语法----变量
  2. 如何利用「心理账户」提高用户付费和留存?
  3. Linux 修改局域网内ip地址
  4. opencv3.1 提取图像中某一像素点的HSV值并判断颜色
  5. 第4章第15节:如何利用裁剪图形制作探照灯滚动扫描效果 [SwiftUI快速入门到实战]
  6. eclipse更新项目中的代码,必须手动clean才能清除
  7. 金融壹账通不到3年亏损42亿 股东“平安系”贡献过半收入
  8. 魔兽世界9.0主播最多的服务器,魔兽9.0来了!首日多个服务器爆满,有玩家排了4小时也没登上!...
  9. linux until用法,for循环使用和until循环
  10. linux基本功系列之chattr命令