flannel 实战与源码分析(二)

2024-05-10 18:08
文章标签 分析 实战 源码 flannel

本文主要是介绍flannel 实战与源码分析(二),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

上一篇介绍了基本使用,这一篇我想详细介绍一下flannel网络包的是怎样传输的,应为这些基本东西没有解释清楚,只看代码是没法理解的。先看看一张经典图:
这里写图片描述
这个是flannel官方提供的一个数据包图,从这个图片里面里面可以看出docker0分别处于不同的段:10.1.20.1/24 和 10.1.15.1/24 现在从上面的一个pod(10.1.15.2)去连接另一台主机上的pod(10.1.20.3),网络包从宿主机192.168.0.100发往192.168.0.200时,数据包被封装到UDP里面,并且在外边包装了宿主机的IP和mac地址。这就是一个经典的overlay网络,应为容器的IP是一个内容IP,无法从跨宿主机通信,所以容器的网络互通,需要承载到宿主机的网络之上。介绍完网络包的结构后,再深入看看网络包是怎样一步一步封装的。下面根据我自己的测试环境来讲解
这里写图片描述
上面的截图是我自己的环境,现在容器从192.168.52.2->192.168.90.8发送ping请求。从路由分析192.168.0.0/16的流量都交给flannel.1处理,这是一个vlan的的tun设备,现在要解决两个问题网络才能通,第一个是90.8这个IP在哪里?它的mac地址是多少?第二个问题是如果vxlan的数据包已经组装好了,要发送到哪一台宿主机上面的tun设备呢?带着疑问我们深入看看
先看这个配置

cat /proc/sys/net/ipv4/neigh/flannel.1/app_solicit
3

ARP将首先试着询问本地arp进程app_solicit次,获取更新了的MAC(介质访问控制)地址。如果失败,并且旧的MAC地址是已知的,则发送 ucast_solicit 次的 unicast probe。如果仍然失败,则将向网络广播一个新的ARP请求,此时要有待发送数据的队列。这里可以看到flannel会监听内核发出的L3 MISS请求,fannel从etcd里面可以获取到90.8这个目的ip所在主机的宿主机地址和对方fannel.1的mac地址,并写到本地邻接表中,

ip n
192.168.90.8 dev flannel.1 lladdr 02:e6:a9:31:4c:fa STALE

这个是已经过期(STALE)的当在容器里面ping 90.8后

 ip n
192.168.90.8 dev flannel.1 lladdr 02:e6:a9:31:4c:fa REACHABLE

这个里面又重新变成可到(REACHABLE)这个就是flannel通过etcd获取并写入的。相同的原理,当封装最外层UDP数据包时,需要对方宿主机的地址,那么怎么知道4c:fa这个flannel在那台宿主机上呢?

bridge fdb show dev flannel.1
02:e6:a9:31:4c:fa dst 10.39.0.7 self permanent

这个规则的下发也是依赖flannel和etcd,通过事件监听去更新这个转发表。那么这个数据包就发到slave2上面了,在slave2上面flannel.1进行拆包,通过路由进入docker0从而到达90.8这个容器。这是vxlan模式,其实flannel还支持别的模式常用的是UPD,它是直接封装到udp,没有vxlan的封装,这种网络模式损耗非常大50%左右,即便是vxlan也有30%左右的损耗,如果允许的话host-gw是个很好的选择,它也是通过路由的方式,类似于calico,但不使用BGP罢了。这种网络损耗最少,建议使用。在扩展一下,上面几种都是flannel,现在4.2内核加入的ipvlan性能应该是最好的,本质上是一个网卡多个IP。
在slave2上就可以抓取数据包了,先看宿主机

tcpdump -vvv -i eth0 |grep 10.39.0.17
tcpdump: listening on eth0, link-type EN10MB (Ethernet), capture size 65535 bytes10.39.0.17.53091 > slave2.otv: [no cksum] OTV, flags [I] (0x08), overlay 0, instance 1slave2.46050 > 10.39.0.17.otv: [no cksum] OTV, flags [I] (0x08), overlay 0, instance 110.39.0.17.53091 > slave2.otv: [no cksum] OTV, flags [I] (0x08), overlay 0, instance 1slave2.46050 > 10.39.0.17.otv: [no cksum] OTV, flags [I] (0x08), overlay 0, instance 110.39.0.17.53091 > slave2.otv: [no cksum] OTV, flags [I] (0x08), overlay 0, instance 1slave2.46050 > 10.39.0.17.otv: [no cksum] OTV, flags [I] (0x08), overlay 0, instance 1

