【Kubernetes】二进制部署k8s集群(中)之cni网络插件flannel和calico

!!!继续上一篇实验部署!!!

目录

一.k8s的三种网络模式

1.Pod 内容器与容器之间的通信

2.同一个 Node 内 Pod 之间的通信

3.不同 Node 上 Pod 之间的通信

二.k8s的三种接口

三.Flannel 网络插件

1.UDP 模式(8285端口)

2.VXLAN 模式

四.VLAN 和 VXLAN 区别(拓展)

1.使用场景不同

2.数量不同

3.mac表中的记录不同

五.部署 flannel

1.在 master01 节点上操作

1.1.上传文件并解压

1.2.复制到2个node节点

1.3.部署 CNI 网络

2.在 node01 节点上操作

2.1.查看并导入镜像

2.2.创建目录并解压

2.3.检查端口

3.在 node02 节点上操作

3.1.查看并导入镜像

3.2.创建目录并解压

3.3.检查端口

注意

六.Calico 网络插件

1.k8s 组网方案对比

flannel方案

calico方案

2.Calico 的模式

3.Calico 主要由以下几个部分组成

4.Calico 工作原理:

IPIP 模式

BGP 模式

七.Flannel 和 Calico 对比

1.flannel

2.calico

3.总结

4.Calico的IPIP模式对比Flannel的VXLAN模式的优势(补充)

4.1.性能和效率

4.2.协议支持

4.3.总结


一.k8s的三种网络模式

k8s集群中pod网络通信分类

1.Pod 内容器与容器之间的通信

在同一个 Pod 内的容器(Pod 内的容器是不会跨宿主机的)共享同一个网络命名空间,相当于它

们在同一台机器上一样,可以用 localhost 地址访问彼此的端口

2.同一个 Node 内 Pod 之间的通信

每个 Pod 都有一个真实的全局 IP 地址,同一个 Node 内的不同 Pod 之间可以直接采用对方 Pod

的 IP 地址进行通信,Pod1 与 Pod2 都是通过 Veth 连接到同一个 cni0/docker0 网桥,网段相同,

所以它们之间可以直接通信

3.不同 Node 上 Pod 之间的通信

Pod 地址与 docker0 在同一网段,docker0 网段与宿主机网卡是两个不同的网段,且不同 Node 之

间的通信只能通过宿主机的物理网卡进行

要想实现不同 Node 上 Pod 之间的通信,就必须想办法通过主机的物理网卡 IP 地址进行寻址和通

信。因此要满足两个条件:Pod 的 IP 不能冲突;将 Pod 的 IP 和所在的 Node 的 IP 关联起来,通

过这个关联让不同 Node 上 Pod 之间直接通过内网 IP 地址通信

总结:因此引入了cni网络插件的核心原因实际上就是为了解决不同node节点上的不同pod之间的

通信,即pod跨主机通信

关于k8s的三种类型网络IP

  • 节点网络:nodeIP---node节点的物理网卡ip,实现node节点之间的通信
  • Pod网络:PodIP---Pod与Pod之间通过PodIP进行通信
  • service网络:clusterIP---k8s集群内部,service资源的clusterIP实现对Pod集群的网络代理

Overlay Network

叠加网络,在二层或者三层基础网络上叠加的一种虚拟网络技术模式,该网络中的主机通过虚拟链

路隧道连接起来。

通过Overlay技术(可以理解成隧道技术),在原始报文外再包一层四层协议(UDP协议),通过

主机网络进行路由转发。这种方式性能有一定损耗,主要体现在对原始报文的修改。目前Overlay

主要采用VXLAN。

VXLAN 即 Virtual Extensible LAN(虚拟可扩展局域网)

是一种网络虚拟化技术,它使用一种隧道协议,将二层以太网帧封装在四层UDP报文中,通过三层

网络传输,组成一个虚拟大二层网络,到达目的地后由隧道端点解封装并将数据发送给目标地址。

从而实现分布在不同的宿主机上的虚拟机或者容器就像在同一个局域网(LAN)里那样自由通信。

二.k8s的三种接口

  • CRI:容器进行时接口,连接容器引擎--docker、containerd、cri-o、podman
  • CNI:容器网络接口,用于连接网络插件如:flannel、calico、cilium
  • CSI:容器存储接口,如nfs、ceph、gfs、oss、s3、minio

三.Flannel 网络插件

Flannel 的功能是让集群中的不同节点主机创建的 Docker 容器都具有全集群唯一的虚拟 IP 地址。

