flannel overlay网络浅析
Flannel基于UDP的网络实现
container-1的route表信息如下(b1):
default via 100.96.1.1 dev eth0
100.96.1.0/24 dev eth0 proto kernel scope link src 100.96.1.2
100.96.0.0/16 via 100.96.1.1 dev eth0
node1(10.168.0.2)的route表信息如下(b2):
default via 10.168.0.1 dev eth0
100.96.0.0/16 dev flannel0 proto kernel scope link src 100.96.1.0
100.96.1.0/24 dev docker0 proto kernel scope link src 100.96.1.1
10.168.0.0/24 dev eth0 proto kernel scope link src 10.168.0.2
说明
如果发生如下情况不应该质疑,先认为理论正确
1.容器中的eth0与挂在docker0网桥上的veth*虚拟网卡设备组成veth设备对,数据包从某一端流入,在另一端将直接收到。
2.挂在docker0网桥上的veth*虚拟网卡设备作为从设备,会被“剥夺”调用网络协议栈处理数据包的资格,从而“降级”成为网桥上的一个端口。而这个端口唯一的作用,就是接收流入的数据包。
3.TUN 设备(Tunnel 设备)是工作在第三层的虚拟网络设备,用于在操作系统内核和用户应用程序之间传递IP包,当操作系统将一个 IP 包发送给 flannel0 设备之后,flannel0 就会把这个 IP 包,交给创建这个设备的应用程序(Flannel进程)
4.docker0相当于二层交换机,其维护了 mac地址与interface的对应关系表,如目的mac地址为xx的应该发往veth*这个interface
过程
container-1(c1 100.96.1.2) -> container-2(c2 100.96.2.3) 数据包流转过程如上图(图源自极客实践):
1. c1发出数据包,根据c1的route表b1,因为目的地址为c2的ip100.96.2.3,匹配b1的第三条规则,既数据包将通过c1的eth0发出,根据说明1,数据包出现在docker0网桥的veth*一端并流入docker0处理。
2. docker0查询节点的route表,既b2,匹配第二条规则,数据包从docker0发至flannel0,根据说明3,ip数据包将会从flannel设备(内核中)到达flanneld进程(用户进程)。
3.ip数据包到达flanneld进程后,问题可转化为在宿主机node1和node2的flanneld之间的通信问题,node1上的进程发送的数据,匹配b1第四条规则,宿主机eth0网卡以UDP协议格式发送ip包,此时存在真实网络链路可通信。
4. 当node2的flanneld进程收到报文之后会交给flannel0设备,flannel0设备查询route表后把数据包交给docker0,docker0再根据目地容器的mac地址找到目的容器在docker0一端的veth*,数据发往veth*之后,容器端的eth0网卡即收到数据并处理之。
flannel的udp后端实现性能较差,如下图,在数据包最终从宿主机发出之前经过了3次的用户态和内核态之间的拷贝(进行系统级编程的时候,有一个非常重要的优化原则,就是要减少用户态到内核态的切换次数,并且把核心的处理逻辑都放在内核态进行)
问题
1. 当flanneld进程收到flannel0这个tun设备交上来的ip包之后,是怎么知道这个数据应该发往的目的宿主机的flanneld进程的?
flannel首先规划一个网段作为集群的容器ip分配的地址段如100.96.0.0/16,在这个基础上为每一个宿主机划分一个子网subnet,如node1的subnet为100.96.1.0/24,node2的subnet为100.96.2.0/24,每个宿主机上的容器在自己的subnet上为容器分配ip,这样就能保证各容器ip不冲突,反过来,根据目的容器ip如100.96.2.3就能知道其subnet为100.96.2.0/24,既对应宿主机node2,subnet与宿主机ip的对应关系存储在etcd中。
2. 为什么flanneld使用UDP协议来发送包而不是TCP,因为UDP简单高效,但UDP不是不可靠吗?
我的理解:因为flanneld进程的目的只是将tun设备交上来的数据包进行封装并发送给目的端,并不需要保证数据包正确到达,这个保证工作应该由发送方进程也就是容器中的进程使用的传输层tcp协议控制。
其实吧,所谓的可靠的tcp链接不过是发送方和接收方各自维护一个连接状态而已,包在网络中传输过程中该丢丢,只不过tcp协议会做一些重传等机制来做到最终数据的按序、完整到达。所以在flannel的udp实现中,容器之间已经在维护tcp状态了,节点间的flanneld再用
tcp协议传输包就没必要且低效了。
Flannel基于Vxlan的网络实现
flannel overlay网络浅析的更多相关文章
- Docker容器跨主机通信--overlay网络
一.Docker主机间容器通信的解决方案 Docker网络驱动 Overlay: 基于VXLAN封装实现Docker原生Overlay网络 Macvlan: Docker主机网卡接口逻辑上分为多个子接 ...
- docker overlay网络实现
DOCKER的内置OVERLAY网络 内置跨主机的网络通信一直是Docker备受期待的功能,在1.9版本之前,社区中就已经有许多第三方的工具或方法尝试解决这个问题,例如Macvlan.Pipework ...
- docker使用 Flannel(etcd+flannel)网络
一.Flannel网络简介 Flannel是一种基于overlay网络的跨主机容器网络解决方案,也就是将TCP数据包封装在另一种网络包里面进行路由转发和通信,Flannel是CoreOS开发,专门用于 ...
- IOS 网络浅析-(十三 SDWebImage 实用技巧)
IOS 网络浅析-(十三 SDWebImage 实用技巧) 首先让我描述一下为了什么而产生的实用技巧.(在TableView.CollectionView中)当用户所处环境WiFi网速不够快(不能立即 ...
- Docker 新网络 overlay 网络
Overlay网络是指在不改变现有网络基础设施的前提下,通过某种约定通信协议,把二层报文封装在IP报文之上的新的数据格式. 这样不但能够充分利用成熟的IP路由协议进程数据分发,而且在Overlay技术 ...
- Overlay网络技术之vxvlan
了解云计算数据中心网络架构的过程中,看到这么一篇不错的关于大二层技术overlay的文章,转载分享给大家! 一. 传统网络面临的问题 随着企业业务的快速扩展需求,IT做为基础设施,快速部署和减少投入成 ...
- 准备 overlay 网络实验环境 - 每天5分钟玩转 Docker 容器技术(49)
为支持容器跨主机通信,Docker 提供了 overlay driver,使用户可以创建基于 VxLAN 的 overlay 网络.VxLAN 可将二层数据封装到 UDP 进行传输,VxLAN 提供与 ...
- 创建 overlay 网络 - 每天5分钟玩转 Docker 容器技术(50)
上一节我们搭建好实验环境,配置并运行了consul,今天开始创建 overlay 网络. 在 host1 中创建 overlay 网络 ov_net1: -d overlay 指定 driver 为 ...
- sdn学习-1(概念:Underlay网络和Overlay网络)
随着云计算.大数据.移动互联网等新技术的普及,部署大量虚拟机成为一种必然趋势.解决这些虚拟机迁移问题理想的方案是在传统单层网络(Underlay)基础上叠加(Overlay)一层逻辑网络,将网络分成两 ...
随机推荐
- Communications link failure due to underlying exception: ** BEGIN NESTED EXC
一是将 wait_timeout=31536000 interactive_timeout=31536000 将过期时间修改为1年. 二是在连接URL上添加参数:&autoReconnect= ...
- Socket通信(1):搭建开发环境
一. 准备工具 1. mac环境下的VMware Fusion, 下载地址:https://www.newasp.net/soft/462096.html 2. ubuntu 14.04 LTS, 不 ...
- mobile crane 1
void MobileCrane::rotateRope2() { //double r_angle1 = rotateRope + rorate3; //std::cout << &qu ...
- Dart 中常用的数组操作方法总结
这里总结了一些在 Dart 中常用的数组操作方法,以便查阅. 首先,我们准备两组数据,以方便后面使用: List<Map> students = [ { 'name': 'tom', 'a ...
- window TOMCAT 端口被占用了怎么办?
查看80端口被哪些程序占用了 netstat -ano|findstr "80" 根据pid(进程id) 查询对应的应用程序 tasklist|findstr "1828 ...
- [整理]Python程序员面试前需要看的博客(持续整理)
基本素养 如何聪明的提问 面试方法 从面试官角度来告诉大家,哪些人能面试成功 如何在面试中介绍自己的项目经验 计算机系统 [面试] 迄今为止把同步/异步/阻塞/非阻塞/BIO/NIO/AIO讲的这么清 ...
- android webview带cookie访问url
问题描述在原生和h5混合开发的时候会遇到这么一个问题,用webview加载某个url时,你只是app登录了账号,但是网页却没有,所有会禁止访问此url,webview就会显示白屏.所以要访问此url, ...
- iOS 不允许横屏的简单代码
- (NSUInteger)application:(UIApplication *)application supportedInterfaceOrientationsForWindow:(UIWi ...
- python对 windows系统监控插件
在python编程的windows系统监控中,需要监控监控硬件信息需要两个模块:WMI 和 pypiwin32 .
- 迅速生成项目-react-nextjs
推荐指数: