flannel详细介绍

一、前言

    Flannel 是一个简单、高效的容器网络解决方案,适用于需要在多个主机上运行容器的场景。它通过虚拟网络技术和 IP 地址管理来实现容器之间的通信和跨主机连接,为容器平台提供了可靠的网络基础设施,flannel有三种模式,分别是udp、vxlan、host-gw,每种模式的性能都不一样,下面就来介绍一下三种模式的性能以及原理

二、模式解析

讲解前先来了解一下veth pair,veth pair 是 Linux 内核中的一种网络设备,它由两个相互连接的虚拟网络接口组成。这两个接口成对出现,数据从一个接口进来,会从另一个接口出去。通常,一个接口连接到一个网络命名空间(如容器或 Pod),另一个接口连接到主机的网络命名空间或一个桥接设备(bridge),veth pair 只是简单地转发数据包,不进行任何网络层的处理,在k8s集群的节点中,每个节点都有一个cni0的虚拟网卡,这个就是veth pair网桥设备

udp

udp是flannel最早使用的一种模式,但是性能却是最差的,现已被弃用

1.在k8s集群中使用udp模式部署flannel时,会在所有节点生成一个flannel0的虚拟网卡,并且每个虚拟网卡会生成一个网段就是一个子网,而这个 flannel0 它是一个 TUN 设备,TUN 设备是一种工作在三层的虚拟网络设备,它的功能就是在操作系统内核和用户应用程序之间传递 IP 包,flannel会将所有节点的flannel0的网段信息与其对应的宿主机ip地址形成key-value对,并将key-value对存储到etcd集群中

这里使用node01的pod访问node02的pod的工作过程来说一下udp的原理,流程如下图所示

2.10.244.4.5容器访问10.244.3.5容器时会根据容器中的默认路由将数据包发送到cni0网桥中

3.网桥通过内核态中的路由表查询转发到flannel0中

4.flannel0会将这个数据包转给flannel进程,flannel进程通过该数据包目的地址的子网到etcd中查询,前面有说到集群创建新的节点时flannel会将所有节点的flannel0的网段信息与其对应的宿主机ip地址形成key-value对存储到etcd中,在etcd中通过子网地址查询到所属的node节点的地址

5.flannel就会用查询到的宿主机地址作为目的地址,本地地址作为源地址,并且用flannel端口作为目的端口将原ip包封装为一个udp包,并将udp包传递到内核态中,通过宿主机的网卡发送到目的宿主机的8285端口,即flannel进程的端口

6.node2宿主机的flannel进程接收到数据包后,就会拆解数据包,解析到ip包后将该包转发到flannel0,flannel0转发给内核态

7.内核态根据路由表转发到cni0网桥中

8.cni0网桥会查找数据包的目标ip地址,并确定该ip地址的端口记录,如果有,就从该端口发送数据包,如果没有记录就通过arp协议广播帧,得到应答后就能知道端口与ip的映射关系,从而将数据包发往该端口 

通过以上工作流程会发现期间存在多次的用户态和内核态之间的数据拷贝

1.容器进程发送ip包到cni0网桥进入内核态

2.flannel0将ip包发送到用户态的flannel进程

3.flannel进程将ip包封装为udp包后发送到宿主机网卡进入内核态

4.目的宿主机的网卡接收到udp包后发送到用户态的flannel进程

5.flannel进程接收udp包后拆包,将拆出的ip包发送到flannel0进入内核态

6.cni0将ip包发送到容器进程

其实用户空间和内核空间之间的上下文切换会增加处理数据包的延迟和系统开销,这也是udp性能差的主要原因,而且用户态封装包通常需要通过系统调用(如 sendto、recvfrom)将数据包传递给操作系统内核进行发送和接收

vxlan

VXLAN(Virtual Extensible LAN)是一种用于在现有网络基础设施上创建虚拟网络的隧道协议,用于在第2层网络上创建虚拟化的第2层网络(即虚拟局域网)。它通过将第2层以太网帧封装在第4层 UDP 数据包中,从而在第3层网络上进行传输

vxlan模式就是减少用户态的使用,将封装包和拆解包都在内核态上,从而优化性能,原理是通过一个大的二层网络将地址段覆盖,使其处于同一个子网内,然后再从这个大的子网下面分出小的子网