Flannel 是 Overlay 网络的一种,也是将 TCP 源数据包封装在另一种网络包里面进行路由转发和通

信,目前支持 UDP、VXLAN、Host-gw 3种数据转发方式

1.UDP 模式(8285端口)

  1. 原始数据包从源主机的Pod容器发出到cni0网桥接口,再由cni0转发到flannel0虚拟接口
  2. flanneld服务会监听flannel0接口收到的数据,并会将原始数据包封装到UDP报文里
  3. flanneld服务会根据在etcd中维护的路由表查到目标Pod所在的nodeIP,并在UDP报文外封装nodeIP头部、MAC头部等,再通过物理网卡发送到目标node节点
  4. UDP报文通过8285端口送达到目标node节点的flanneld服务进程解封装获取原始数据包,数据报文再根据本地路由规则通过flannel0接口发送到cni0网桥,再由cni0发送到目标Pod容器

etcd 之 Flanneld 提供说明

存储管理 Flannel 可分配的IP地址段资源

监控 etcd 中每个 Pod 的实际地址,并在内存中建立维护 Pod 节点路由表

由于在 UDP 模式下 flanneld 进行网络的封包和解包工作,而 VXLAN 模式下封包解包的工作由内

核完成,因此性能上 UDP 模式会比在内核态做转发的 VXLAN 模式差

2.VXLAN 模式

VXLAN 模式是 Flannel 默认和推荐的模式,flannel 会为每个节点分配一个 24 位子网,并在每个

节点上创建两张虚机网卡:cni0 和 flannel.1 。 cni0 是一个网桥设备,类似于 docker0 ,节点上所

有的 Pod 都通过 veth pair 的形式与 cni0 相连。 flannel.1 则是一个 VXLAN 类型的设备,充当

VTEP 设备(VXLAN Tunnel Endpoint)的角色,实现对 VXLAN 报文的封包解包。

在 VXLAN 模式下,flanneld 启动时先确保 VXLAN 设备已存在,如果不存在则创建,存在则跳

过。并将 VTEP 设备的信息上报到 etcd 中,当 flannel 网络有新节点加入集群时并向 etcd 注册,

各节点上的 flanneld 会从 etcd 得到通知。

Flannel VXLAN 模式跨主机的工作原理

  1. 原始数据帧从源主机的Pod容器发出到cni0网桥接口,再由cni0转发到flannel.1虚拟接口
  2. flannel.1接口收到数据帧后添加VXLAN头部,再由内核将原始数据帧封装到UDP报文里
  3. 根据在etcd中维护的路由表查到目标Pod所在的nodeIP,并在UDP报文外封装nodeIP头部、MAC头部等,再通过物理网卡发送到目标node节点
  4. UDP报文通过8472端口送达到目标node节点的flannel.1接口并由内核解封装获取原始数据帧,数据报文再根据本地路由规则发送到cni0网桥,再由cni0发送到目标Pod容器

四.VLAN 和 VXLAN 区别(拓展)

1.使用场景不同

  • VLAN主要用于在交换机上逻辑划分广播域,还可以配合STP生成树协议阻塞路径接口,从而避免产生环路和广播风暴
  • VXLAN用作于叠加网络,可以将数据帧封装成UDP报文,再通过网络层传输到其它网络,从而实现虚拟大二层网络的通信

2.数量不同

  • VXLAN支持更多的二层网络:VXLAN最多可支持 2^24 个;
  • VLAN最多支持 2^12 个(4096-2)

3.mac表中的记录不同

  • VXLAN可以防止物理交换机MAC表耗尽:
  • VLAN需要在交换机的MAC表中记录MAC地址;
  • VXLAN采用隧道机制,MAC地址不记录在交换机的MAC表中

五.部署 flannel

1.在 master01 节点上操作

1.1.上传文件并解压

unzip flannel-v0.21.5.zip

1.2.复制到2个node节点

scp flannel*.tar 192.168.80.102:/opt/k8s
scp flannel*.tar 192.168.80.103:/opt/k8s
scp cni-plugins-linux-amd64-v1.3.0.tgz 192.168.80.102:/opt/k8s/
scp cni-plugins-linux-amd64-v1.3.0.tgz 192.168.80.103:/opt/k8s/

1.3.部署 CNI 网络

kubectl apply -f kube-flannel.yml kubectl get pods -n kube-flannelkubectl get pods -Akubectl get pods -A -owidekubectl get nodesip -d a show flannel.1   #在node上查看flannel.1的端口

2.在 node01 节点上操作

2.1.查看并导入镜像

