什么是 k8s CNI ?

1、什么是 CNI ?

CNI 是容器网络接口 (Container Network Interface)的缩写。定义了容器运行时如何与网络插件进行交互,从而管理容器网络。只要开发者遵循 CNI 定义的规范就可以接入 kubernetes ,为 Pod 创建虚拟网卡、分配 IP 地址、设置路由规则等,这样就实现 “IP-Per-Pod” 网络模型。

CNI 为网络插件定义了一些以系列通用接口,可以使容器运行时与多种不同的网络插件(Flannel、Calico、Cilium等网络插件)进行交互,不同网络插件可以提供不同的网络策略。

2、Flannel 工作原理

Flannel 是一个用于容器网络的 CNI 插件,它的主要功能是为容器提供一个可以互相通信的网络。

那么,Flannel 是通过什么技术来实现容器之间的通信呢?

目前,Flannel 支持三种网络后端 VXLAN、UDP、Host-GW ,基于这些后端技术来实现容器之间的通信的。

2.1、Flannel 的 UDP 模式

UDP 模式,是 Flannel 最早支持的解决容器通信模式,由于性能非常差,所以,现在基本被弃用。

例子:假设有两台宿主机

  • Node 1 container-1,IP 地址是 100.96.1.2,对应的 docker0 网桥的地址是:100.96.1.1/24;
  • Node 2 container-2,IP 地址是 100.96.2.3,对应的 docker0 网桥的地址是:100.96.2.1/24;

容器 A 要访问 容器 B,由于是跨主机不在一个网断里,那么目的地址 100.96.2.3 并不在 Node 1 的 docker0 网桥的网段里,此时会根据路由规则通过容器的网关进入 docker0 网桥,在匹配到 flannel0 设备中,然后 flanneld 看到了这个 IP 包的目的地址,是 100.96.2.3,就把它发送给了 Node 2 宿主机。

flannel0 设备它是一个 TUN 设备,TUN 设备是一种工作在三层(Network Layer)的虚拟网络设备。负责,在操作系统内核和用户应用程序之间传递 IP 包

flanneld 又是如何知道这个 IP 地址对应的容器,是运行在 Node 2 上的呢?通过子网(Subnet),一台宿主机上的所有容器,都属于该宿主机被分配的一个“子网”。

总结:

Flannel UDP 模式提供的其实是一个三层的 Overlay 网络,即:它首先对发出端的 IP 包进行 UDP 封装,然后在接收端进行解封装拿到原始的 IP 包,进而把这个 IP 包转发给目标容器。

缺点:

仅在发出 IP 包的过程中,就需要经过三次用户态与内核态之间的数据拷贝

  • 第一次,用户态的容器进程发出的 IP 包经过 docker0 网桥进入内核态;
  • 第二次,IP 包根据路由表进入 TUN(flannel0)设备,从而回到用户态的 flanneld 进程;
  • 第三次,flanneld 进行 UDP 封包之后重新进入内核态,将 UDP 包通过宿主机的 eth0 发出去。
2.2、Flannel 的 VXLAN 模式

VXLAN 的覆盖网络的设计思想是:在现有的三层网络之上,“覆盖”一层虚拟的、由内核 VXLAN 模块负责维护的二层网络,使得连接在这个 VXLAN 二层网络上的“主机”(虚拟机或者容器都可以)之间,可以像在同一个局域网(LAN)里那样自由通信。当然,实际上,这些“主机”可能分布在不同的宿主机上,甚至是分布在不同的物理机房里。

而 VTEP 设备的作用,其实跟前面的 flanneld 进程非常相似。只不过,它进行封装和解封装的对象,是二层数据帧(Ethernet frame);而且这个工作的执行流程,全部是在内核里完成的(因为 VXLAN 本身就是 Linux 内核中的一个模块)。

2.3、host-gw 模式

工作原理非常简单:

在这里插入图片描述

假设现在,Node 1 上的 Infra-container-1,要访问 Node 2 上的 Infra-container-2。当你设置 Flannel 使用 host-gw 模式之后,flanneld 会在宿主机上创建这样一条规则,以 Node 1 为例:

