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网络浅析的更多相关文章

  1. Docker容器跨主机通信--overlay网络

    一.Docker主机间容器通信的解决方案 Docker网络驱动 Overlay: 基于VXLAN封装实现Docker原生Overlay网络 Macvlan: Docker主机网卡接口逻辑上分为多个子接 ...

  2. docker overlay网络实现

    DOCKER的内置OVERLAY网络 内置跨主机的网络通信一直是Docker备受期待的功能,在1.9版本之前,社区中就已经有许多第三方的工具或方法尝试解决这个问题,例如Macvlan.Pipework ...

  3. docker使用 Flannel(etcd+flannel)网络

    一.Flannel网络简介 Flannel是一种基于overlay网络的跨主机容器网络解决方案,也就是将TCP数据包封装在另一种网络包里面进行路由转发和通信,Flannel是CoreOS开发,专门用于 ...

  4. IOS 网络浅析-(十三 SDWebImage 实用技巧)

    IOS 网络浅析-(十三 SDWebImage 实用技巧) 首先让我描述一下为了什么而产生的实用技巧.(在TableView.CollectionView中)当用户所处环境WiFi网速不够快(不能立即 ...

  5. Docker 新网络 overlay 网络

    Overlay网络是指在不改变现有网络基础设施的前提下,通过某种约定通信协议,把二层报文封装在IP报文之上的新的数据格式. 这样不但能够充分利用成熟的IP路由协议进程数据分发,而且在Overlay技术 ...

  6. Overlay网络技术之vxvlan

    了解云计算数据中心网络架构的过程中,看到这么一篇不错的关于大二层技术overlay的文章,转载分享给大家! 一. 传统网络面临的问题 随着企业业务的快速扩展需求,IT做为基础设施,快速部署和减少投入成 ...

  7. 准备 overlay 网络实验环境 - 每天5分钟玩转 Docker 容器技术(49)

    为支持容器跨主机通信,Docker 提供了 overlay driver,使用户可以创建基于 VxLAN 的 overlay 网络.VxLAN 可将二层数据封装到 UDP 进行传输,VxLAN 提供与 ...

  8. 创建 overlay 网络 - 每天5分钟玩转 Docker 容器技术(50)

    上一节我们搭建好实验环境,配置并运行了consul,今天开始创建 overlay 网络. 在 host1 中创建 overlay 网络 ov_net1: -d overlay 指定 driver 为 ...

  9. sdn学习-1(概念:Underlay网络和Overlay网络)

    随着云计算.大数据.移动互联网等新技术的普及,部署大量虚拟机成为一种必然趋势.解决这些虚拟机迁移问题理想的方案是在传统单层网络(Underlay)基础上叠加(Overlay)一层逻辑网络,将网络分成两 ...

随机推荐

  1. redis rehash

    rehash 随着操作的不断执行, 哈希表保存的键值对会逐渐地增多或者减少, 为了让哈希表的负载因子(load factor)维持在一个合理的范围之内, 当哈希表保存的键值对数量太多或者太少时, 程序 ...

  2. Linux/Centos下安装部署phantomjs

    PhantomJS 是一个基于 WebKit 的服务器端 JavaScript API.它全面支持web而不需浏览器支持,其快速,原生支持各种Web标准: DOM 处理, CSS 选择器, JSON, ...

  3. [Linux] 启用win10下Linux子系统

    转载请注明出处:https://www.cnblogs.com/lialong1st/p/12004080.html 最新的win10引入了Linux子系统,这样就免去了安装虚拟机或者双系统的麻烦. ...

  4. Assignment4:闰年判断输入异常时的处理方法

    一.问题描述 在输入界面输入年份,界面返回是否为闰年. 判断依据为:输入的数字可以被4整除但不可以被100整除 || 输入的数字可以被400整除 如果输入为数字以外的其他字符,会抛出异常.那么如何防止 ...

  5. 【转】npm 安装express npm ERR! code UNABLE_TO_VERIFY_LEAF_SIGNATURE

    npm  安装 express  出现 npm ERR! code UNABLE_TO_VERIFY_LEAF_SIGNATUREnpm ERR! errno UNABLE_TO_VERIFY_LEA ...

  6. The Matrix | 黑客帝国

    今天又刷了一遍,依旧跟第一次看一样,非常惊叹震撼,同时也发现了更多的细节. 梳理一下情节: 开始就是Trinity在matrix里被黑衣人Agent追杀,Trinity团队的目的是寻找Neo,显然Ag ...

  7. Oracle数据库安装以及使用脚本创建数据库授权

    安装数据库 事实上Oracle安装 1.安装准备 Oracle的安装包下载以后是两个压缩包,同时选中两个压缩包右击进行解压 2.解压完成如下图所示 3.双击 setup.exe 文件进行安装,会弹出以 ...

  8. OGC定义的几何要素

    OGC定义了两种描述几何对象的格式,分别是WKB(Well-Known Binary)和WKT(Well-Known Text). 在SQL语句中,用以下的方式可以使用WKT格式定义几何对象:几何类型 ...

  9. SWLU:主核性能采样、调试工具包

    http://bbs.nsccwx.cn/topic/262/swlu-主核性能采样-调试工具包

  10. web常用服务架构

    架构风格就是一种项目的设计模式.常见的架构风格有基于客户端与服务端的.基于组件模型的(EJB).分层架构(MVC).面向服务架构(SOA)等. 一.单体架构 单体架构也称为单体系统或单体应用,就是一种 ...