通过配置文件我们可以看到,flannel的子网是10.244.0.0/16

而每个节点的容器地址范围就处于10.244.1.0/24、10.244.2.0/24等这些网段中

在 Flannel 的 VXLAN 模式下,每个节点(主机)都会创建一个 VXLAN 隧道接口,用于在不同节点之间传输容器流量,即flannel.1也叫VTEP,VTEP的作用是将ip包封装成二层数据帧,然后再将二层数据帧加上vxlan的头,再加上目的地址封装为一个udp包,且还作为一个网桥,转发udp包到宿主机的网卡上

1.在k8s集群中使用vxlan模式部署flannel时,会在所有节点生成一个flannel.1的虚拟网卡,并且每个虚拟网卡会生成一个子网的IP地址,flannel会将每个节点的flannel.1的地址和mac地址信息发送到其它节点上存储,即ARP记录,同时每个节点将其余节点的宿主机地址与之对应的flannel.1的mac地址绑定存储在一个叫做FDB的转发数据库中

这里使用node01的pod访问node02的pod的工作过程来说一下vxlan的原理,流程如下图所示,实际上和udp的工作流程没太大区别,主要就是在flannel.1的区别上

2.10.244.4.5容器访问10.244.3.5容器时会根据容器中的默认路由将数据包发送到cni0网桥中

3.cni0网桥通过路由信息将ip包转发到flannel.1上,同时获知下一跳网关是10.244.3.0,这个网关就是对端vtep的地址

 4.我们知道flannel.1就是vtep,他的作用就是封装包,先通过下一跳的网关地址查询arp表获取对端vtep的mac地址,将ip包用获取到的对端vtep ip地址和mac地址封装成二层数据帧

5.二层数据帧不能直接转发到对端的vtep中,还需要在封装一层作为udp包,才可以用于转发,在封装udp包前,需要先加一个vxlan的头部信息,这样对端的node节点接收到数据包后,才知道这是一个vxlan的数据帧,在vxlan的头部信息中有一个重要的数据是vni,在flannel中vni的默认值是1,只有vni相同的网络才能解包,实际vni的值就是flannel.1中的1,封装为udp包还需要知道目的地址,这时就需要通过对端的vtep的mac地址到FDB转发数据库中查询,查询到目的地址后就可以封装为udp包

6.flannel.1作为网桥将udp数据包转发到宿主机网卡中,发送到对端宿主机中

7.对端宿主机的内核态接收到数据包后,发现有vxlan header以及vni标记是1,就将vxlan包发送到本机的vni也为1的flannel.1上

8.flannel.1进行解包,取出目的地址,然后根据路由表将数据包发送到cni0网桥中

9.cni0网桥会查找数据包的目标ip地址,并确定该ip地址的端口记录,如果有,就从该端口发送数据包,如果没有记录就通过arp协议广播帧,得到应答后就能知道端口与ip的映射关系,从而将数据包发往该端口 

通过以上工作流程可以发现,vxlan减少了在用户态上处理ip包的过程,封装包和拆解包都是在内核态中,减少了用户空间和内核空间之间的上下文切换从而大大提升了性能

host-gw

host-gw 模式是一种使用主机间的直接路由来实现容器网络通信的模式。它不依赖于封装技术(如 VXLAN),而是通过在每个主机上配置静态路由,使得每个节点可以直接将数据包发送到目标节点上的容器网络,即每个主机都作为网关,减少了包的封装和拆解,很大程度的优化了性能

host-gw 模式下,Flannel 使用路由表条目来确保不同主机上的容器能够互相通信,每个节点会被分配一个唯一的子网,容器的 IP 地址从这个子网中分配,Flannel 在每个节点上都配置到其余节点的静态路由,使得节点之间可以直接路由数据包,在大规模的集群中,路由表会很庞大

host-gw模式也有限制,就是集群中的所有节点都必须处于一个二层连通的环境中

1.在k8s集群中使用host-gw模式部署flannel时,flannel会将每个node节点的ip地址,以及分配的对应的容器子网,写入到etcd中存储,flannel取出其它节点的ip地址以及对应的容器子网以静态路由的方式写入到每个node节点的路由表中,将node节点的ip地址作为下一跳网关