$ ip route
...
10.244.1.0/24 via 10.168.0.3 dev eth0

这条路由规则的含义是:

  • 目的 IP 地址属于 10.244.1.0/24 网段的 IP 包,应该经过本机的 eth0 设备发出去(即:dev eth0);
  • 并且,它下一跳地址(next-hop)是 10.168.0.3(即:via 10.168.0.3)

这样,这个数据帧就会从 Node 1 通过宿主机的二层网络顺利到达 Node 2 上。

当然,Flannel 子网和主机的信息,都是保存在 Etcd 当中的。flanneld 只需要 WACTH 这些数据的变化,然后实时更新路由表即可。

3、Calico

不过,不同于 Flannel 通过 Etcd 和宿主机上的 flanneld 来维护路由信息的做法,Calico 项目使用了一个“BGP”来自动地在整个集群中分发路由信息。

BGP 的全称是 Border Gateway Protocol,即:边界网关协议。它是一个 Linux 内核原生就支持的、专门用在大规模数据中心里维护不同的“自治系统”之间路由信息的、无中心的路由协议。

4、cilium 工作原理

4.1 概述

Cilium 是 kubernetes 的 CNI 网络解决方案,Cilium 在设计和实现上,基于Linux的一种新的内核技术 eBPF,可以在Linux内部动态插入强大的安全性、可观测性和网络控制逻辑,及安全策略。可以在不修改应用程序代码或容器配置的情况下进行应用和更新。

3.2 架构

参考 Cilium 官方的架构,Cilium 位于容器编排系统 和 Linux Kernel之间,向上可以通过编排平台为容器进行网络以及相应的安全配置,向下可以通过在Linux内核挂载eBPF程序,来控制容器网络的转发行为以及安全策略执行。

kubectl exec -it test-1-7cd5798f46-vzf9s -n test-1 bashroot@u18-161:~# kubectl exec -it test-1-7cd5798f46-vzf9s -n test-1 bash
root@test-1-7cd5798f46-vzf9s:/# route -n
Kernel IP routing tableDestination Gateway Genmask Flags Metric Ref Use Iface0.0.0.0 10.244.0.26 0.0.0.0 UG 0 0 0 eth0
10.244.0.26 0.0.0.0 255.255.255.255 UH 0 0 0 eth0
root@test-1-7cd5798f46-vzf9s:/# arp
root@test-1-7cd5798f46-vzf9s:/#

Flannel 的工作原理如下:

  1. 每个节点上的 Flannel 会为主机分配一个唯一的子网,这个子网可以由用户自定义或者由 Flannel 自动生成。

  2. 当容器启动时,容器运行时会调用 CNI 插件,通过 CNI 接口请求 Flannel 为容器分配一个 IP 地址。

  3. Flannel 会根据容器所在的节点以及容器所在节点的子网信息,为容器分配一个唯一的 IP 地址,并将这个 IP 地址返回给容器运行时。

  4. 容器运行时会将这个 IP 地址配置到容器的网络接口上,从而使容器可以与其他容器或者主机进行通信。

  5. 当容器需要访问其他节点上的容器时,Flannel 会使用虚拟网络设备 TUN/TAP 将数据包封装,然后通过底层网络(如 VXLAN、UDP)传输到目标节点上的 Flannel,再解封装数据包将其交给目标容器。

Calico 是一个开源的容器网络解决方案,它使用 BGP 协议来实现容器之间的通信。其工作原理如下:

  1. 每个节点上的 Calico Agent 会为主机分配一个唯一的 IP 地址,并将这个 IP 地址作为节点的标识符。

  2. 当容器启动时,容器运行时会调用 CNI 插件,通过 CNI 接口请求 Calico 为容器分配一个 IP 地址。

  3. Calico 会为容器分配一个唯一的 IP 地址,并将这个 IP 地址配置到容器的网络接口上。

  4. 当容器需要与其他容器通信时,容器会将数据包发送到目标 IP 地址,如果目标 IP 地址与本地节点的 IP 地址属于同一个子网,则数据包会直接发送到目标容器;如果目标 IP 地址与本地节点的 IP 地址不属于同一个子网,则数据包会被封装成 BGP 路由,并通过 BGP 协议传输到目标节点上。

  5. 目标节点上的 Calico Agent 接收到数据包后,会解封装数据包,并将数据包交给目标容器。

