Kubernetes 常用的网络插件
上篇内容跟大家简单聊了k8s网络模型原理。分别围绕着容器、Pod、Service、网络策略等展开了详细的讲解。这次想跟大家聊聊k8s的CNI网络插件。
CNI 是 Kubernetes 网络模型的核心组件,它是一个插件接口,允许用户选择和配置网络插件来管理 Pod 的网络。CNI 插件提供了网络连接、IP 地址分配、路由控制等基本功能。
常见的 CNI 插件包括:
Flannel:用于实现简单的网络隧道。
Calico:支持网络策略、跨节点网络路由等功能。
Weave:简化的网络配置,支持跨节点通信。
Cilium:基于 eBPF 技术的高性能网络插件,支持深度安全控制。
接触过K8S的同学,大致都听说过Flannel和Calico两种网络模型。这里就我们主要讲解Flannel和Calico的工作模式和原理。
一、Flannel
Flannel 是一个简单的网络插件,设计目的是为 Kubernetes 提供一个易于部署和配置的网络解决方案。它的目标是简化网络设置,适合那些对网络复杂度要求不高的 Kubernetes 集群。Flannel 基本上是一个 Overlay 网络 解决方案,它在每个节点上创建一个虚拟网络,并通过隧道技术(如 VXLAN、UDP、Host-GW)来实现跨节点的 Pod 网络通信。
-
UDP
-
VXLAN
-
Host-gw
1.1 flannel-udp
UPD模式Flannel最早实现的一种方式,也是性能最差的,目前已被弃用。但是这种方式也是最直接,最容易理解的方式,所以我们从这种方式开始介绍。

上图是Flannel-UDP模式的原理图。flannel0设备是一个TUN设备,它的作用非常简单,就是在系统内核和用户应用程序之间传包;flanneld进程的职责,就是封装和解封装。数据包是如何从Node1中的container-1容器发送到Node2的container-2容器的呢?
1.数据包从container-1,来到了网桥docker0上,由于数据包的目的地址不属于网桥的网段,所以数据包经由docker0网桥,出现在宿主机上。
2.在宿主机的路由表中,去往100.96.0.0/16网段的包经由flannel0处理。flannel0收到数据包之后,将数据包送到flanneld进程,flanneld进程会对数据包封装成一个UDP数据包,src和dst地址分别为两个容器对应的宿主机的地址。这样,数据包就可以到达Node2了。
3.数据包到达Node2的8285端口,即Node2上的flanneld进程,会被执行解封装操作,之后数据包被发送到TUN设备,即flannel0设备。剩下的事情就简单了,数据包经过docker0网桥到达container-2。
1.2 Flannel-vxlan
经过上面的介绍,大家对Flannel-UDP模式大致了解了吧,那聪明的你们已经猜到为什么Flannel-UDP被弃用了吧?没错,因为效率太低了,数据包每次经过flannel0设备,都会经过内核态-用户态-内核态的这一顿折腾。
Flannel-VXLAN方案用VXLAN技术替代了flannel0设备,让数据包能够在内核态上实现数据包的封装和解封装。

Flannel-VXLAN网络模型如图所示,你会发现,这和Flannel-UDP基本上的是一样。事实也的确如此,Flannel-VXLAN是Flannel-UDP的升级版。这里需要交代一下他们之间的不同点。
1.Flannel-UDP的TUN设备flannel0,升级成了VXLAN的VTEP设备。数据包的封装和解封装在内核态就能完成。
2.数据包的格式中,增加了VXLAN Header,这个Header的作用和Flannel-UDP的数据包中的dport:8285的作用是一样的,当数据包来到Node2时,操作系统能根据VXLAN Header,把数据包直接给到flannel.1设备。
1.3 Flannel-host-gw
此时,你肯定会说,Flannel-VXLAN虽然效率提高了,但是还是用到了隧道技术,效率还是会受到影响,能不能不用隧道技术呢?答案是能。接下来我们继续探索Flannel-host-gw网络模型,一个基于三层的网络方案。

