k8s跨主机网络方案之Flannel

2023-11-07

什么是overlay network?

Overlay 技术是在现有的物理网络之上构建一个虚拟网络,上层应用只与虚拟网络相关。

Overlay 在网络技术领域,指的是一种网络架构上叠加的虚拟化技术模式,其大体框架是对基础网络不进行大规模修改的条件下,实现应用在网络上的承载,并能与其它网络业务分离,并且以基于 IP 的基础网络技术为主。

vxlan

VxLAN 使用虚拟隧道端点(Virtual Tunnel End Point、VTEP)设备对服务器发出和收到的数据包进行二次封装和解封。

VXLAN的设计思想是:

在现有的三层网络之上,“覆盖”一层虚拟的、由内核VXLAN模块负责维护的二层网络,使得连接在这个VXLAN二层网络上的“主机”(虚拟机或容器都可以),可以像在同一个局域网(LAN)里那样自由通信。

VXLAN是一种隧道技术。通过将虚拟网络中的数据帧封装在实际物理网络中的报文中进行传输。具体实现方式为:将虚拟网络的数据帧添加VXLAN首部后,封装在物理网络中的UDP报文中,然后以传统网络的通信方式传送该UDP报文,到达目的主机后,去掉物理网络报文的头部信息以及VXLAN首部,将报文交付给目的终端。整个通信过程目的终端不会感知到物理网络的存在。

为什么需要 Overlay Network?

为了不影响隔离性并实现容器间的网络通信,Docker 通过虚拟网桥“连接”容器,使容器得以像物理节点一样经过“交换机”通讯。Docker 在宿主机上创建名为 docker0 的虚拟网桥,对于每一个创建的容器均创建一对虚拟网卡设备,其中一端在 docker0,另一端映射到容器内的 eth0,并对容器内网卡分配一个容器网络 IP。通过这一对虚拟网卡,容器就相当于“连接”到网桥上,虚拟网卡接在网桥上时只负责接受数据包,不再调用网络协议栈进行处理,因此只具有类似端口的作用。当容器 A 要访问容器 B 时,只需要广播 ARP 协议,通过 docker0 转发请求到对应”端口”,就实现了数据的转发。

然而,虽然虚拟网桥解决了同一宿主机下的容器间通信问题,以及容器与外部世界之间的通信,但是跨节点的容器通信依然存在问题。集群中每个节点的 docker0 都是独立的,不同节点分配的容器 IP 之间存在冲突的可能,因此需要有一个具有全局视角的上层网络以实现跨节点的容器网络,这便是 Overlay Network 解决方案的由来。

Flannel的介绍

Flannel是一种基于overlay网络的跨主机容器网络解决方案,也就是将TCP数据包封装在另一种网络包里面进行路由转发和通信。在默认的Docker配置中,每个节点上的Docker服务会分别负责所在节点容器的IP分配。这样导致的一个问题是,不同节点上容器可能获得相同的内外IP地址。并使这些容器之间能够之间通过IP地址相互找到,也就是相互ping通。Flannel设计目的就是为集群中所有节点重新规划IP地址的使用规则,从而使得不同节点上的容器能够获得"同属一个内网"且"不重复的"IP地址,并让属于不同节点上的容器能够直接通过内网IP通信。

Flannel UDP模式

TUN设备

TUN设备是工作在三层的虚拟网络设备,功能是:在操作系统内核和用户应用程序之间传递IP包。 相比两台宿主机直接通信,多出了 flanneld 的处理过程,这个过程,使用了 flannel0 这个TUN设备,仅在发出 IP包的过程中经过多次用户态到内核态的数据拷贝(linux的上下文切换代价比较大),所以性能非常差

我们来分析这个图片的流程

  • IP 为 10.1.15.2 的 Pod1 与另外一个 Node 上 IP 为 10.1.20.3 的 Pod1 进行通信;
  • 首先 Pod1 通过 veth 对把数据包发送到 docker0 虚拟网桥,网桥通过查找转发表发现 10.1.20.2 不在自己管理的网段,就会把数据包转发给默认路由(这里为 flannel0 网桥);
  • flannel0是一个tun设备,它是一种工作在三层的虚拟网络设备,而flanneld是一个proxy,它会监听flannel0并转发流量,所以发送给flannel0接口的包将被flanneld进程接收到。flannel0看到Pod1 要访问的IP地址为10.1.20.3 的容器,因为flannel在etcd中存储着子网和宿主机ip的对应关系,所以能够找到10.1.20.3对应的宿主机IP为192.168.0.100,进而开始组装UDP数据包发送数据到目的主机

这里有一个问题就是flanneld怎么知道10.1.20.2这个容器到底是在哪个节点上呢?