Cilium 是一个开源的容器网络解决方案,它使用 Linux 内核中的 eBPF(Extended Berkeley Packet Filter)技术来实现容器之间的通信。其工作原理如下:

  1. Cilium Agent 在每个节点上运行,并通过 Linux 内核中的 eBPF 技术来监控所有容器之间的网络通信。

  2. 当容器启动时,容器运行时会调用 CNI 插件,通过 CNI 接口请求 Cilium 为容器分配一个 IP 地址。

  3. Cilium 会为容器分配一个唯一的 IP 地址,并将这个 IP 地址配置到容器的网络接口上。

  4. 当容器之间需要通信时,Cilium Agent 会根据容器的标签信息和网络策略来判断是否允许通信,并使用 eBPF 技术来实现容器之间的通信。

  5. Cilium 还支持通过集成 Istio 来实现服务网格,从而可以对服务之间的通信进行更细粒度的控制和管理。

总之,Cilium 的主要作用是为容器提供一个可以互相通信的网络,并且它的实现方式是使用 Linux 内核中的 eBPF 技术来实现容器之间的通信。这种方式可以使得容器网络的性能更高,同时还支持更细粒度的网络策略和服务网格功能。

参考:

  • https://cloud.tencent.com/developer/article/1661282

5、总结

Kubernetes通过一个叫做CNI的接口,维护了一个单独的网桥来代替docker0。这个网桥的名字就叫作:CNI网桥,它在宿主机上的设备名称默认是:cni0。

容器“跨主通信”的三种主流实现方法:UDP、host-gw、VXLAN。 之前介绍了UDP和VXLAN,它们都属于隧道模式,需要封装和解封装。接下来介绍一种纯三层网络方案,host-gw模式和Calico项目

Host-gw模式通过在宿主机上添加一个路由规则:

<目的容器IP地址段> via <网关的IP地址> dev eth0

IP包在封装成帧发出去的时候,会使用路由表里的“下一跳”来设置目的MAC地址。这样,它就会通过二层网络到达目的宿主机。

这个三层网络方案得以正常工作的核心,是为每个容器的IP地址,找到它所对应的,“下一跳”的网关。所以说,Flannel host-gw模式必须要求集群宿主机之间是二层连通的,如果宿主机分布在了不同的VLAN里(三层连通),由于需要经过的中间的路由器不一定有相关的路由配置(出于安全考虑,公有云环境下,宿主机之间的网关,肯定不会允许用户进行干预和设置),部分节点就无法找到容器IP的“下一条”网关了,host-gw就无法工作了。

Calico

Calico项目提供的网络解决方案,与Flannel的host-gw模式几乎一样,也会在宿主机上添加一个路由规则: <目的容器IP地址段> via <网关的IP地址> dev eth0

其中,网关的IP地址,正是目的容器所在宿主机的IP地址,而正如前面所述,这个三层网络方案得以正常工作的核心,是为每个容器的IP地址,找到它所对应的,“下一跳”的网关。区别是如何维护路由信息:

Host-gw : Flannel通过Etcd和宿主机上的flanneld来维护路由信息 Calico: 通过BGP(边界网关协议)来实现路由自治,所谓BGP,就是在大规模网络中实现节点路由信息共享的一种协议。

隧道技术(需要封装包和解包,因为需要伪装成宿主机的IP包,需要三层链通):Flannel UDP / VXLAN / Calico IPIP 三层网络(不需要封包和解封包,需要二层链通):Flannel host-gw / Calico 普通模式

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

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

相关文章

深入理解进程的退出、等待与替换(Linux系统)

个人主页&#xff1a;敲上瘾-CSDN博客 个人专栏&#xff1a;Linux学习、游戏、数据结构、c语言基础、c学习、算法 目录 一、进程退出 1.退出场景 2.常见退出方法 3.退出码与退出信号 4._exit函数与exit函数 二、进程等待 1.什么是进程等待&#xff08;是什么&#xff1f;…