这里使用node01的pod访问node02的pod的工作过程来说一下host-gw模式的原理,流程如下图所示,host-gw模式以node节点的ip地址作为网关直接使用了路由的方式

2.10.244.4.5容器访问10.244.3.5容器时会根据容器中的默认路由将数据包发送到cni0网桥中

3. cni网桥根据路由信息将数据包由宿主机网卡转发到对端主机中

 4.数据包来到node2主机的网卡上后,根据路由表转发到cni0上

5.cni0网桥会查找数据包的目标ip地址,并确定该ip地址的端口记录,如果有,就从该端口发送数据包,如果没有记录就通过arp协议广播帧,得到应答后就能知道端口与ip的映射关系,从而将数据包发往该端口 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/633318.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

sudo pip3 install rpi_ws281x error: externally-managed-environment

报错 error: externally-managed-environment piraspberrypi:~ $ sudo pip3 install rpi_ws281x error: externally-managed-environment This environment is externally managed ╰─> To install Python packages system-wide, try apt installpython3-xyz, where xyz i…

如何自建谷歌站点?

自建谷歌站点其实是一个相对简单的过程,主要是指创建一个能够被谷歌搜索引擎索引和搜索的网站 首先要做的自然就是选择一个域名,域名基本就相当于你的门牌号了,你得想一个既好记又能代表你网站内容的名字,注册域名可以去很多网站…

【Qt】之【Bug】C2001 常量中有换行符

分析 参考:Qt记录:Qt编程遇C2001错误,提示“常量中有换行符”_qt 常量中有换行符-CSDN博客 原因 字符串中有中文字符 :使用了中文标点符号! 解决 中文感叹号改为英文的

基于transformers框架实践Bert系列4-文本相似度

