flannel提供的3种后端实现
UDP(flanneld封装和解封装UDP)
实现原理
缺点(性能最差)
UDP模式,封装和解封装的对象是三层IP包,提供三层的Overlay网络,是Flannel最早支持的一种方式,也是性能最差的一种方式,已经被弃用。
在发出IP包的过程中需要经过3次用户态与内核态之间的数据拷贝。
第1次,用户态的容器进程发出的IP包经过docker0网桥进入内核态。
第2次,IP包进入flannel0,从而回到用户态的flanneld进程。
第3次,flanneld对IP包进行UDP封包之后,将UDP包通过宿主机上内核态的eth0发出去。
flanneld封装和解封装UDP的过程在用户态完成。这些上下文切换和用户态操作的代价是比较高的,这是Flannel UDP模式性能差的主要原因。,
尽量减少用户态到内核态的切换次数,把核心逻辑都放在内核态。
VXLAN(基于UDP)
基本概念
VXLAN(Virtual Extensible LAN,虚拟可扩展局域网)解决子网不够用的问题。传统VLAN(VID占12位,2^12=4096)只能支持4000多个子网,VXLAN(VNID占24位,2^24=16777216)可以支持1600多万个子网。
VXLAN在内核态完成封装和解封装内部数据帧,是一个由不同宿主机上的VTEP设备,也就是flannel.1设备组成的虚拟二层网络。
一个VXLAN网络中包含了VTEP和VNI等部分。VTEP(VXLAN Tunnel Endpoint)在有VXLAN网络的机器上都有一个。VNI(VXLAN Network Identifier)用于区分不同VXLAN网络。VNI设置在每个VTEP上,VNI相同的VTEP在一个子网里。
实现原理
每台宿主机上名叫flannel.1的设备是VXLAN的VTEP设备,它既有IP地址,也有MAC地址。
# 在Node 1上
$ route -n
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
...
10.1.16.0 10.1.16.0 255.255.255.0 UG 0 0 0 flannel.1
$ ip neigh show dev flannel.1
10.1.16.0 lladdr 5e:f8:4f:00:e3:37 PERMANENT
内部二层数据帧
flannel.1作为网桥设备,转发的依据来自FDB(Forwarding Database)的转发数据库。
# 在Node 1上,使用“目的VTEP设备”的MAC地址进行查询
$ bridge fdb show flannel.1 | grep 5e:f8:4f:00:e3:37
5e:f8:4f:00:e3:37 dev flannel.1 dst 10.168.0.3 self permanent
加VXLAN头(flannel.1中的1就是VNI)和目的主机IP以及MAC地址构成UDP包
传输层:加上Outer UDP Header。
网络层:加上Outer IP Header。
数据链路层:加上二层数据帧头Outer Ethernet Header,并把Node2的MAC地址填进去。
host-gw(加路由)
实现原理
$ip route
...
10.244.1.0/24 via 10.168.0.3 dev eth0
作为纯三层网络方案,host-gw将每个Flannel子网(比如:10.244.1.0/24)的下一跳,设置成了该子网所在的宿主机的IP地址。这台主机充当这条容器通信路径里的网关。
二层互通
IP包在封装成帧发送出去时,会使用路由表里的下一跳来设置目的MAC地址。经过二层网络到达目的宿主机。
优点
不需要像VXLAN那样封包解包,性能最好。
手动模拟
# Node1
ip netns add ns1
brctl addbr br1
ip addr add 100.0.0.1/24 dev br1
ip link set dev br1 up
ip link add veth1 type veth peer name veth11
brctl addif br1 veth11
ip link set veth1 netns ns1
ip netns exec ns1 ip addr add 100.0.0.2/24 dev veth1
ip netns exec ns1 ip link set dev veth1 up
ip link set dev veth11 up
ip netns exec ns1 ip link set lo up
ip netns exec ns1 route add default gw 100.0.0.1 dev veth1
ip route add 100.0.1.0/24 via 192.168.1.6 dev ens33
# Node2
ip netns add ns1
brctl addbr br1
ip addr add 100.0.1.1/24 dev br1
ip link set dev br1 up
ip link add veth1 type veth peer name veth11
brctl addif br1 veth11
ip link set veth1 netns ns1
ip netns exec ns1 ip addr add 100.0.1.2/24 dev veth1
ip netns exec ns1 ip link set dev veth1 up
ip link set dev veth11 up
ip netns exec ns1 ip link set lo up
ip netns exec ns1 route add default gw 100.0.1.1 dev veth1
ip route add 100.0.0.0/24 via 192.168.1.5 dev ens33
同节点和跨节点ping通
参考资料
flannel提供的3种后端实现的更多相关文章
- VMWare提供了三种工作模式上网
VMWare提供了三种工作模式,它们是bridged(桥接模式).NAT(网络地址转换模式)和host-only(主机模式).要想在网络管理和维护中合理应用它们,你就应该先了解一下这三种工作模式. 1 ...
- oracle数据库中提供的5种约束
约束作用:用来保持数据的完整性,防止无效数据进入到数据库中.oracle数据库中提供的5种约束,都是限定某个列或者列的组合的.1.主键约束(PRIMARY KEY):在一个表中能唯一的标识一行.主键可 ...
- Windows提供了两种将DLL映像到进程地址空间的方法(隐式和显式)
调用DLL,首先需要将DLL文件映像到用户进程的地址空间中,然后才能进行函数调用,这个函数和进程内部一般函数的调用方法相同.Windows提供了两种将DLL映像到进程地址空间的方法: 1. 隐式的加载 ...
- Windows提供了两种将DLL映像到进程地址空间的方法
调用DLL,首先需要将DLL文件映像到用户进程的地址空间中,然后才能进行函数调用,这个函数和进程内部一般函数的调用方法相同.Windows提供了两种将DLL映像到进程地址空间的方法: 1. 隐式的加载 ...
- .NET提供了三种后台输出js的方式:
.NET提供了三种后台输出js的方式: 首先创建 js文件testjs.js { Page.ClientScript.RegisterClientScriptInclude("keys ...
- Matlab提供了两种除法运算:左除(\)和右除(/)
Matlab提供了两种除法运算:左除(\)和右除(/).一般情况下,x=a\b是方程a*x =b的解,而x=b/a是方程x*a=b的解.例:a=[1 2 3; 4 2 6; 7 4 9]b ...
- Django中提供的6种缓存方式
由于Django是动态网站,所有每次请求均会去数据进行相应的操作,当程序访问量大时,耗时必然会更加明显,最简单解决方式是使用: 缓存,缓存将一个某个views的返回值保存至内存或者memcache中, ...
- JDK提供的几种线程池比较
JDK提供的几种线程池 newFixedThreadPool创建一个指定工作线程数量的线程池.每当提交一个任务就创建一个工作线程,如果工作线程数量达到线程池初始的最大数,则将提交的任务存入到池队列中. ...
- BigDecimal提供了8种舍入方式
BigDecimal提供了8种舍入方式 1.ROUND_UP:舍入远离零的舍入模式.在丢弃非零部分之前始终增加数字(始终对非零舍弃部分前面的数字加1).注意,此舍入模式始终不会减少计算值的大小. 2. ...
- vmware为我们提供了三种网络工作模式,它们分别是:Bridged(桥接模式)、NAT(网络地址转换模式)、Host-Only(仅主机模式)。
原文来自http://note.youdao.com/share/web/file.html?id=236896997b6ffbaa8e0d92eacd13abbf&type=note 我怕链 ...
随机推荐
- LeetCode-440 字典序的第K小数字
来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/k-th-smallest-in-lexicographical-order 题目描述 给定整数 ...
- 负载均衡做集群时关于的session不均衡的解决方案
从用户端来解释,就是当一个用户第一次访问被负载均衡代理到后端服务器A并登录后,服务器A上保留了用户的登录信息:当用户再次发送请求时, 根据负载均衡策略可能被代理到后端不同的服务器,例如服务器B,由于这 ...
- FPGA MIG调试bug(一)
目标器件:复旦微FPGA:JFM7K325T8FCBGA676(对标Xilinx Kintex-7系的XC7K325T) 工程背景:板载4片DDR(AllianceMemory_DDR3L_8G_AS ...
- Java--判空方法
方法有StringUtils.isBlank() , StringUtils.isNotBlank() , StringUtils.isEmpty(); 使用关系 StringUtils.isNotE ...
- 苹果App 上架 app store 提示 “一张或多张屏幕快照的尺寸存在错误“
获取预览图的方式有两种:第一种是用真机运行然后截图获取:另一种是用模拟器运行然后截图获取. 先说说第一种获取方式:app运行在5.5英寸(6+)的手机上,截取屏幕快照.在上传时会报错:"一张 ...
- URLSearchParams(鲜为人知处理URL地址的技能)
最近学习中无意发现url新处理方式,看到之后十分感兴趣就整理了一下. URLSearchParams URLSearchParams 接口定义了一些实用的方法来处理 URL 的查询字符串.参照 URL ...
- 蓝牙mesh消息包与以太网帧的分层构成
目录 笔者在接触以太网之前,先了解的是蓝牙mesh的各类信息.现翻看一本介绍TCP/IP协议的资料,发现应用层数据在以太网协议栈内的封装过程与蓝牙mesh协议栈内的封装过程异曲同工.下图左侧是手头这本 ...
- 实验一 密码引擎-2-OpenEuler-OpenSSL测试
任务详情 在Ubuntu编写代码测试OpenSSL功能,包含Base64,SM2,SM3,SM4算法的调用,然后在OpenEuler中重现 提交代码链接和运行结果截图 加分项:在Windows中重现 ...
- C++ CLI string
String^ to std::string ` include <msclr\marshal_cppstd.h> marshal_as(String^) `
- 对SQL CTE的一点个人理解
/*执行顺序: 首先,执行按一.二,此时二输出的结果,可以理解为临时n 然后,按三.二.三.二循环执行 注意:,步骤三的where为递归终止条件,由于用的是substr函数.在最后一次递归的时候,如果 ...