【初阶数据结构与算法】二叉树链式结构刷题训练(Leetcode二叉树遍历、单值二叉树、相同的树、另一棵树的子树、对称二叉树)

文章目录 一、二叉树的遍历二、单值二叉树三、相同的树四、另一颗树的子树五、对称二叉树 一、二叉树的遍历 在链式二叉树的定义与实现中我们已经详细讲解了二叉树常见的三种遍历方式&#xff0c;以及层序遍历&#xff0c;这里给出链接&#xff1a;【初阶数据结构与算法】二叉树…

深入浅出 Go 语言 sync包中的互斥锁、条件变量

深入浅出 Go 语言 sync包中的互斥锁、条件变量 引言 在并发编程中&#xff0c;多个 Goroutine 同时访问共享资源可能会导致数据竞争&#xff08;Race Condition&#xff09;&#xff0c;进而引发程序的不一致性或崩溃。为了确保并发程序的正确性和稳定性&#xff0c;Go 语言提…

制造业数据集成案例分享:3小时内实现MySQL到MySQL数据对接

ZZ刷新生产用料清单四化库存-制造一处-3小时&#xff1a;MySQL到MySQL数据集成案例分享 在现代制造业中&#xff0c;实时、准确的数据流动是确保生产效率和资源优化的关键。本文将分享一个实际运行的系统对接集成案例——“ZZ刷新生产用料清单四化库存-制造一处-3小时”&#…

OpenCV 图像基本操作

OpenCV快速通关 第一章&#xff1a;OpenCV 图像基本操作 第二章&#xff1a;OpenCV 图像基本操作 OpenCV 图像基本操作 OpenCV快速通关第二章&#xff1a;OpenCV 图像基本操作一、相关结构体与函数介绍&#xff08;一&#xff09;cv::Mat 结构体&#xff08;二&#xff09;cv:…

雨晨 2610(2)0.2510 Windows 11 24H2 Iot 企业版 LTSC 2024 极简 2in1

文件: 雨晨 2610(2)0.2510 Windows 11 24H2 Iot 企业版 LTSC 2024 极简 2in1 install.esd 索引: 1 名称: Windows 11 IoT 企业版 LTSC 极简 26100.2510 描述: Windows 11 IoT 企业版 LTSC 极简 26100.2510 By YCDISM RTM 2025 24-12-07 大小: 8,176,452,990 个字节 索引: 2 …

PHP保存base64编码图片,图片有一部分是灰色块儿,原因和解决办法

文章目录 场景原因解决方案完整的代码前端代码php代码 场景 我有个需求&#xff0c;移动端h5上传多张的图片。用input file可以上传多张&#xff0c;但是现在照片体积越来越大&#xff0c;同时上传多张会因为体积过大&#xff0c;导致上传失败。如果是小程序会好很多&#xff…

【CSP CCF记录】202212-2第28次认证 训练计划

题目 样例1输入 10 5 0 0 0 0 0 1 2 3 2 10 样例1输出 1 1 1 1 1 10 9 8 9 1 样例1解释 五项科目间没有依赖关系&#xff0c;都可以从第 1 天就开始训练。 10天时间恰好可以完成所有科目的训练。其中科目 1 耗时仅 1天&#xff0c;所以最晚可以拖延到第 10 天再开始训练&…

gitee

Git 是一个开源的 [ 分布式 ][ 版本控制系统 ] &#xff0c;用于敏捷高效地 处理任何或小或大的项目 Git 非常容易学习&#xff0c;低植入&#xff0c;高性能。因为拥有轻量的本地分支&#xff0c;易用的暂存区&#xff0c;和多工作流的特点&#xff0c;它超越了类似Subversio…

Spring——SpringBean初始接口

摘要 本文详细介绍了Spring框架中SpringBean的初始化接口和注解&#xff0c;包括BeanPostProcessor接口、InitializingBean接口和PostConstruct注解。文章解释了这些接口和注解的原理、作用、适用场景&#xff0c;并提供了示例代码。最后&#xff0c;对比了不同SpringBean初始…

「嵌入式系统设计与实现」书评:学习一个STM32的案例

