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. 批量更新表注释 mysql

    -- 生成更新语句 SELECT CONCAT( 'ALTER TABLE ', T2.table_name, ' COMMENT ''', T1.TABLE_COMMENT, ''';' ) sql ...

  2. 利用ssh 删除远程服务器文件

    ssh 登录,利用命令 rm 登录ssh ssh name@10.202.9.11 rm 命令删除文件 rm file rm -rf 删除文件夹 rm -rf fold 删除当前文件夹内容,保留当前文 ...

  3. 开源JS图片裁剪插件

    开源JS图片裁剪插件 一.总结 一句话总结: 要用点赞最高的插件,这样适用性最好,效果最好,出问题的概率也最低,这里电脑端和手机端都可以用的建议用 cropper.js 二.5款好用的开源JS图片裁剪 ...

  4. StringBuffer & StringBuilder的区别

    StringBuffer是线程安全的,内部有锁.所以比StringBuilder慢一点. 在单线程生成字符串的情况下,优先使用StringBuilder. 这就是为啥有时候IntelliJ Idea会 ...

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

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

  6. 七、postman-request methods

    一.一些常见的请求方法 GET POST PUT DELETE PATCH

  7. Python3基础 bool True为1 False为0

             Python : 3.7.3          OS : Ubuntu 18.04.2 LTS         IDE : pycharm-community-2019.1.3    ...

  8. ubuntu 关于curses头文件问题

    执行编译gcc -o badterm badterm.c -lcurses后报错情报如下:term.h: 没有那个文件或目录curses.h: 没有那个文件或目录很明显,程序找不到term.h和cur ...

  9. scons 简单入门

    scons 简单入门 摘自:https://www.jianshu.com/p/e4bd3ab9e5d6 0.2042019.01.20 12:58:44字数 1201阅读 3021 简单入门 hel ...

  10. 【Linux】Gitlab库已损坏前端显示500错误解决方法

    背景: 在进行gitlab数据迁移之后,所有页面正常访问,唯独在访问项目repo地址时,报500错误 1 查看日志: 命令查看: gitlab-ctl tail 或者手动查看:/var/log/git ...