插件介绍
flannel项目本身只是一个框架 真正为用户提供容器网络功能的是后端实现 目前支持三种方式
1.VXLAN
2.host-gw
3.UDP
flannel会在宿主机上创建一个flannel0设备和创建一系列的路由表规则
flannel0设备介绍
负责在操作系统内核和用户应用程序之间传递IP包
1.内核态向用户态流动
当操作系统将一个IP包发送给flannel0设备后,flannel0设备就会把这个IP包交给
创建这个设备的应用程序也就是flanneld进程
2.用户态向内核态流动
flanneld进程向flannel0设备发送了一个IP包 这个IP包就会出现在宿主机的网络栈中 然后根据宿主机上的路由表规则处理
flannel子网
每台宿主机都会被flannel分配一个单独的子网段
每台宿主机上的所有容器地址都是这个子网段中的一个IP地址
子网信息和宿主机的对应关系都保存在etcd中
必须把docker0网桥的地址范围设置成flannel为宿主机分配的子网
dockderd --bip=flannel_subnet
UDP模式
UDP数据包封装模式
容器进程 -> docker0 >内核 用户态到内核态
内核 > flannel0 > flanneld进程 内核态到用户态
flanneld进程 > 内核 > eth0物理机网卡发出 用户态到内核态
由于UDP模式在内核态和用户态切换次数过多 所以性能比较差
系统级别编程的优化原则就是要减少用户态到内核态的切换次数 并且把核心的处理逻辑都放在内核态进行
数据包流程分析
UDP包的源地址和目标地址都是物理机地址 目标主机的flanneld进程在收到UDP包后
1.flanneld进程解析UDP包里的容器源IP和目标容器IP然后把解析后的包发给flannel0设备
2.操作系统自动接收flannel0中的数据 根据宿主机路由表转发到docker0设备
3.docker0通过自身的端口找到目标容器
VXLAN模式
VXLAN本身是Linux内核自带的模块 完全可以在内核态实现封装和解封装的操作
VXLAN的设计思想
在现有的三层网络上 构建一个虚拟的 由内核VXLAN模块负责维护的二层网络
使得连接在这个VXLAN二层网络中的虚拟机或者容器可以像在一个LAN中自由通信
在一个LAN中的所有主机相当于连接在一个交换机上 通过交换机就可以找到目标机
VTEP虚拟隧道端点设备 在宿主机上创建的设备叫flannel1
VTEP设备既有自己的IP地址 也有自己的MAC地址
VTEP设备和flannel0设备的作用相同 区别在于VTEP设备封装和解封装的对象是二层数据帧
flannel0设备封装和解封装的对象是UDP数据包
通过每个宿主机上的VTEP设备组成了一个虚拟的二层网络 通过二层数据帧进行通信
二层通信需要封装源MAC地址和目标MAC地址
根据目标IP来查找目标的MAC地址 是通过ARP表来实现的
flanneld进程会在每个节点上自动维护VTEP的IP和MAC地址的对应关系
ip neigh show dev flannel.1
flanneld进程
1.维护主机路由表 记录网段 网关 处理网卡设备信息
根据路由记录找到目标设备的IP地址
2.维护VTEP设备的ARP表 记录VTEP的IP和MAC地址的对应关系
根据目标设备的IP地址找到目标设备的MAC地址
3.维护FDB 网桥转发规则 记录VTEP的MAC地址和宿主机IP对应关系
4.flannel子网和宿主机之间的对应关系
flanneld做为宿主机上的一个用户进程 它们之间只要宿主机能相互通信
那么每个宿主机上的flanneld进程是可以通过宿主机网络相互传递数据包的
最新版本的 Flannel 并不依赖 L3 MISS 事件和 ARP 学习,而会在每台节点启动时把它的 VTEP 设备对应的 ARP 记录,直接下放到其他每台宿主机上
封装好VTEP设备的MAC地址(内部数据帧),对于宿主机网络来说并没有什么实际意义所以上面封装出来的这个数据帧,并不能在我们的宿主机二层网络里传输
所以接下来,Linux 内核还需要再把“内部数据帧”进一步封装成为宿主机网络里的一个普通的数据帧,好让它“载着”“内部数据帧”,通过宿主机的eth0网卡进行传输
VNI机制
Linux 内核会在“内部数据帧”前面,加上一个特殊的 VXLAN 头,用来表示这个“乘客”实际上是一个 VXLAN 要使用的数据帧。而这个 VXLAN 头里有一个重要的标志叫作 VNI,它 是 VTEP 设备识别某个数据帧是不是应该归自己处理的重要标识。而在Flannel中,VNI 的默认值是1,这也是为何宿主机上的 VTEP 设备都叫作flannel.1 的原因,这里的“1”,其 实就是 VNI 的值
VXLAN模式组建的覆盖网络,其实就是一个由不同宿主机上的VTEP设备,也就是 flannel.1 设备组成的虚拟二层网络.对于VTEP设备来说,它发出的“内部数据帧”就仿佛是一直在这个虚拟的二层网络上流动.这,也正是覆盖网络的含义
原文地址:https://www.cnblogs.com/yxh168/p/12206368.html