本文最早发表于电子发烧友论坛&#xff1a;【新提醒】【「嵌入式系统设计与实现」阅读体验】 学习一个STM32的案例 - 发烧友官方/活动 - 电子技术论坛 - 广受欢迎的专业电子论坛!https://bbs.elecfans.com/jishu_2467617_1_1.html 感谢电子发烧友论坛和电子工业出版社的赠书。 …

操作系统——大容量存储结构

笔记内容及图片整理自XJTUSE “操作系统” 课程ppt&#xff0c;仅供学习交流使用&#xff0c;谢谢。 大容量存储结构概述 磁盘 磁盘为现代计算机系统提供大量外存。每个盘片为平的圆状&#xff08;类似CD&#xff09;&#xff0c;普通盘片直径为4.5~9.0厘米。盘片的两面都涂着…

Redis从入门到进阶(总结)

以下内容均以CentOS7为背景。 一、Redis安装及启动 mysql&#xff08;读&#xff1a;2000/s&#xff1b;写&#xff1a;600/s&#xff09; redis&#xff08;读&#xff1a;10w/s&#xff1b;写&#xff1a;8w/s&#xff09;通过官方给出的数据单机并发可以达到10w/s&#xf…

Java进阶(注解,设计模式,对象克隆)

Java进阶(注解&#xff0c;设计模式&#xff0c;对象克隆) 一. 注解 1.1 什么是注解 java中注解(Annotation)&#xff0c;又称java标注&#xff0c;是一种特殊的注释 可以添加在包&#xff0c;类&#xff0c;成员变量&#xff0c;方法&#xff0c;参数等内容上 注解会随同…

使用 Gin 框架构建 RESTful 博客 API

使用 Gin 框架构建 RESTful 博客 API 引言 在现代 Web 开发中&#xff0c;RESTful API 是一种非常流行的设计风格&#xff0c;它通过 HTTP 协议与客户端进行通信&#xff0c;提供了灵活且易于扩展的接口。Go 语言以其高效的并发处理能力和简洁的语法&#xff0c;成为了构建高…

Leecode刷题C语言之骑士在棋盘上的概率

执行结果:通过 执行用时和内存消耗如下&#xff1a; 代码如下&#xff1a; static int dirs[8][2] {{-2, -1}, {-2, 1}, {2, -1}, {2, 1}, {-1, -2}, {-1, 2}, {1, -2}, {1, 2}};double knightProbability(int n, int k, int row, int column){double dp[200][30][30];mem…

21. C++STL 7(8000字详解list及其迭代器的模拟实现)

⭐本篇重点&#xff1a;STL中的list及其迭代器的模拟实现和测试 ⭐本篇代码&#xff1a;c学习 橘子真甜/c-learning-of-yzc - 码云 - 开源中国 (gitee.com) 目录 一. list的节点 二. list的迭代器 2.1 迭代器框架 2.2 迭代器实现 三. list的实现 3.1 list的构造函数 3.…

Docker打包SpringBoot项目

一、项目打成jar包 在进行docker打包之前&#xff0c;先确定一下&#xff0c;项目能够正常的打成JAR包&#xff0c;并且启动之后能够正常的访问。这一步看似是可有可无&#xff0c;但是能避免后期的一些无厘头问题。 二、Dockerfile 项目打包成功之后&#xff0c;需要编写Doc…

零基础学鸿蒙开发--第九篇--网络请求

12. ⽹络请求 鸿蒙系统提供了 http 模块 ⽤于发送 http 请求&#xff0c;另外&#xff0c; OpenHarmony社区基于该模块将前端开发中常⽤的⽹络请 求库 axios 移植到了鸿蒙系统&#xff0c;因此我们也可以在鸿蒙系统中使⽤ axios 发送 http 请求&#xff0c;下⾯重点为⼤家介绍…

133.WEB渗透测试-信息收集-小程序、app(4)

免责声明&#xff1a;内容仅供学习参考&#xff0c;请合法利用知识&#xff0c;禁止进行违法犯罪活动&#xff01; 内容参考于&#xff1a; 易锦网校会员专享课 上一个内容&#xff1a;132.WEB渗透测试-信息收集-小程序、app&#xff08;3&#xff09; 输入命令&#xff1a;…