Flannel-host-gw网络模型,相比较之前的两个网络模型,隧道设备确实没有了,取而代之的是一堆路由规则。那,数据包又是怎么从container1到container2的呢?
1.当数据包从container1到了网桥之后,通过Host网络栈的路由表,发现去container2的路已经指明,经由eth0,达到Node2(10.168.0.3/24)即可。
2.当数据包到了Node2之后,通过Host网络栈的路由表,找到cni0网桥,container2自然也就找到了。
肉眼可见,Flannel-host-gw的性能确实提高了很多,那为什么还要用Flannel-VXLAN呢?原因很明显,Flannel-host-gw只支持宿主机在二层连通的网络,并且,K8S的规模不能太大,否则每台机器的路由表就太多了。
二、Calico
Calico 是一个功能强大的网络插件,提供了高效的 路由 网络架构,并支持 网络策略(Network Policy),适合大规模、复杂的 Kubernetes 集群。它不仅适用于 Overlay 网络,还支持 BGP(边界网关协议)路由,提供高性能的网络连接。
2.1 Calico(非IPIP模式)
实际上Calico网络模型的解决方案,几乎和Flannel-host-gw是一样的。不同的是Flannel-host-gw使用etcd来维护主机的路由表,而Calico则使用BGP(边界网关协议)来维护主机的路由表。BGP协议的定义看着有点高深,换成通俗的说法,大家可以理解为在每个边界网关都会都运行着一个小程序,它们会交换各自的路由信息,将需要的信息更新到自己的路由表里。BGP这个能力正好可以取代Flannel-host-gw利用Etcd维护主机上路由表的功能,并且更为强大。
除了BGP之外,Calico另外一个不同之处就在于它不需要维护一个网桥。其中BGP Client和Felix的作用是和K8S集群其他节点交换路由信息,并更新Host网络栈的路由信息。

由于没有了网桥设备,每个对设备Host网络栈的这一端,需要配置一条路由规则,将目的地址为对应Container的数据包转入该对设备。对应的路由如下所示:
10.233.1.2 dev cali9c02e56 scope link
数据包是如何从Container1走到Container3的呢?过程基本上和Flannel-host-gw无异了。唯一区别就是数据包进出容器,不再依赖网桥,而是直接通过宿主机路由表找到容器的另一端对设备。
2.2 Calico(IPIP模式)
Calico听着挺强大的,实则和Flannel-host-gw一样,只支持宿主机二层联通的情况。假设Container1和Container3的宿主机在不同的子网,那通过二层网络是无法将数据包传到下一跳的地址的。如图7所示,Calico会在Node1创建这样一条路由规则:
10.233.2.0/16 via 192.168.2.2 eth0
此时问题就出现了,下一跳是192.168.2.2,和Node1不在一个子网里,根本就找不到。