flanneld在启动时会将该节点的网络信息保存到etcd当中,故在发送报文时可以通过查询etcd得到192.168.0.100这个容器的IP属于Node2 ,且Node2 的IP为192.168.0.100。

  • flanneld将封装好的UDP报文经eth0发出
  • 网络包经Node1和Node2之间的网络连接到达Node2
  • Node2 收到UDP报文后经Linux内核通过UDP端口号8285将包交给正在监听的应用flanneld。
  • 运行在Node2 当中的flanneld将UDP包解包后得到:10.1.15.2 -> 10.1.20.3 。
  • 解包后的包匹配到Node2 上的路由规则(10.10.20.0),内核将包发送到docker0 虚拟网桥,继而由 docker0 传输到 Pod 容器。

UDP模式性能差的原因

以flanel0为例,操作系统将一个IP包发给flanel0,flanel0把IP包发给创建这个设备的应用程序:flanel进程(内核态->用户态)

相反,flanel进程向flanel0发送一个IP包,IP包会出现在宿主机的网络栈中,然后根据宿主机的路由表进行下一步处理(用户态->内核态)

当IP包从容器经过docker0出现在宿主机,又根据路由表进入flanel0设备后,宿主机上的flanneld进程就会收到这个IP包

总结

可以看出flannel UDP模式提供了一个三层OverLay网络,这就好比在不同宿主机的容器上打通了一条隧道,容器不用关心IP地址即可直接通信。它首先对发出端的数据包进行UDP封装,然后在接收端进行解包,进而把包发送到目的容器地址。但是这里面有一个非常严重的问题,就是flannel UDP进程运行在用户态,而数据的交互和传递则在内核态完成,这就造成了为了传递数据,需要内核态和用户态的频繁切换,这个切换过程有一定性能损耗代价,所以UDP模式已经废弃。

Flannel VXLAN模式

VxLAN,即Virtual Extensible LAN(虚拟可扩展局域网),是Linux本身支持的一网种网络虚拟化技术。VxLAN可以完全在内核态实现封装和解封装工作,从而通过“隧道”机制,构建出 Overlay 网络(Overlay Network)。

Flannel host-gw模式

这是一种纯三层网络的方案,性能最高

如下图所示,node0和node1之间可以通过eth0互连,但container0和container2无法互连,如果想让它们之间能通信,可以怎么做呢?

container0和container2无法互连的原因在于:当container0发往container2的包(container2向container0发包也是类似的情况)经过eth0时,内核将查找route表规则,显然不能找到符合192.168.1.2/24(container2的ip)的规则,因此只能发往默认路由(一般是gateway网关),事实上gateway也不能找到符合192.168.1.2/24的规则,最终所有的路由器都不知道目标ip地址为192.168.1.2/24的包该发到哪个主机上。