docker load -i flannel.tar
docker load -i flannel-cni-plugin.tar

2.2.创建目录并解压

mkdir -p /opt/cni/bin
tar zxvf cni-plugins-linux-amd64-v1.3.0.tgz -C /opt/cni/bin

2.3.检查端口

3.在 node02 节点上操作

3.1.查看并导入镜像

docker load -i flannel.tar
docker load -i flannel-cni-plugin.tar

3.2.创建目录并解压

mkdir -p /opt/cni/bin
tar zxvf cni-plugins-linux-amd64-v1.3.0.tgz -C /opt/cni/bin

3.3.检查端口

注意

有几个文件中的网段设置需要一致

kube-flannel.yml中的网段设置

controller manager以及kube-proxy脚本中设置的网段需要保持一致

kube-flannel.yml 

 controller manager脚本

 kube-proxy脚本

六.Calico 网络插件

1.k8s 组网方案对比

flannel方案

需要在每个节点上把发向容器的数据包进行封装后,再用隧道将封装后的数据包发送到运行着目标

Pod的node节点上。目标node节点再负责去掉封装,将去除封装的数据包发送到目标Pod上。数据

通信性能则大受影响

calico方案

Calico不使用隧道或NAT来实现转发,而是把每个操作系统的协议栈认为是一个路由器,然后把所

有的容器认为是连在这个路由器上的网络终端,在路由器之间跑标准的路由协议——BGP的协议,

然后让它们自己去学习这个网络拓扑该如何转发

它不使用 cni0 网桥,而是通过路由规则把数据包直接发送到目标节点的网卡,所以性能高

2.Calico 的模式

  • IPIP 模式:在原有 IP 报文中封装一个新的 IP 报文,新的 IP 报文中将源地址 IP 和目的地址 IP 都修改为对端宿主机 IP。Calico 默认使用 IPIP 的模式
  • BGP 模式:将节点做为虚拟路由器通过 BGP 路由协议来实现集群内容器之间的网络访问。
  • cross-subnet(ipip-bgp混合模式):IPIP 模式和 BGP 模式都有对应的局限性,对于一些主机跨子网而又无法使网络设备使用 BGP 的场景可以使用 cross-subnet 模式,实现同子网机器使用 BGP 模式,跨子网机器使用 IPIP 模式

3.Calico 主要由以下几个部分组成

  • Calico CNI插件:主要负责与kubernetes对接,供kubelet调用使用
  • Felix:运行在每一台 Host 的 agent 进程,主要负责在宿主机上维护路由规则、网络接口管理等
  • BIRD:BGP客户端,负责监听 Host 上由 Felix 注入的路由信息,然后通过 BGP 协议广播在集群里分发路由规则信息,从而实现网络互通
  • etcd:分布式键值存储,主要负责网络元数据一致性,确保 Calico 网络状态的准确性

4.Calico 工作原理:

IPIP 模式

  1. 原始数据包从源主机的Pod容器发出,经过 veth pair 设备送达到tunl0接口
  2. tunl0接口收到数据包后,由内核将原始数据包封装到node节点网络的IP报文里,再根据Felix维护的路由规则通过物理网卡发送到目标node节点
  3. IP数据包到达目标节点的tunl0接口后,由内核解封装获取原始数据包,数据报文再根据本地路由规则经过 veth pair 设备发送到目标Pod容器

BGP 模式

本质就是通过路由规则来实现Pod之间的通信

  • 每个Pod都有一个 veth pair 设置,一端接入Pod,另一端接入宿主机网络空间,并设置了一条路由规则
  • 这些路由规则都是 Felix 维护的,由 BIRD(BGP Client) 基于 BGP 动态路由协议分发给其它节点
  1. 原始数据包从源主机的Pod容器发出,经过 veth pair 设备送达到宿主机网络空间,再根据Felix维护的路由规则通过物理网卡发送到目标node节点
  2. 目标node节点收到数据包后,会根据本地路由规则经过 veth pair 设备送达到目标 Pod 容器

七.Flannel 和 Calico 对比

1.flannel

  • 模式: UDP  VXLAN  HOST-GW
  • 默认网段:10.244.0.0/16
  • 通常会采用VXLAN模式,由于用的是叠加网络、IP隧道方式传输数据,传输过程中需要额外的封包和解包,对性能有一点的影响
  • flannel简单易用
  • 不具备复杂的网络策略配置能力,性能方面表现一般

