容器网络相比过去虚拟机的网络虚拟化有一些变化,过去虚拟机的网络虚拟化,要模拟的是 NIC 设备,要模拟虚拟网卡的硬件细节。到容器时代,网络虚拟化会更多地重用 linux 自身的网络设备,可以在协议栈的三层路由掉,不需要从最底层走一遍硬件模拟。再就是网络的扩展性问题会更上台面,比如虚拟机时代虚拟网络端口的数量没有容器那么多,虚拟主机的上下线也并不频繁,二层网络方案应对虚拟机绰绰有余,但是对较大规模的容器网络可能便不够了

L2 bridging: 接入广播域

二层网络接入较简单,几乎是自发现的,将网络端点通过网桥接入广播域即可。交换机自动将包广播到新发现的网络端点,如果对方端点有响应,则记录到地址学习的数据库 fdb 中,随后便可以通过 MAC 地址做点对点的交换通信。

交换机比较怕端口桥接成环,以太网帧也不像 IP packet 带有 TTL,生命周期有限不那么很怕路由环路,而二层环路会将帧无穷无尽地转发下去。为了避免出环,交换机一般实现 STP 协议,交换拓扑信息生成大家认可的唯一拓扑。

Linux 有 bridge 设备与物理的交换机大致上等价,有 flooding、地址学习、STP 的实现。但也有一点差异,便是交换机可以只专注转发,而 Linux 还需要做包括 socket 栈在内的三层往上的协议栈支持。这里有一个细节是 Linux 不允许为接入 bridge 设备的网络设备配置 IP。因为接入 bridge 设备的网络设备会将二层流量无脑转发给 bridge,它自身是无暇理解响应三层流量的,配 IP 也没有意义。那么问题来了,主机的网络接入设备 eth0 接入了 bridge 设备,不能配置 IP,那么 Linux 主机怎样响应 socket 流量?这时可以将 IP 配置给 bridge 设备,bridge 设备对收到的帧做三层解析,替代 eth0 设备向上做三层协议处理,相当于 bridge 设备有一个隐含的端口,对接到 Linux 的三层栈。

通过 bridge,可以做最简单的独立 ip 的容器网络:

容器的虚拟网络设备可以 veth pair 穿透 namespace,再透过 bridge 接入广播域。一旦接入广播域,便可以通过对 ARP 广播的响应声明自己的 IP。

macvlan & ipvlan l2

macvlan 可以理解成对 bridge 的简化,这句话 macvlan 的概括比较好:

The macvlan is a trivial bridge that doesn’t need to do learning as it knows every mac address it can receive, so it doesn’t need to implement learning or stp. Which makes it simple stupid and and fast. ——Eric W. Biederman

macvlan 允许单个物理设备划分成多个独立 mac 地址的虚拟设备。因为地址是已知的,因此不必地址学习,因为不会产生环,也不必 STP。

单端口多 MAC 地址可能在网络环境中支持不好,比如有些交换机对单端口的 MAC 地址个数有限制,这是公有云的用户不可控的。

ipvlan L2 稍稍跳到二层往上,将 IP 地址作为区分网络设备的标记,允许一个 MAC 地址背后多个 IP 地址。

L2 容器网络的问题很明显:

  • 广播范围大,假如 100 台物理机每台 100 个容器,广播的范围便是 100 x 100 + 100;
  • 抖动大,容器上下线的频次非物理机/虚拟机可比,每变动一个容器会 ARP 风暴所有主机的所有容器;
  • STP 是为了保护 L2 网络免受环路通信的影响,然而在极大规模的 L2 网络下,STP 本身也能成为瓶颈;

L3 Routing

当 L2 网络遭遇扩展性问题时,必须将网络划分网段以隔离广播域,通过 IP 协议来跨网段通信。 网段内的一台主机,对网段外有多少主机上线下线是可以不 care 的,只需要给目标网段的路由器发包即可。

容器上下线频次高,但是物理机上下线的频次要少得多。层容器网络方案便是将物理机看作一个网段的网关,外部不需要关心网段内部容器的上下线。至于网关的上下线,通过路由协议或者宿主机上跑的 daemon 来同步路由表。像 flannel 的 host-gw 模式,会在每台物理机上跑 flanneld 侦听 etcd 中路由表的变化,同步到本地路由表:

References

  • https://tools.ietf.org/html/rfc1180
  • Introduction to Linux interfaces for virtual networking
  • Calico over an Ethernet interconnect fabric
  • A container networking overview

