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. 咏南中间件随LINUX开机自动启动

    咏南中间件随LINUX开机自动启动 LINUX DEAMON,LINUX也有类似WINDOWS的服务. program ynCrossServer; {$HINTS OFF} {$APPTYPE CO ...

  2. 后端小白的Bootstrap笔记 一

    栅格系统 下面这张图是Bootstrap对栅格系统有关系数的规定 什么是栅格体统? 栅格系统是Bootstrap提供的移动优先的网格系统, 各个分界点如上: 576px 720px 992px 120 ...

  3. [XLua]热更新四部曲视频教程+示例源码

    基于Unity2017 xLua是由腾讯维护的一个开源项目,xLua为Unity. .Net. Mono等C#环境增加Lua脚本编程的能力,借助xLua,这些Lua代码可以方便的和C#相互调用.自20 ...

  4. vue后台管理系统兼容问题

    1.兼容 兼容问题主要是指ie9以下的ie浏览器. 2.兼容问题原因 (1)低版本ie不支持编译后的es5 (2)低版本ie不支持Promise 3.解决方法 (1)引入es6-promise &am ...

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

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

  6. 效率包括了代码的GC 大小与内存大小,执行速度等等。其中执行速度不是关注 的重点

    效率包括了代码的GC 大小与内存大小,执行速度等等.其中执行速度不是关注的重点

  7. OptaPlanner - AI Constraint satisfaction solver

    OptaPlanner - 国内版 Binghttps://cn.bing.com/search?q=OptaPlanner&qs=n&form=QBRE&sp=-1& ...

  8. 小D课堂 - 零基础入门SpringBoot2.X到实战_第2节 SpringBoot接口Http协议开发实战_6、SpringBoot2.xHTTP请求配置讲解

    1.SpringBoot2.xHTTP请求配置讲解 简介:SpringBoot2.xHTTP请求注解讲解和简化注解配置技巧 1.@RestController and @RequestMapping是 ...

  9. python-learning-第二季-数据库编程

    https://www.bjsxt.com/down/8468.html 代码实现: #coding:utf- #导入模块 import sqlite3 #创建connect连接 con = sqli ...

  10. URL相关的工具类

    package com.opslab.util.web; import com.opslab.util.CharUtil;import com.opslab.util.CharsetUtil;impo ...