Calico的IPIP模式解决了上述问题,在每一台宿主机上,都会增加一个tunl0设备(IP隧道设备),并且会对应增加如下一条路由策略。
10.233.2.0/16 via 192.168.2.2 tunl0
这样一来,Container1去往Container3的数据包就会经过tunl0设备的处理,tunl0设备会在源IP报头之外新增一个外部IP报头,拿本例来说,这个外部IP报头的src和dst分别为Node1和Node2的IP,这样,数据包就伪装成了从Node1发到Node2的数据包。当数据包到达Node2之后,Node2上的tunl0会把外部IP报头拿掉,从而拿到原始的IP包。
我知道,聪明的你此时肯定会有一个更好的想法,为什么不在Router1和Router2上也用BGP协议的方式,同步容器的IP路由信息呢?这样宿主机上不就可以不用tunl0设备了么。这个方法确实很好,并且在一些场景也得到了应用。
三、Flannel vs Calico 区别
| 特性 | Flannel | Calico |
| 网络架构 | Overlay 网络(隧道模式) | 基于路由(BGP 或 IP-in-IP) |
| 性能 | 性能较低(因为使用隧道) | 高性能,接近原生网络性能 |
| 网络策略支持 | 不支持网络策略 | 强大的网络策略支持(细粒度控制) |
| 配置和管理 | 配置简单,适合快速部署 | 配置较复杂,但灵活性更高 |
| 适用集群规模 | 适合中小规模集群 | 适合大规模集群或跨数据中心部署 |
| 安全控制 | 无网络策略控制 | 提供丰富的安全控制和流量隔离 |
| 支持的网络模式 | VXLAN, UDP, Host-GW | BGP, IP-in-IP, VXLAN 等多种模式 |
四、总结
-
Flannel 是一个轻量级的 Overlay 网络插件,适合中小型 Kubernetes 集群,特别是在对网络性能和安全要求不高的情况下。它安装和配置简单,但不支持网络策略,功能相对基础。
-
Calico 提供更强大的功能,特别适合需要高性能、大规模、复杂安全控制和跨数据中心连接的 Kubernetes 集群。它不仅提供高效的网络路由(BGP),还支持细粒度的网络安全控制(通过网络策略
参考文献
[1] 本文的图片均引自张磊老师的《深入剖析Kubernetes》
[2] Linux Bridge(网桥基础) https://quemingfei.com/archives/linuxbridge-wang-qiao-ji-chu-
[3] 维基百科 https://en.wikipedia.org/wiki
相关文章:
Kubernetes 常用的网络插件
上篇内容跟大家简单聊了k8s网络模型原理。分别围绕着容器、Pod、Service、网络策略等展开了详细的讲解。这次想跟大家聊聊k8s的CNI网络插件。 CNI 是 Kubernetes 网络模型的核心组件,它是一个插件接口,允许用户选择和配置网络插件来管理 Pod 的网络。CN…...
Retrofit和rxjava 实现窜行请求,并行请求,循环多次请求,递归请求,错误重试
在使用 Retrofit 和 RxJava 时,可以通过多种方式实现多次请求,比如串行请求、并行请求、依赖请求等。以下是一些常见的实现方式: 1. 串行请求(依赖关系) 一个请求的结果作为另一个请求的输入,可以用 flat…...
2025年度好用便签推荐,电脑桌面便签app分享
在快节奏的现代生活中,高效的时间管理和任务规划变得尤为重要。一款好用的便签软件不仅能帮助我们记录灵感、待办事项,还能极大地提升我们的工作效率。 在众多电脑桌面便签中,好用便签以其出色的桌面便签功能脱颖而出,备受用户青…...
【论文解读】Arbitrary-steps Image Super-resolution via Diffusion Inversion
级别:arXiv Computer Vision and Pattern Recognition(2024)作者:Zongsheng Yue,Kang Liao,Chen Change Loy时间:2024论文链接:Arbitrary-steps Image Super-resolution via Diffusion Inversion摘要 技术概述:该技术基于扩散反转,通过设计部分噪声预测策略来构建扩散…...
kkFileView集成springboot:使用自定义预览接口(非minio预览接口),发现无法预览资源
目录 1、背景2、原因分析3、解决办法 1、背景 按照项目验收要求,需要对minio中存储的数据进行加密 之前提供给kkFileView的预览地址都是获取的minio预览地址 由于minio中的资源进行了加密处理,所以我们自定义预览接口(进行解密操作ÿ…...
被裁20240927 --- 嵌入式硬件开发 STM32篇
人很容易原谅别人的错误但很难原谅别人的正确 1. 文档、手册、指南、资源2. MCU 结构3. MCU 和 MPU 的区别4. 一些概念什么是看门狗 ?什么是 DMA ?什么是晶振 ?什么是片内外设?软件协议、硬件协议、数据协议、通讯协议、通信协议u…...
留学生交流互动系统|Java|SSM|VUE| 前后端分离
【技术栈】 1⃣️:架构: B/S、MVC 2⃣️:系统环境:Windowsh/Mac 3⃣️:开发环境:IDEA、JDK1.8、Maven、Mysql5.7 4⃣️:技术栈:Java、Mysql、SSM、Mybatis-Plus、VUE、jquery,html 5⃣️数据库可…...
C/C++ 数据结构与算法【图】 图+邻接矩阵+邻接表+DFS+BFS+最小生成树+最短路径+拓扑排序详细解析【日常学习,考研必备】带图+详细代码
一、图的定义 1)无向图,有向图,完全图 2)稀疏图,稠密图,网,邻接,关联 3)度 4)路径 5)连通图 6)权与网 7)子图 8࿰…...
Linux实验报告7-文件管理
目录 一:实验目的 二:实验内容 (1)查看/etc/inittab文件的权限属性,并指出该文件的所有者以及文件所属组群。 (2)新建文件test,设置文件权限为r--r-----。 (3)新建文件test2,设系统中有用户study和用户组studygr…...
RJ45网口模块设计
1、以太网概述及RJ45实物 2、常用网口信号介绍 3、RJ45网口布局布线要点分析 4、总结 1、变压器下面需要进行挖空处理,以免底下的铜引入干扰,(将多边形挖空区域的所在层设置为Multi-Layer多层) 2、为了更直观的看一个类中线的长…...
电子电器架构 --- 智能座舱HUD技术革新
我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 所谓鸡汤,要么蛊惑你认命,要么怂恿你拼命,但都是回避问题的根源&…...
嵌入式开发中的机器人表情绘制
机器人的表情有两种,一种是贴图,一钟是调用图形API自绘。 贴图效果相对比较好,在存储空间大的情况下是可以采用的。 自绘比较麻烦,但在资源和空缺少的情况下,也是很有用的。而且自绘很容易通过调整参数加入随机效果&…...
orm01
静态文件处理 静态文件:如:图片、音频、视频、css、js等静态文件的相关配置也在 项目名/项目名/settings.py 文件中进行配置 - 配置静态文件的访问路径STATIC_URL- 功能:通过哪个 url 地址找静态文件- 默认配置:STATIC_URL /sta…...
Maven 测试和单元测试介绍
一、测试介绍 二、单元测试 1)介绍 2)快速入门 添加依赖 <dependencies><!-- junit依赖 --><dependency><groupId>org.junit.jupiter</groupId><artifactId>junit-jupiter</artifactId><version>5.9…...
Postman接口测试03|执行接口测试、全局变量和环境变量、接口关联、动态参数、断言
目录 七、Postman 1、安装 2、postman的界面介绍 八、Postman执行接口测试 1、请求页签 3、响应页签 九、Postman的环境变量和全局变量 1、创建环境变量和全局变量可以解决的问题 2、postman中的操作-全局变量 1️⃣手动设置 2️⃣代码设置 3️⃣界面获取 4️⃣代…...
UE5 丧尸类杂兵的简单AI
A、思路 1、关卡初始化时,自动产生随机巡逻点,小兵到达后,去另一个随机巡逻点。 2、加入视力,发现主角后,不再巡逻,而开始追击主角并攻击。条件循环。 3、加入听力。主角的奔跑与射击会产生噪音…...
Linux字符设备驱动开发的三种方式(分析+对比+示例)
文章目录 一. 字符设备的驱动方法二. 三种方法的对比三. 开发环境四. 代码示例1. 传统设备驱动模型2. 总线设备驱动模型3. 设备树驱动模型 五. 相关链接 一. 字符设备的驱动方法 字符设备驱动 是指在I/O传输过程中以字节流进行读写操作的设备。典型的如LCD、蜂鸣器、SPI、触摸屏…...
C++设计模式之行为型模式概述,它们的目的与特点
行为型设计模式需要解决的问题 行为型设计模式主要关注对象之间的责任分配和交互。它们解决的问题包括: 对象之间的通信:如何让对象之间高效地通信,同时保持松耦合。算法的封装与复用:如何将算法或行为封装起来,使其…...
把Huggingface下载的arrow数据集转化为json格式
Arrow2json 使用默认的Huggingface路径 以allenai/tulu-3-sft-mixture数据集为例。 使用load_dataset即可: from datasets import load_dataset# 加载数据集 dataset load_dataset("allenai/tulu-3-sft-mixture")# 指定保存路径 output_dir "~/…...
复习打卡大数据篇——Hadoop YARN
目录 1.什么是yarn 2.yarn的三大角色 3.任务(MR)提交到YARN运行流程 4. 调度器Scheduler 5.YARN HA 高可用 1.什么是yarn YARN(Yet Another Resource Negotiator)是一个资源管…...
java 实现excel文件转pdf | 无水印 | 无限制
文章目录 目录 文章目录 前言 1.项目远程仓库配置 2.pom文件引入相关依赖 3.代码破解 二、Excel转PDF 1.代码实现 2.Aspose.License.xml 授权文件 总结 前言 java处理excel转pdf一直没找到什么好用的免费jar包工具,自己手写的难度,恐怕高级程序员花费一年的事件,也…...
【位运算】消失的两个数字(hard)
消失的两个数字(hard) 题⽬描述:解法(位运算):Java 算法代码:更简便代码 题⽬链接:⾯试题 17.19. 消失的两个数字 题⽬描述: 给定⼀个数组,包含从 1 到 N 所有…...
如何在看板中有效管理突发紧急任务
在看板中有效管理突发紧急任务需要:设立专门的紧急任务通道、重新调整任务优先级、保持适度的WIP(Work-in-Progress)弹性、优化任务处理流程、提高团队应对突发情况的敏捷性。其中,设立专门的紧急任务通道尤为重要,这能…...
Frozen-Flask :将 Flask 应用“冻结”为静态文件
Frozen-Flask 是一个用于将 Flask 应用“冻结”为静态文件的 Python 扩展。它的核心用途是:将一个 Flask Web 应用生成成纯静态 HTML 文件,从而可以部署到静态网站托管服务上,如 GitHub Pages、Netlify 或任何支持静态文件的网站服务器。 &am…...
TRS收益互换:跨境资本流动的金融创新工具与系统化解决方案
一、TRS收益互换的本质与业务逻辑 (一)概念解析 TRS(Total Return Swap)收益互换是一种金融衍生工具,指交易双方约定在未来一定期限内,基于特定资产或指数的表现进行现金流交换的协议。其核心特征包括&am…...
unix/linux,sudo,其发展历程详细时间线、由来、历史背景
sudo 的诞生和演化,本身就是一部 Unix/Linux 系统管理哲学变迁的微缩史。来,让我们拨开时间的迷雾,一同探寻 sudo 那波澜壮阔(也颇为实用主义)的发展历程。 历史背景:su的时代与困境 ( 20 世纪 70 年代 - 80 年代初) 在 sudo 出现之前,Unix 系统管理员和需要特权操作的…...
安卓基础(aar)
重新设置java21的环境,临时设置 $env:JAVA_HOME "D:\Android Studio\jbr" 查看当前环境变量 JAVA_HOME 的值 echo $env:JAVA_HOME 构建ARR文件 ./gradlew :private-lib:assembleRelease 目录是这样的: MyApp/ ├── app/ …...
Redis的发布订阅模式与专业的 MQ(如 Kafka, RabbitMQ)相比,优缺点是什么?适用于哪些场景?
Redis 的发布订阅(Pub/Sub)模式与专业的 MQ(Message Queue)如 Kafka、RabbitMQ 进行比较,核心的权衡点在于:简单与速度 vs. 可靠与功能。 下面我们详细展开对比。 Redis Pub/Sub 的核心特点 它是一个发后…...
高效线程安全的单例模式:Python 中的懒加载与自定义初始化参数
高效线程安全的单例模式:Python 中的懒加载与自定义初始化参数 在软件开发中,单例模式(Singleton Pattern)是一种常见的设计模式,确保一个类仅有一个实例,并提供一个全局访问点。在多线程环境下,实现单例模式时需要注意线程安全问题,以防止多个线程同时创建实例,导致…...
IP如何挑?2025年海外专线IP如何购买?
你花了时间和预算买了IP,结果IP质量不佳,项目效率低下不说,还可能带来莫名的网络问题,是不是太闹心了?尤其是在面对海外专线IP时,到底怎么才能买到适合自己的呢?所以,挑IP绝对是个技…...