linux 路由表_Linux 容器网络笔记:underlay相关推荐

  1. linux rdma服务,容器网络启用RDMA高速通讯-Freeflow

    容器网络启用RDMA高速通讯-Freeflow 1.Freeflow简介 RDMA是一种网卡间直接高速互联的通讯机制.对比传统DMA的内部总线IO,RDMA通过网络在两个端点的应用软件之间实现buff ...

  2. Docker网络体系结构:设计可扩展、可移植的Docker容器网络

    原文地址 译者:本人翻译水平有限,目的仅是为了学好Docker,如有错误请见谅. 翻译版本:v1.01(将不断优化翻译质量) 本文包含以下内容 Docker容器就是将应用及其所依赖运行环境的完整文件系 ...

  3. 【K8S】详解容器网络中的overlay、underlay

    目录 overlay网络模型 underlay 总结: overlay网络模型 接上文https://blog.csdn.net/qq_39965059/article/details/1259487 ...

  4. linux网络报文接收发送浅析_Docker容器网络-基础篇

    Docker的技术依赖于Linux内核的虚拟化技术的发展,Docker使用到的网络技术有Network Namespace.Veth设备对.Iptables/Netfilter.网桥.路由等.接下来, ...

  5. 网络笔记(29) 容器网络:来去自由的日子,不买公寓去合租

    如果说虚拟机是买公寓,容器则相当于合租,有一定的隔离,但是隔离性没有那么好.云计算解决了基础资源层的弹性伸缩,却没有解决 PaaS 层应用随基础资源层弹性伸缩而带来的批量.快速部署问题.于是,容器应运 ...

  6. 为啥Underlay才是容器网络的最佳落地选择

    导语: 几年前,当博云启动自研容器网络研发的时候,除了技术选型的考虑,我们对于先做 Underlay 还是 Overlay 网络也有过深度的讨论.当时的开源社区以及主流容器厂商,多数还是以 Overl ...

  7. 初学Docker容器网络不得不看的学习笔记

    [技术沙龙002期]数据中台:宜信敏捷数据中台建设实践|宜信技术沙龙 将于5月23日晚8点线上直播,点击报名 一.关于Docker Docker 是一个开源的应用容器引擎,基于 Go 语言 并遵从Ap ...

  8. centos7 dns配置_Linux Sever简单笔记(第十三堂课)之linux下的网络管理及DHCP配置的相关操作 - 我杨晓东太难了...

    第13章linux下的网络管理 Linux下的网络管理 查看及测试网络 设置网络地址参数 使用DHCP动态配置主机地址 查看网络接口信息 ifconfig  查看所有活动网络接口的信息 ⚫ 执行 if ...

  9. 网络限流linux,DockOne微信分享(一九八):容器网络限流实践

    [编者的话]我们需要为"上云"的应用提供流量带宽保证,使其不受到其他应用或其他用户的应用的影响.我们需要提供租户级别或者应用级别的有效隔离.今天将分享一下我们为了达到这个目标做了哪 ...

最新文章

  1. 庆祝自己过了ACP!!
  2. python3的各个版本有什么区别_python不同版本的_new_不同点总结
  3. 干货丨达沃斯群英纵论人工智能,核心观点汇总
  4. Android EditText不弹出输入法焦点问题的总结
  5. 迎接5G普及风暴,还缺这把「万能钥匙」
  6. 【ArcGIS遇上Python】从入门到精通系列之第二章:ArcGIS Python基本语法基础速递
  7. python多维数组运用_使用Python将文件读入多维数组
  8. p沟道mos管导通条件_打开知识大门的捷径!MOS管基本认识
  9. java javah_Java开发网 - 一个javah的问题
  10. SQL 2016 性能调优培训来了!!! 还免费!!!
  11. 时序动作定位:Rethinking the Faster R-CNN Architecture for Temporal Action Localization(TAL-Net)
  12. 如何利用大数据打造智慧交通
  13. JavaWeb知识点复习(第一次)
  14. 计算机unity文献综述,Unity3D密室逃脱游戏设计+文献综述.doc
  15. java 实现qq截图功能吗_Java实现了任意位置截屏(仿QQ截图)
  16. UnityShader顶点着色器实现旗帜飘动效果
  17. 每日分享 环境报错:Exception in thread “main“ java.lang.RuntimeException: Cannot create staging directory
  18. 科研伦理与学术规范(笔记)
  19. user.has_perm(perm) 中参数 perm 的格式问题 - Django
  20. 分析C语言的声明——《C专家编程》

热门文章

  1. [禅悟人生]谦虚有助于自我消融
  2. web测试和一般的应用程序测试的主要区别
  3. JavaScript==比较的规则
  4. javascript小技巧 JavaScript[对象.属性]集锦 [zz]
  5. PC电脑端QQ如何适应电脑端大小
  6. 双目相机定位3d python_用深度学习实现 2D 到 3D 的转换
  7. 数学老师从没这么教过,乘法竖式中进位可以是多位(附Python实现与测试源码)...
  8. Python代码覆盖性测试入门
  9. 力扣530. 二叉搜索树的最小绝对差(JavaScript)
  10. 设置最小值_WELSIM中设置有限元计算结果的最大最小值