flannel详细介绍

news2024/10/5 21:16:27

一、前言

    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.coloradmin.cn/o/1684938.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【OceanBase诊断调优】—— 直连普通租户时遇到报错:Tenant not in this server

本文介绍了直连 OceanBase 数据库中的普通租户时,出现报错:ERROR 5150 (HY000) : Tenant not in this server 的处理方法。 问题描述 在 n-n 或者 n-n-n (n>1) 的部署架构中,使用 2881 端口 直连 OceanBase 集群的普通租户,可…

Vue2基础及其进阶面试(一)

简单版项目初始化 新建一个vue2 官网文档:介绍 — Vue.js 先确保下载了vue的脚手架 npm install -g vue-cli npm install -g vue/cli --force vue -V 创建项目 vue create 自己起个名字 选择自己选择特性 选择: Babel:他可以将我们写…

华院计算 | 简单而复杂的“生命游戏”

人类是社会动物,而人类的社会活动则既简单又复杂。长期以来,数学家、计算机科学家和社会学家们一直试图用简单明了的方式方法去刻画错综复杂的社会现象,其中“生命游戏”提供了一个“寓科学于娱乐”的活动框架。 【一】导引 让我们先来玩一…

接口自动化测试Requests库实战超细详解

一、requests库 Requests is an elegant and simple HTTP library for Python, built for human beings. Requests库就是一个使用Python语言发送HTTP请求的一个类库。 github地址:GitHub - psf/requests: A simple, yet elegant, HTTP library. 中文地址&#xff…

【华为】将eNSP导入CRT,并解决不能敲Tab问题

华为】将eNSP导入CRT,并解决不能敲Tab问题 eNSP导入CRT打开eNSP,新建一个拓扑右键启动查看串口号关联CRT成功界面 SecureCRT连接华为模拟器ensp,Tab键不能补全问题选择Options(选项)-- Global Options (全局选项&#…

民国漫画杂志《时代漫画》第6期.PDF

时代漫画06.PDF: https://url03.ctfile.com/f/1779803-1247397790-72c351?p9586 (访问密码: 9586) 《时代漫画》的杂志在1934年诞生了,截止1937年6月战争来临被迫停刊共发行了39期。 ps:资源来源网络!

MySQL慢查询原因总结

文章目录 一.SQL没加索引二. SQL 索引不生效2.1 隐式的类型转换,索引失效2.2 查询条件包含or,可能导致索引失效2.3 like通配符可能导致索引失效2.4 查询条件不满足联合索引的最左匹配原则2.5 在索引列上使用mysql的内置函数2.6 对索引进行列运算&#xf…

低耦合双写一致性方案-使用canal+MQ

需求:继上一篇使用xxljob实现数据的全量同步到es后,当数据库中新增、删除、修改数据时,应该对es中的对应索引库实现增量同步。 本文介绍了2种双写一致性方案,对其中使用MQ的方案进行了实现。 1. 方案设计 1.1 数据一致性问题分析…

QT7_视频知识点笔记_5_线程,数据库

多线程 两种办法:第一种:Qt4.7之前的线程使用的方法(简单);第二种:Qt4.7之后的(灵活–推荐)----connect最后一个参数的作用:默认连接,队列连接,直…

vue3使用mitt.js进行各种组件间通信

我们在vue工程中,除开vue自带的什么父子间,祖孙间通信,还有一个非常方便的通信方式,类似Vue2.x 使用 EventBus 进行组件通信,而 Vue3.x 推荐使用 mitt.js。可以实现各个组件间的通信 优点:首先它足够小&…

从业务角度来看,DevOps 是什么?

如果您在我们的应用程序名称中看到“DevOps”,这意味着我们必须正确解释该术语,我们会这样做,但角度会有所不同。让我们从业务角度看看 DevOps 是什么。 通用名称 首先你应该知道,DevOps 没有明确的定义。是的。 大多数情况下&a…

分类和品牌关联

文章目录 1.数据库表设计1.多表关联设计2.创建表 2.使用renren-generator生成CRUD1.基本配置检查1.generator.properties2.application.yml 2.生成代码1.进入localhost:81生成代码2.将main目录覆盖sunliving-commodity模块的main目录 3.代码检查1.注释掉CategoryBrandRelationC…

使用xsd验证xml格式的正确性

1.1 基础知识介绍 XML简介:XML是可扩展标记语言(eXtensible Markup Language)的缩写,它是一种数据表示格式,可以描述非常复杂的数据结构,常用于传输和存储数据。xml文件、xml消息。XSD简介:是X…

JS对象超细

目录 一、对象是什么 1.对象声明语法 2.对象有属性和方法组成 二、对象的使用 1.对象的使用 (1)查 (2)改 (3)增 (4)删(了解) (5&#xf…

九州未来十二周年丨聚力同行,奔赴智能新未来

九州未来迎来十二周年! 从国内首批提供 OpenStack 云服务的专业公司, 经过十二年的发展, 现今成长为开放智能云边架构引领者。 在这十二年的时间中, 九州未来持续创新,步履不停, 打造成熟的云基础设施…

【软件测试】软件测试基础理论

目录 软件测试简介软件产生过程小结 主流测试掌握技能功能测试功能测试的注意事项 自动化测试自动化测试的优势自动化测试的限制和适用性:自动化测试的注意事项 接口测试接口测试通常可以涵盖以下方面接口测试的注意事项 性能测试性能测试的几个方面性能测试的注意事…

JavaSE:Clonable接口、浅拷贝与深拷贝

1、引言 我们在学习的数组时,就了解到了数组克隆方法,可以通过数组克隆方法来拷贝一个一模一样的数组: 那对于自定义类型中有没有克隆方法呢?答案是有的! 就让这篇文章来帮助大家学习自定义类型的拷贝! …

基于深度学习的表情识别系统

欢迎大家点赞、收藏、关注、评论啦 ,由于篇幅有限,只展示了部分核心代码。 文章目录 一项目简介 二、功能三、系统四. 总结 一项目简介 一、项目背景 随着人工智能技术的快速发展,表情识别成为了人机交互领域的一个研究热点。表情识别技术旨…

docker redis 持久化

1、拉取redis镜像 docker pull redis:latest 2、 mkdir /data/redis 3、填充redis.conf文件及根据需求修改相应的配置 •通过官网地址找到对应版本的配置文件 •将配置信息复制到redis.conf中 •常见的修改配置 https://redis.io/docs/latest/operate/oss_and_stack/managem…

K8s 高级调度

文章目录 K8s 高级调度CronJobinitContainerTaint 和 Toleration污点(Taint)容忍(Toleration) AffinityNodeAffinityPodAnffinity 和 PodAntiAffinity 总结 K8s 高级调度 CronJob 在 k8s 中周期性运行计划任务,与 li…