本系列用于Bert模型实践实际场景,分别包括分类器、命名实体识别、选择题、文本摘要等等。(关于Bert的结构和详细这里就不做讲解,但了解Bert的基本结构是做实践的基础,因此看本系列之前,最好了解一下transformers和Bert…

RisingWave 用户定义函数 (一) :概览

|作者:王润基 RisingWave Labs 内核开发工程师 用户定义函数(User Defined Function,以下简称 UDF)是数据系统中的常见功能。它允许用户使用各种语言定义自己的函数,作为内置函数的补充,以实现…

【前端】使用 Canvas 实现贪吃蛇小游戏

使用 Canvas 实现贪吃蛇小游戏 在这篇博客中,我们将介绍如何使用 HTML5 Canvas 和 JavaScript 实现一个简单的贪吃蛇(Snake)小游戏。这个项目是一个基础的游戏开发练习,它可以帮助你理解如何在 Canvas 上绘图、如何处理用户输入以…

【九十三】【算法分析与设计】719. 找出第 K 小的数对距离,N 台电脑的最长时间,二分答案法

719. 找出第 K 小的数对距离 - 力扣&#xff08;LeetCode&#xff09; 数对 (a,b) 由整数 a 和 b 组成&#xff0c;其数对距离定义为 a 和 b 的绝对差值。 给你一个整数数组 nums 和一个整数 k &#xff0c;数对由 nums[i] 和 nums[j] 组成且满足 0 < i < j < nums.le…

校园网拨号上网环境下多开虚拟机,实现宿主机与虚拟机互通,并访问外部网络

校园网某些登录客户端只允许同一时间一台设备登录&#xff0c;因此必须使用NAT模式共享宿主机的真实IP&#xff0c;相当于访问外网时只使用宿主机IP&#xff0c;此方式通过虚拟网卡与物理网卡之间的数据转发实现访问外网及互通 经验证&#xff0c;将centos的物理地址与主机物理…

UMPNet: Universal Manipulation Policy Network for Articulated Objects

1. 摘要 UMPNet是一个基于图像的策略网络&#xff0c;能够推理用于操纵铰接物体的闭环动作序列。该策略支持6DoF动作表示和可变长度轨迹。 为处理多种类的物体&#xff0c;该策略从不同的铰接结构中学习&#xff0c;并泛化到未见过的物体或类别上。该策略是以自监督探索的方式…

利用Python队列生产者消费者模式构建高效爬虫

目录 一、引言 二、生产者消费者模式概述 三、Python中的队列实现 四、生产者消费者模式在爬虫中的应用 五、实例分析 生产者类&#xff08;Producer&#xff09; 消费者类&#xff08;Consumer&#xff09; 主程序 六、总结 一、引言 随着互联网的发展&#xff0c;信…

css使用clip-path裁剪出不规则图形并绑定点击事件

点击图片的红色区域触发事件 点击图片黑色不触发点击事件&#xff0c;代码演示效果如下&#xff1a; 代码演示效果 1.png&#xff08;尺寸 200*470&#xff09; <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><…

2025第十届美陈展

展位又遭疯抢&#xff01;2025第十届美陈展释放“无界之美” 美是全球通用的语言&#xff0c;人类对美的追求始终如一&#xff0c;大众审美在经历了时代的变迁后开始趋同&#xff0c;东方文明深处的美学经济开始崛起。 在如今商业迈入存量阶段&#xff0c;以品牌为突破口打造…

抽象工厂模式(AbstractFactoryPattern)

文章目录 1.抽象工厂模式定义2.UML类图3.抽象工厂模式具体实现工厂模式实现单一产品族抽象工厂实现多产品族产品类工厂类使用 4.抽象工厂模式优缺点 1.抽象工厂模式定义 提供一个创建一系列相关或相互依赖对象的接口&#xff0c;而无需指定它们具体的类。 工厂方法模式是单一产…

JavaScript-运算符

算术运算符 返回结果为数字型的运算符 加法运算符 加法运算符&#xff08;&#xff09;是一个二元运算符&#xff0c;可以对两个数字型的操作数进行相加运算&#xff0c;返回值是两个操作数的和 减法运算符 减法运算符&#xff08;-&#xff09;是一个二元运算符&#xff0c;可…

banner2.0自定义轮播布局

说明&#xff1a;最近碰到一个需求&#xff0c;让新闻列表实现轮播图的效果&#xff0c;也就是轮播新闻&#xff0c;然后样式必须按照ui设计的样式来弄&#xff0c;之前传统的banner&#xff0c;都是只轮播图片&#xff0c;没想到&#xff0c;这次居然要轮播新闻&#xff0c; 网…

【深度学习】YOLOv8训练,交通灯目标检测

文章目录 一、数据处理二、环境三、训练 一、数据处理 import traceback import xml.etree.ElementTree as ET import os import shutil import random import cv2 import numpy as np from tqdm import tqdmdef convert_annotation_to_list(xml_filepath, size_width, size_he…

java+ vue.js+uniapp一款基于云计算技术的企业级生产管理系统,云MES源码 MES系统如何与ERP系统集成?

java vue.jsuniapp一款基于云计算技术的企业级生产管理系统&#xff0c;云MES源码&#xff0c;MES系统如何与ERP系统集成&#xff1f; MES系统&#xff08;制造执行系统&#xff09;与ERP系统&#xff08;企业资源规划系统&#xff09;的集成可以通过多种方式实现&#xff0c;这…

【git】开发提交规范(feat、fix、perf)

这段时间收到的需求很多&#xff0c;可能是临近两周一次的大版本灰度上线&#xff0c;这次产生了一个关于git的思考&#xff0c;就是各个版本之间怎么管理的问题&#xff0c;这里做出我自己的一些方法。 首先&#xff0c;既然已经明确了remote分支中的release分支为主分支&…

Java中transient关键字

transient介绍 在Java中&#xff0c;transient是一个关键字&#xff0c;用于声明一个字段在序列化过程中应该被忽略。当一个对象被序列化时&#xff0c;它的状态&#xff08;即其字段的值&#xff09;通常会被保存到字节流中&#xff0c;以便稍后可以反序列化恢复对象的状态。…

如何使用Matlab进行三角剖分(自定义函数实现delaunayTriangulation 使用Bowyer-Watson 算法)

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 目录 前言 一、Delaunay三角形 二、使用步骤 1.Bowyer-Watson算法 2.算法步骤 三、动画演示 四、核心代码 五、对比matlab自带函数和我们的算法&#xff1a; 总结 前…