2.calico

  • 模式:IPIP  VXLAN  BGP  CrossSubnet(混合模式)
  • 默认网段:192.168.0.0/16
  • 使用IPIP或VXLAN模式可以实现跨网段通信,但是传输过程中需要额外的封包和解包,对性能有一点的影响
  • 使用BGP模式会把每个节点看作成路由器,通过Felix、BIRD组件来维护和分发路由规则,可实现直接通过路由规则直接发送数据包到目标主机,传输中不需要额外的封包和解包,因此性能较好。但是不能跨网段通信。
  • calico性能较高,具有丰富的网络

3.总结

  • flannel适合规模较小,网络要求简单的K8S集群
  • calico适合规模较大,需要设置网络策略,固定 PodIP 的K8S集群

4.Calico的IPIP模式对比Flannel的VXLAN模式的优势(补充)

4.1.性能和效率

  • IPIP模式使用IP in lP 协议进行隧道封装,
  • VXLAN 模式使用 VXLAN 协议
  • IPIP模式的隧道封装相对较简单(IPIP 模式只是在原始IP数据包的头部再封装一层IP头部,而VXLAN则在原始二层数据帧的头部再封装一个 VXLAN头和UDP头),相对来说IPIP模式的网络开销更少

4.2.协议支持

  • IPIP 模式使用标准的 IP inlP 协议,这意味着它可以在几乎所有的网络环境中使用,并且与各种网络设备和厂商兼容。
  • 相比之下VXLAN模式需要底层网络设备(如交换机、路由器)支持 VXLAN 功能才能正常工作(当然,当前的大多数设备都是支持的)

4.3.总结

  • Calico的IPIP模式对比常规模式仍存在因封包解包而造成的性能损耗,所以,如非必要,建议还是使用常规模式

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

美摄科技企业级视频拍摄与编辑SDK解决方案

在数字化浪潮汹涌的今天,视频已成为企业传递信息、塑造品牌、连接用户不可或缺的强大媒介。为了帮助企业轻松驾驭这一视觉盛宴的制作过程,美摄科技凭借其在影视级非编技术领域的深厚积累,推出了面向企业的专业视频拍摄与编辑SDK解决方案&…

每日OJ_牛客CM26 二进制插入