可以看到从slave1到slave2上发送的数据包,并且是overlay。再看看flannel.1上的
从容器的192.168.69.2 ping 192.168.49.2
这里写图片描述
外层是宿主机的IP和mac,内层IP是容器的IP,但源mac和目的mac分别是宿主机上面flannel.1(vtep设备的)的mac,这点一定要注意。

这篇关于flannel 实战与源码分析(二)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/977168

相关文章

从基础到高阶详解Python多态实战应用指南

《从基础到高阶详解Python多态实战应用指南》这篇文章主要从基础到高阶为大家详细介绍Python中多态的相关应用与技巧,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录一、多态的本质:python的“鸭子类型”哲学二、多态的三大实战场景场景1:数据处理管道——统一处理不同数据格式

Android 缓存日志Logcat导出与分析最佳实践

《Android缓存日志Logcat导出与分析最佳实践》本文全面介绍AndroidLogcat缓存日志的导出与分析方法,涵盖按进程、缓冲区类型及日志级别过滤,自动化工具使用,常见问题解决方案和最佳实... 目录android 缓存日志(Logcat)导出与分析全攻略为什么要导出缓存日志?按需过滤导出1. 按

Java慢查询排查与性能调优完整实战指南

《Java慢查询排查与性能调优完整实战指南》Java调优是一个广泛的话题,它涵盖了代码优化、内存管理、并发处理等多个方面,:本文主要介绍Java慢查询排查与性能调优的相关资料,文中通过代码介绍的非... 目录1. 事故全景:从告警到定位1.1 事故时间线1.2 关键指标异常1.3 排查工具链2. 深度剖析:

Linux中的HTTPS协议原理分析

《Linux中的HTTPS协议原理分析》文章解释了HTTPS的必要性:HTTP明文传输易被篡改和劫持,HTTPS通过非对称加密协商对称密钥、CA证书认证和混合加密机制,有效防范中间人攻击,保障通信安全... 目录一、什么是加密和解密?二、为什么需要加密?三、常见的加密方式3.1 对称加密3.2非对称加密四、

MySQL中读写分离方案对比分析与选型建议

《MySQL中读写分离方案对比分析与选型建议》MySQL读写分离是提升数据库可用性和性能的常见手段,本文将围绕现实生产环境中常见的几种读写分离模式进行系统对比,希望对大家有所帮助... 目录一、问题背景介绍二、多种解决方案对比2.1 原生mysql主从复制2.2 Proxy层中间件:ProxySQL2.3

Python实现Word转PDF全攻略(从入门到实战)

《Python实现Word转PDF全攻略(从入门到实战)》在数字化办公场景中,Word文档的跨平台兼容性始终是个难题,而PDF格式凭借所见即所得的特性,已成为文档分发和归档的标准格式,下面小编就来和大... 目录一、为什么需要python处理Word转PDF?二、主流转换方案对比三、五套实战方案详解方案1:

SpringBoot实现RSA+AES自动接口解密的实战指南

《SpringBoot实现RSA+AES自动接口解密的实战指南》在当今数据泄露频发的网络环境中,接口安全已成为开发者不可忽视的核心议题,RSA+AES混合加密方案因其安全性高、性能优越而被广泛采用,本... 目录一、项目依赖与环境准备1.1 Maven依赖配置1.2 密钥生成与配置二、加密工具类实现2.1

Nginx进行平滑升级的实战指南(不中断服务版本更新)

《Nginx进行平滑升级的实战指南(不中断服务版本更新)》Nginx的平滑升级(也称为热升级)是一种在不停止服务的情况下更新Nginx版本或添加模块的方法,这种升级方式确保了服务的高可用性,避免了因升... 目录一.下载并编译新版Nginx1.下载解压2.编译二.替换可执行文件,并平滑升级1.替换可执行文件

python使用Akshare与Streamlit实现股票估值分析教程(图文代码)

《python使用Akshare与Streamlit实现股票估值分析教程(图文代码)》入职测试中的一道题,要求:从Akshare下载某一个股票近十年的财务报表包括,资产负债表,利润表,现金流量表,保存... 目录一、前言二、核心知识点梳理1、Akshare数据获取2、Pandas数据处理3、Matplotl

精选20个好玩又实用的的Python实战项目(有图文代码)

《精选20个好玩又实用的的Python实战项目(有图文代码)》文章介绍了20个实用Python项目,涵盖游戏开发、工具应用、图像处理、机器学习等,使用Tkinter、PIL、OpenCV、Kivy等库... 目录① 猜字游戏② 闹钟③ 骰子模拟器④ 二维码⑤ 语言检测⑥ 加密和解密⑦ URL缩短⑧ 音乐播放