【kubernetes系列】flannel之vxlan模式原理

news2024/11/21 2:29:56

概述

在Kubernetes中要保证容器之间网络互通,网络至关重要。而Kubernetes本身并没有自己实现容器网络,而是而是借助CNI标准,通过插件化的方式自由接入进来。在容器网络接入进来需要满足如下基本原则:

  • Pod无论运行在任何节点都可以互相直接通信,而不需要借助NAT地址转换实现。
  • Node与Pod可以互相通信,在不限制的前提下,Pod可以访问任意网络。
  • Pod拥有独立的网络栈,Pod看到自己的地址和外部看见的地址应该是一样的,并且同个Pod内所有的容器共享同个网络栈。

kubernetes中的网络通信

kubernetes中的网络通信大致分为以下几种:

  • Pod内容器间的通信(lo)
  • Pod之间的通信 pod IP <—–> pod IP(flannel、calico)
  • Pod与Service之间的通信 podIP <—–> ClusterIP(iptables、ipvs)
  • Service与集群外部的通信 ClusterIP <—–> 集群外部

常见的CNI插件:

  • flannel
  • calico
  • canel

Flannel

Flannel是CoreOS开源的,Overlay模式的CNI网络插件,Flannel在每个集群节点上运行一个flanneld的代理守护服务,为每个集群节点(host)分配一个子网(subnet),同时为节点上的容器组(pod)分配IP,在整个集群节点间构建一个虚拟的网络,实现集群内部跨节点通信。Flannel的数据包在集群节点间转发是由backend实现的,目前,已经支持核心官方推荐的模式有UDP、VXLAN、HOST-GW,以及扩展试用实验的模式有IPIP,AWS VPC、GCE、Ali VPC、Tencent VPC等路由,其中vxlan模式在实际的生产中使用最多,下面以vxlan模式为例。
在这里插入图片描述

从图里看每个宿主机都有一个flannel1(flannel.1)的设备,就是VXLAN所需的VTEP设备(flannel1“用于VXLAN报文的封装和解封装”),它既有IP地址也有MAC地址。如现在container1 访问 container2,当container1发出请求后,这个目的的地址是10.244.1.3的IP包,会先出现在cni0网桥,然后被路由到本机flanner1设备上处理,也就是说,来到了“隧道”的出口。既目的宿主机的VTEP设备(就是flannel1 设备)。
margu
当所有Node启动后,我们可以在k8s-m2上可以看到多个flannel1 网卡的路由信息,是因为flanneld启动后创建的。