知道这个原因后,你可能会想:如果在node0上创建一条route表规则,让目标地址为192.168.1.2/24的包全部发往node1,那不就解决问题了?是的,host-gw正是这样解决的:在node0上创建route表规则(ip route add 192.168.1.0/24 via 10.20.0.2 dev eth0,让目标地址为192.168.1.0/24的包全部发往node1,在node1上创建route表规则(ip route add 192.168.0.0/24 via 10.20.0.1 dev eth0),让目标地址为192.168.0.0/24的包全部发往node0,这样node0和node1上的conta iner就可以互相通信了。

问题

所有的主机都在一个子网内,即二层可达,否则就无法将目的主机当做网关,直接路由。

总结

总的来说,flannel更像是经典的桥接模式的扩展。我们知道,在桥接模式中,每台主机的容器都将使用一个默认的网段,容器与容器之间,主机与容器之间都能互相通信。要是,我们能手动配置每台主机的网段,使它们互不冲突。接着再想点办法,将目的地址为非本机容器的流量送到相应主机:如果 集群的主机都在一个子网内,就搞一条路由转发过去;若是不在一个子网内,就搞一条隧道转发过去。这样以来,容器的跨网络通信问题就解决了。而flannel做的,其实就是将这些工作自动化了而已。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

k8s跨主机网络方案之Flannel 的相关文章

随机推荐

  • 饭后笑资2

    6 你听过吗 前世500次 回眸才换得今生的擦肩一过 1000次回眸才有缘今生相视一笑 像咱们这样的朋友 上辈子没干别的 光他妈的回头了 7 一女在厕所小便 一 醉鬼酒后误入 听到哗哗尿声 忙说 别倒了 我真的不喝了 女吓坏了 不敢在 尿
  • 制造业如何做好数字化转型

    十四五 规划强调信息化和工业化深度融合 将制造业数字化转型行动列为重点工作 中国制造业经过数十年高速发展 拥有了世界最多的制造业500强品牌 但平均利润率仍大幅低于欧美发达国家 规模大利润低 想要拥有高溢价能力的核心竞争力 获得高质量发展
  • Qt: QDropEvent拖拽事件,拖拽打开文件

    参考文章 https blog csdn net rl529014 article details 53057577 locationNum 8 fps 1 参考链接 https www jianshu com p 48f007c2de09
  • java读取多个代码文件到txt文件

    读取目录下多个代码文件 并把内容写入到一个新的txt或者word package javawhl file import java io BufferedReader import java io BufferedWriter import
  • 跟这台计算机连接的一个USB设备运行不正常,Windows无法识别

    问题描述 用集线器 hub 连接电脑 android设备连接接线器 今天早上打开电脑和项目突然爆出错误 跟这台计算机连接的一个USB设备运行不正常 Windows无法识别 该设备已被禁用 原因是 设备的固件没有提供必需的资源 代码 29 重
  • 深度学习训练营之鸟类识别

    深度学习训练营之鸟类识别 原文链接 环境介绍 前置工作 设置GPU 导入数据并进行查找 数据处理 可视化数据 配置数据集 残差网络的介绍 构建残差网络 模型训练 开始编译 结果可视化 训练样本和测试样本 预测 原文链接 本文为 365天深度
  • 区间交叠问题

    区间交叠问题 问题描述 给定坐标轴上的一组线段 线段的起点和终点均为整数并且长度不小于1 请你从中找到最少数量的线段 这些线段可以覆盖住所有线段 输入描述 第一行输入为所有线段的数量 不超过10000 后面每行表示一条线段 格式为 x y
  • 利用response对象实现下载文件功能

    HttpServletResponse对象继承了ServletResponse接口 下面利用response对象实现下载的功能 单个文件的下载 package com dongmu servlet import javax servlet
  • 使用slice和concat对数组的深拷贝和浅拷贝

    一 数组浅拷贝 在使用JavaScript对数组进行操作的时候 我们经常需要将数组进行备份 如下代码 如果只是简单才用赋值的方法 那么我们只要更改其中的任何一个 然后其他的也会跟着改变 这就导致了问题的发生 var arr1 red yel
  • FastAdmin的一个小BUG,无法正常识别驼峰命名法的控制器名

    FastAdmin中内置了权限管理模块 在应用的过程中 控制器名经常会是两个单词 比如NotifyMessage 这是控制器名 在设置权限时 我们需要写成 notify message 可是这样设置后 会提示没有权限 而写成notifyme
  • PTA题选

    判断题 任何表达式语句都是表达式加分号组成的 True C语言语句都有结束符 指向结构体变量的指针可以作函数参数 实现传址调用 True 结构体成员的类型必须是基本数据类型 False if a 5 是允许的 True a 5 永远为真 假
  • 关于自定义标签报空指针异常:"at org.apache.jasper.compiler.TldCache.getTaglibXml(TldCache.java:97) "...

    tomcat8对相对路径路径的不是很好 可以在web xml文件中设置好tld的路径 然后JSP中直接 web xml文件添加以下配置
  • java面试题个人总结宝典1-java基础篇

    前言 前段时间换工作 用了5天时间整理了一大堆小白面试题 注 本人19年毕业 都是一些个人总结 希望能帮到有需要的人 如果你和我一样也是正准备踏入社会 或者工作还不到2年的 亦或是最近在找 java工程师 之类工作的 那我觉得这个系列非常适
  • Cpp学习——string模拟实现

    目录 一 string的成员变量 二 string的各项功能函数 1 构造函数 2 析构函数 3 扩容函数 4 插入与删除数据的函数 5 运算符重载 6 打印显示函数 7 拷贝构造 8 find函数 一 string的成员变量 在模拟实现s
  • 等保2.0 安全计算环境 ——Windows服务器(三级系统)

    1 身份鉴别 A 应对登录的用户进行身份标识和鉴别 身份标识具有唯一性 身份鉴别信息具有复杂度并要求定期更换 1 核查用户是否需要输入用户名和密码才能登录 2 核查Windows默认用户名是否具有唯一性 3 选择 控制面板 gt 管理工具
  • vscode中设置webpack js alias提示

    vscode 中设置 webpack alias 路径提示 1 根目录下创建 jsconfig json 文件 ts 中 把 文件修改为 tsconfig json 即可 2 添加如下配置 参考着 修改下配置即可 compilerOptio
  • Manjaro/Arch 软件配置安装

    记录一下自己配置 M a n j a r o A
  • 【论文阅读 07】Anomaly region detection and localization in metal surface inspection

    比较老的一篇论文 金属表面检测中的异常区域检测与定位 总结 提出了一个找模板图的方法 使用SIFT做特征提取 姿态估计看差异有哪些 Hough聚类做描述符筛选 仿射变换可视化匹配图之间的关系 提出一个搜索方法 降低图像分辨率 设定对比度和匹
  • kafka3.1集群部署

    kafka依赖zookeeper负责broker的注册 所以需要提前安装好zookeeper 1 安装zookeeper集群 https blog csdn net xiaohanshasha article details 1240083
  • k8s跨主机网络方案之Flannel

    什么是overlay network Overlay 技术是在现有的物理网络之上构建一个虚拟网络 上层应用只与虚拟网络相关 Overlay 在网络技术领域 指的是一种网络架构上叠加的虚拟化技术模式 其大体框架是对基础网络不进行大规模修改的条