目录 牛客CM26 二进制插入 解析代码 牛客CM26 二进制插入 二进制插入_牛客题霸_牛客网 解析代码 m:1024:100000000 00 n:19 : 10011 要把n的二进制值插入m的第j位到第i位,只需要把n先左移j位,然后再进行或运算(|&am…

高品质定制线缆知名智造品牌推荐-精工电联:高压线缆行业定制服务的领航者

定制线缆源头厂家推荐-精工电联:高压线缆行业定制服务的领航者 在当今这个高度信息化的社会,电力传输与分配系统的稳定运行至关重要。作为连接各个电力设备的纽带,高压线缆的质量直接关系到电力系统的安全性和稳定性。在定制高压线缆行业中&a…

android(安卓)最简单明了解释版本控制之MinSdkVersion、CompileSdkVersion、TargetSdkVersion

1、先明白几个概念 (1)平台版本(Android SDK版本号) 平台版本也就是我们平时说的安卓8、安卓9、安卓10 (2)API级别(API Level) Android 平台提供的框架 API 被称作“API 级别” …

Hugo 部署与自动更新(Git)

文章目录 Nginx部署Hugonginx.confhugo.conf Hugo自动更新Hugo自动更新流程添加访问令牌添加web hookrust实现自动更新接口 Nginx部署Hugo nginx.conf user nginx; worker_processes auto;error_log /var/log/nginx/error.log notice; pid /var/run/nginx.pid;even…

C++STL简介(三)

目录 1.vector的模拟实现 1.1begin() 1.2end() 1.3打印信息 1.4 reserve() 1.5 size() 1.6 capacity() 1.7 push_back() 1.8[ ] 1.9 pop_back() 1.10 insert&…

合并K个有序链表

题目 给你一个链表数组,每个链表都已经按升序排列。 请你将所有链表合并到一个升序链表中,返回合并后的链表。 示例1: 输入: 输出: 示例2: 输入: 输出: 示例3: 输入&…

【音视频之SDL2】Windows配置SDL2项目模板

文章目录 前言 SDL2 简介核心功能 Windows配置SDL2项目模板下载SDL2编译好的文件VS配置SDL2 测试代码效果展示 总结 前言 在开发跨平台的音视频应用程序时,SDL2(Simple DirectMedia Layer 2)是一个备受欢迎的选择。SDL2 是一个开源库&#x…

自研Vue3开源Tree组件:节点拖拽bug修复

当dropType为after,且dropNode为父节点时,bug出现了: bug原因:插入扁平化列表的位置insertIndex计算的不对: 正确的逻辑,同inner要算上子孙节点所占的位置: bug修复!

「数组」实现动态数组的功能(C++)

概述 动态数组,顾名思议即可变长度的数组。数组这种数据结构的实现是在栈空间或堆空间申请一段连续的可操作区域。 实现可变长度的动态数组结构,应该有以下操作:申请一段足够长的空间,如果数据的存入导致空间已满,则…

PackagesNotFoundError 错误表明 conda 在当前使用的镜像源中找不到 contourpy 版本 1.2.1。以下是可能的解决方法:

PackagesNotFoundError 错误表明 conda 在当前使用的镜像源中找不到 contourpy 版本 1.2.1。以下是可能的解决方法: PackagesNotFoundError 错误表明 conda 在当前使用的镜像源中找不到 contourpy 版本 1.2.1。以下是可能的解决方法: 1. 更换镜像源 虽…

rust 桌面 sip 软电话(基于tauri 、pjsip库)

本文尝试下rust 的tauri 桌面运用 原因在于体积小 1、pjsip 提供了rust 接口官方的 rust demo 没编译出来 在git找了个sip-phone-rs-master https://github.com/Charles-Schleich/sip-phone-rs 可以自己编译下pjsip lib库替换该项目的lib 2、创建一个tauri demo 引用 [depe…

计算机毕业设计选题推荐-某炼油厂盲板管理系统-Java/Python项目实战

✨作者主页:IT研究室✨ 个人简介:曾从事计算机专业培训教学,擅长Java、Python、微信小程序、Golang、安卓Android等项目实战。接项目定制开发、代码讲解、答辩教学、文档编写、降重等。 ☑文末获取源码☑ 精彩专栏推荐⬇⬇⬇ Java项目 Python…

实战:Zookeeper 简介和单点部署ZooKeeper

Zookeeper 简介 ZooKeeper是一个开源的分布式协调服务,它是Apache软件基金会下的一个项目,旨在解决分布式系统中的协调和管理问题。以下是ZooKeeper的详细简介: 一、基本定义 ZooKeeper是一个分布式的、开放源码的分布式应用程序协调服务&a…

SpringBoot的基础配置

目录 SpringBoot快速搭建web程序 第一步:导包 第二步:配置SpringBoot引导类 第三步:编写controller类 第四步:在SpirngBoot引导类中启动项目 起步依赖 SpringBoot基础配置 配置文件格式 yaml语法规则 读取yml配置文件的方…

UE5+OpenCV配置(Windows11系统)

一、概述 因为需要在UE5中使用OpenCV这些工具进行配置,所以在网络上参考借鉴一些资料进行配置。查询到不少的资料,最后将其配置成功。在这里顺便记录一下自己的配置成功的过程。 二、具体过程 (一)版本 使用Windows11系统、UE5.…

ONLYOFFICE 协作空间 2.6 已发布:表单填写房间、LDAP、优化房间和文件管理等

更新后的 ONLYOFFICE 协作空间带来了超过 20 项新功能和优化,让工作更加高效和舒适。阅读本文了解详情。 表单填写房间 这次更新增加了一种新的房间类型,可在 ONLYOFFICE 协作空间中组织简单的表单填写流程。 通过表单填写房间,目前可以完成…

将控制台内容输出到文本文件

示例代码: Imports System.IO Module Module1Sub Main()Dim fs As New FileStream("D:\Desktop\test\输出结果.txt", FileMode.Create, FileAccess.Write, FileShare.None)Dim sw As New StreamWriter(fs)Console.SetOut(sw)Console.SetError(sw)For i …

【北京迅为】《i.MX8MM嵌入式Linux开发指南》-第四篇 嵌入式Linux系统移植篇-第六十九章uboot移植

i.MX8MM处理器采用了先进的14LPCFinFET工艺,提供更快的速度和更高的电源效率;四核Cortex-A53,单核Cortex-M4,多达五个内核 ,主频高达1.8GHz,2G DDR4内存、8G EMMC存储。千兆工业级以太网、MIPI-DSI、USB HOST、WIFI/BT…

移动UI:排行榜单页面如何设计,从这五点入手,附示例。

移动UI的排行榜单页面设计需要考虑以下几个方面: 1. 页面布局: 排行榜单页面的布局应该清晰明了,可以采用列表的形式展示排行榜内容,同时考虑到移动设备的屏幕大小,应该设计合理的滚动和分页机制,确保用户…