flannel原理之vxlan模式
vxlan模式
vxlan是一种overlay技术,跟之前提到的udp模式思路是类似,但是具体实现不太一样:
- udp模式是在用户态实现的,数据会先经过tun网卡,到应用程序,应用程序再做隧道封装,再进一次内核协议栈,而vxlan是在内核当中实现的,只经过一次协议栈,在协议栈内就把vxlan包组装好
- udp模式的tun网卡是三层转发,使用tun是在物理网络之上构建三层网络,属于ip in udp,vxlan模式是二层实现,overlay是二层帧,属于mac in udp
- vxlan由于采用mac in udp的方式,所以实现起来会设计mac地址学习,arp广播等二层知识,udp模式主要关注路由
关于交换机以及网桥,mac地址相关的文章可以查看docker网络之网桥
flannel vxlan原理
vxlan是一种虚拟隧道通信技术,通过三层网络搭建虚拟的二层网络,与tap隧道有点相似,不过tap的虚拟交换机功能要在用户层实现。vxlan同样是基于udp的(为什么很少看到基于tcp的隧道?)
vxlan在内核当中实现,当数据包使用vxlan设备发送数据时,会打上vlxan的头部信息,在发送出去,对端解包,并根绝VNI把原是报文发送到目的服务器。
看起来很简单,这里面有两个最基本的问题:
- 由于是隧道技术,overlay层使用的是二层转发,那么overlay就需要填充二层mac地址
- 假设已经完成了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模式相关推荐
- flannel原理之vxlan模式解析
作者:刘海峰,IT行业资深码农,从事.net/java/go语言开发十余年,长期关注springcloud/k8s/linux网络相关的技术,现为滴普科技容器产品首席架构师. 前言 上一章介绍完fla ...
- flannel 原理 之 TUN模式
flannel 原理 之 TUN模式 首先,TUN模式 原理详见 https://wonderful.blog.csdn.net/article/details/113105456 ,通常用来两个私网 ...
- Flannel的两种模式解析(VXLAN、host-gw)
Flannel是为Kubernetes设计的一种简单易用的容器网络解决方案,将所有的Pod都组织在同一个子网的虚拟大二层网络中.Flannel支持的后端转发方式有许多种,本文将介绍其中两种,VXLAN ...
- 【转】flannel网络的VXLAN及host-gw
http://www.fly63.com/article/detial/1738 VXLAN是Linux内核本身支持的一种网络虚拟化技术,是内核的一个模块,在内核态实现封装解封装,构建出覆盖网络,其实 ...
- Flannel host-gw 和 vxlan
Overview Flannel 是 LCK 默认采用的网络插件方案,默认条件下 LCK 使用的是 vxlan 的模式,私有化场景下,如果确定客户的主机都在一个子网内,可以使用 host-gw 模式提 ...
- 无人机基础知识:多旋翼无人机飞行原理及飞行模式
无人机基础知识:多旋翼无人机飞行原理及飞行模式 力的来源 飞行原理 横滚运动 俯仰运动 偏航运动 升降运动 无人机的控制模式 纯手动模式 姿态模式 定高模式 悬停模式 其它模式 在此篇博客分析了 无人 ...
- 第28节 防火墙基本知识、工作原理及工作模式
防火墙基本知识.工作原理及工作模式 1 防火墙概述 1.1 基本概念 1.2 与路由器对比 1.3 防火墙的基本功能 1.4 衡量防火墙性能的5大指标 2 区域隔离 2.1 区域概念 2.2 隔离思路 ...
- 企业运维实战--k8s学习笔记 k8s网络通信、Flannel vxlan模式简介、calico网络插件替换、网络策略范例总结
1.k8s网络通信 k8s通过CNI接口接入其他插件来实现网络通讯.目前比较流行的插件有flannel,calico等. CNI插件存放位置:# cat /etc/cni/net.d/10-flann ...
- flannel原理初探针对0.1.0版本
flannel flannel是针对k8s设计的三层的网络解决方案.在k8s中为了使pod之间能够使用一种偏平的网络架构,从而完成跨Pod的网络通信. 官网给的原理图如下: flannel 使用TUN ...
最新文章
- 2 并发编程--开启进程的两种方式
- ListView Viewholder的坑 线性布局的坑
- 隐马尔可夫HMM中viterbi算法
- oracle 表空间的相关操作
- android 添加广告用proguard混淆后不显示问题解决方法
- 我不建议你这样进军人工智能……
- 2015年第六届蓝桥杯 - 省赛 - C/C++大学A组 - A. 方程整数解
- 关于 SENDKEYS 的代码
- 关于vue中Cannot read property 'length' of undefined 导致:数据不显示问题【自己经验参考】
- python中如何表示_新行在Python中是如何表示的?
- hdu 1518 dfs+剪枝
- linux操作系统命令及流程图,计算机操作系统与简单命令
- 通过this()调用有参构造方法
- QQ配置文件解密(转)
- 使用JQuery快速高效制作网页交互特效第六章课后
- C++ 输入输出加速挂(ACM竞赛常用)
- 【Windows批处理】批处理压缩包内加密pdf文件解密
- js 5文钱可以买一只公鸡,3文钱可以买一只母鸡,一文钱可以买3只小鸡,现在100文买100只鸡,请问各多少只
- 永久关闭smartGit弹出“非商业用途”的30s界面
- 微信小程序消息订阅超详细流程步骤
热门文章
- shell语法----变量
- 如何利用「心理账户」提高用户付费和留存?
- Linux 修改局域网内ip地址
- opencv3.1 提取图像中某一像素点的HSV值并判断颜色
- 第4章第15节:如何利用裁剪图形制作探照灯滚动扫描效果 [SwiftUI快速入门到实战]
- eclipse更新项目中的代码,必须手动clean才能清除
- 金融壹账通不到3年亏损42亿 股东“平安系”贡献过半收入
- 魔兽世界9.0主播最多的服务器,魔兽9.0来了!首日多个服务器爆满,有玩家排了4小时也没登上!...
- linux until用法,for循环使用和until循环
- linux基本功系列之chattr命令