[root@k8s-m2 ~]# ifconfig  flannel.1
flannel.1: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1450
        inet 10.244.0.0  netmask 255.255.255.255  broadcast 0.0.0.0
        ether 96:69:e2:7d:bd:32  txqueuelen 0  (Ethernet)
        RX packets 10177  bytes 977133 (954.2 KiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 10177  bytes 1787417 (1.7 MiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

[root@k8s-m2 ~]# route -n
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
0.0.0.0         192.168.2.254   0.0.0.0         UG    0      0        0 ens32
10.244.0.0      0.0.0.0         255.255.255.0   U     0      0        0 cni0
10.244.1.0      10.244.1.0      255.255.255.0   UG    0      0        0 flannel.1
10.244.2.0      10.244.2.0      255.255.255.0   UG    0      0        0 flannel.1
169.254.0.0     0.0.0.0         255.255.0.0     U     1002   0        0 ens32
172.17.0.0      0.0.0.0         255.255.0.0     U     0      0        0 docker0
192.168.2.0     0.0.0.0         255.255.255.0   U     0      0        0 ens32

从上图看到10.244.1.0就是k8s-m3的VTEP设备(flannel1)的IP地址,而这些VTEP设备之间通讯就需要想办法组成一个虚拟的二层网络,既:通过二层数据帧进行通信,而k8s-m2上的VTEP设备在收到原始报文后,就要想办法把原始报文加一个目的MAC地址,封装成二层数据帧,然后发送给目的VTEP设备。这里需要解决一个问题目的VTEP设备的MAC地址是什么?

根据路由表信息我们知道了目的VTEP设备的IP地址,而根据三层IP地址查询二层MAC地址正是ARP表的功能。而这里用ARP表的记录,也就是flanneld进程在Node2节点启动时,自动添加到Node1上的。如下:

$ ip neigh show dev flannel.1
10.244.1.0 lladdr e6:05:f1:5f:d7:13 PERMANENT
10.244.2.0 lladdr 46:1b:96:8c:b0:cf PERMANENT

有了这个MAC地址linux内核就可以开始二层封装了,上面提到的MAC地址,对宿主机的二层网络没有任何意义,所以上述封装的数据帧不能在宿主机的二层网络里传输,为了方便概述,我们把上述数据帧称为内部数据帧。所以Linux内核还要把内部数据帧进一步封装成宿主机网络的一个普通数据帧,好让它载着内部数据帧,通过外网网卡(如eth0 、ens33等)进行传输。这次封装我们称为外部数据帧,为了实现这个搭便车的机制,Linux内核在封装内部数据帧前面,加上特殊的VXLAN头,用来表示这个乘客实际上是VXLAN使用的数据帧。而这个VXLAN头里有一个重要的标志VNI,它是识别某个数据帧是不是应该归属自己处理的标志。而flannel中,VNI的值是1,这也是为什么宿主机的VTEP设备都叫做flannel1的原因。这个时候linux内核会把这数据帧封装一个UDP报文在转发出去。虽然k8s-m2的flannel1知道k8s-m3的flannel1的MAC地址,但是不知道k8s-m3对外网卡的MAC的地址,也就是UDP该发往那台主机,实际上flannel1还要扮演一个网桥的角色,在二层网络进行UDP转发,而在Linux内核里面,网桥设备进行转发的依据来自FDB的转发数据库。这个flannel网桥对应的FDB信息,就是flannel进程维护的,他的内容如下:

$  bridge fdb show flannel.1|grep  46:1b:96:8c:b0:cf
46:1b:96:8c:b0:cf dev flannel.1 dst 192.168.2.140 self permanent

我们可以看到发往的IP地址是192.168.2.142的主机,显然这台主机就是 k8s-m3,UDP要转发的目的也找到了。接下来就是宿主机网络封包的过程了。
在这里插入图片描述

下面让我们来看看,当有一个EventAdded到来时,flanneld如何进行配置,以及封包是如何在flannel网络中流动的。
在这里插入图片描述

借用上图所示,当主机B启动了一个flanneld的服务后,将从etcd中读取配置信息,并请求获取子网的租约。所有Node上的flanneld都依赖etcd cluster来做集中配置服务,etcd保证了所有node上flanned所看到的配置是一致的。同时每个node上的flanned监听etcd上的数据变化,实时感知集群中node的变化。flanneld一旦获取子网租约、配置后端后,会将一些信息写入/run/flannel/subnet.env文件。它会将自己的subnet 10.1.16.0/24和Public IP 192.168.0.101写入etcd中,它还会将vtep设备flannel.1的mac地址也写入etcd中。

之后,主机A会得到EventAdded事件,并从中获取主机B添加至etcd的各种信息。这个时候,它会在本机上添加三条信息:

  • 路由信息:所有通往目的地址10.1.16.0/24的封包都通过vtep设备flannel.1设备发出,发往的网关地址为10.1.16.0,即主机B中的flannel.1设备。
$ ip route list
...
10.1.16.0/24 via 10.1.16.0 dev flannel.1 onlink
...
  • fdb信息:MAC地址为flannel的mac地址,发往10.1.16.0的数据包都将通过vxlan首先发往目的地址192.168.0.101,即主机B
$ ip neigh show dev flannel.1
10.1.16.0 lladdr 46:1b:96:8c:b0:cf PERMANENT

$  bridge fdb show flannel.1  | grep46:1b:96:8c:b0:cf
46:1b:96:8c:b0:cf dev flannel.1 dst 192.168.0.101 self permanent
  • arp信息:网关地址10.1.16.0的MAC地址为flannel的mac地址
[root@k8s-m2 ~]# arp -v
Address                  HWtype  HWaddress           Flags Mask            Iface
....
10.1.16.0               ether   46:1b:96:8c:b0:cf   CM                    flannel.1
....

参数说明:

  • Network flannel使用CIDR格式(10.244.0.0/16)的网络地址,用于为pod的配置网络功能
  • SubnetLen表示每个主机分配的subnet大小,我们可以在初始化时对其指定,否则使用默认配置。在默认配置的情况下SubnetLen配置为24(表示24位子网掩码)。
  • SubnetMin是集群网络地址空间中最小的可分配的subnet,可以手动指定,否则默认配置为集群网络地址空间中第一个可分配的subnet。例如对于”10.244.0.0/16″,当SubnetLen为24时,第一个可分配的subnet为”10.244.1.0/24″
  • SubnetMax表示最大可分配的subnet,对于”10.244.0.0/16″,当subnetLen为24时,SubnetMax为”10.244.255.0/24″
  • Backend.Type 为flannel指定使用的backend的类型,类型分三种:vxlan、host-gw、udp,如未指定,则默认为“vxlan”
  • –ip-masq=true 为网桥上的IP地址开启IP伪装(代表需要为其配置SNAT)
    注意:Backend为vxlan时,其中会存储vtep设备的mac地址至etcd中

更多关于kubernetes的知识分享,请前往博客主页。编写过程中,难免出现差错,敬请指出

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

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

相关文章

【Ubuntu18.04安装FileZilla】

Ubuntu18.04安装FileZilla 1 FileZilla简介2 安装方式3 使用方式3.1 连接FTP服务器3.1.1 快速连接3.1.2 通过站点管理器 1 FileZilla简介 FileZilla是自由开源、快速、可信赖的FTP客户端以及服务器端应用&#xff0c;具有多种特色、直观的接口。 特点&#xff1a;可控性、有条…

flutter android Webview 打开网页错误ERR_CLEARTEXT_NOT_PERMITTED 、 net:ERR_CACHE_MISS

当你在Flutter应用中尝试打开一个非安全连接的网页&#xff08;例如HTTP连接而不是HTTPS连接&#xff09;时&#xff0c;可能会遇到"ERR_CLEARTEXT_NOT_PERMITTED"错误。这是因为默认情况下&#xff0c;Android 9及更高版本禁止应用程序通过非安全的明文HTTP连接进行…

Lombok 使用教程

lombok 官网 Project Lombok 课程目标: 什么是lombok lombok的原理 lombok的常用注解 lombok的安装 引言 还记得刚刚接触java,学习面向对象时因为手写get,set,hashcode,equals等方法的痛苦吗? 还记得后来上手了Eclipse或Idea这样工具可以快速生成get,set等相关方法的兴奋吗? …

【如何训练一个中译英翻译器】LSTM机器翻译模型部署之ncnn(python)(五)

系列文章 【如何训练一个中译英翻译器】LSTM机器翻译seq2seq字符编码&#xff08;一&#xff09; 【如何训练一个中译英翻译器】LSTM机器翻译模型训练与保存&#xff08;二&#xff09; 【如何训练一个中译英翻译器】LSTM机器翻译模型部署&#xff08;三&#xff09; 【如何训…

数据结构和算法——桶排序和基数排序(图示、伪代码、多关键字排序,基数排序代码)

目录 桶排序 图示 伪代码 时间复杂度 基数排序 多关键字排序 代码&#xff08;C语言&#xff09; 次位优先 主位优先 桶排序 假设有N个学生&#xff0c;他们的成绩是0到100之间的整数&#xff08;于是有M101个不同的成绩值&#xff09;。如何在线性时间内将学生按成绩…

什么是在线帮助中心?

随着企业越来越注重客户体验和服务质量&#xff0c;建立一个完善的在线帮助中心已经成为企业不可或缺的一部分。在线帮助中心可以帮助客户解决各种问题&#xff0c;从而提升客户满意度和忠诚度。而Baklib作为一款优雅的云知识库构建平台&#xff0c;提供了一种简单高效的方式来…

网页聊天室项目性能测试报告

文章目录 一 概述二 测试环境三 测试内容及方法四 GUI测试步骤五 简单数据写入器 HTML报告DashBoard六 结果分析七 性能优化方案 一 概述 1.1 目的 本测试报告为网页聊天室的性能测试报告&#xff0c;目的在于总结性能测试阶段的学习以及分析测试结果&#xff0c;描述网站是否…

创建线程的两种方式

一、线程相关概念 程序&#xff1a;完成特定任务&#xff0c;用某种语言编写的一组指令的集合。进程&#xff1a;运行起来的程序就是进程。进程运行时&#xff0c;操作系统需要为该进程分配内存空间。进程是一个动态过程&#xff0c;有产生、存在和消亡的过程。线程&#xff1…

osg earth中加载标签并设置文字 以及使用注意事项

osgearth中加载标签并设置文字 //头文件 #include <osgEarthAnnotation/PlaceNode> #include <osgEarthSymbology/Style> #include <osgEarth/MapNode> osgEarth::GeoPoint position(m_mapnode->getMapSRS(), lon, lat, 0, osgEarth::AltitudeMode::ALTM…

数据驱动商业合作:企业联系方式查询API在市场中的角色与作用

摘要 在当今数字化商业环境中&#xff0c;企业间的商务合作和合作伙伴关系构建变得更加重要。为了有效推进商业拓展和建立持久合作&#xff0c;企业需要快速、准确地获取潜在合作伙伴的联系方式。本文将深入探讨企业联系方式查询 API 在市场中的角色与作用&#xff0c;以及它如…

JetBrains全家桶:如何自定义实现类TODO注释?

文章目录 效果图具体方法参考文献 效果图 TODO注释大家应该都用过&#xff0c;在注释开头打上TODO的话&#xff0c;软件下方的TODO选项卡里就可以自动筛选出你打了TODO的注释&#xff0c;你可以点击里面对应的注释来实现快速跳转。 jetbrains全家桶&#xff08;如Pycharm、Int…

LKT(LCS)系列IIC接口加密芯片

调试常见问题&#xff08;一&#xff09; 1.加密芯片的数据交互协议是什么格式&#xff1f; 发送时&#xff1a;地址两字节数据长度&#xff08;后续数据的长度&#xff09;后续数据内容。Eg.50 0005 0084000008。接收时&#xff1a;地址两字节数据长度&#xff08;后续数据的…

万字长文详解Webpack5高级优化

本文从 4 个角度对 webpack 和代码进行了优化&#xff1a; 1.提升开发体验 使用 Source Map 让开发或上线时代码报错能有更加准确的错误提示。 2.提升打包构建速度 使用 HotModuleReplacement 让开发时只重新编译打包更新变化了的代码&#xff0c;不变的代码使用缓存&#xff…

Github Flow工作流简单介绍(以部署为中心的开发模式)

前言 这篇文章主要介绍Github Flow的理念&#xff0c;以下内容来源于《Github入门与实践》。 Github Flow是以部署为中心的开发模式&#xff0c;通过简单的规则&#xff0c;持续高速且安全地进行部署。而Gitflow则是以发布为中心的分支管理模型&#xff0c;它提供了一种更灵活…

【Docker】Docker容器编排

目录 一、Docker Compose1.2Docker Compose 环境安装1.3 YAML 文件格式及编写注意事项2.3 Docker Compose配置常用字段2.4 Docker Compose 常用命令 二、Docker Compose实验2.1编写Nginx的Dockerfile脚本2.2编写MySQL&#xff0c;Dockerfile脚本2.3编写PHP&#xff0c;Dockerfi…

QT样式表qss中的长度单位px/pt/%/em/ex/mm/in等

以下是从CSS里抄来的。QSS只能支持其中一部分。 1、px&#xff1a;像素(Pixel),相对于设备的长度单位&#xff0c;像素是相对于显示器屏幕分辨率而言的。譬如&#xff0c;WONDOWS的用户所使用的分辨率一般是96像素/英寸。而MAC的用户所使用的分辨率一般是72像素/英寸。 像素&a…

在培训班里学IT技术是否有用?和大家分享相关IT培训班里五大常见宣传手法、相关优势与实际效果

目录 Introduction 引言IT培训班常见宣传手法培训班的优势如何评判IT培训班的效果与质量除IT培训班之外的学习渠道总结其它资料下载 Introduction 引言 随着信息技术的飞速发展&#xff0c;学习IT技术成为许多人追求职业发展和个人兴趣的重要途径。从软件开发、数据科学到人工…

OpenAI Code Interpreter 的开源实现:GPT Code UI

本篇文章聊聊 OpenAI Code Interpreter 的一众开源实现方案中&#xff0c;获得较多支持者&#xff0c;但暂时还比较早期的项目&#xff1a;GPT Code UI。 写在前面 这篇文章本该更早的时候发布&#xff0c;但是 LLaMA2 发布后实在心痒难忍&#xff0c;于是就拖了一阵。结合 L…

插件使用权限管理软件(一)框架选择和Furion框架搭建

项目背景 软件主要服务于传统设计院&#xff0c;用于管理和监控设计院内部插件的使用权限和使用情况。可根据使用的频率来对插件使用情况的分析。后续可以加上错误报告等提测报告&#xff0c;使整个监控插件使用情况更加流程化。由于博主主要做CAD和Revit的二次开发工作&#x…

【力扣每日一题】2023.7.25 将数组和减半的最少操作次数

目录 题目&#xff1a; 示例&#xff1a; 分析&#xff1a; 代码运行结果&#xff1a; 题目&#xff1a; 示例&#xff1a; 分析&#xff1a; 题目给我们一个数组&#xff0c;我们每次可以将任意一个元素减半&#xff0c;问我们操作几次之后才可以将整个数组的和减半&…