云原生钻石课程 | 第4课:Kubernetes存储架构原理深度剖析(上)

article/2025/10/10 19:16:59

点击上方“程序猿技术大咖”,关注并选择“设为星标”

回复“加群”获取入群讨论资格!

本篇文章来自《华为云云原生王者之路训练营》钻石系列课程第4课,由云原生存储解决方案Everest2.0的架构设计专家Jabin主讲,详细介绍云原生存储体系,面对复杂存储环境k8s是如何应对的。

从上节课(Kubernetes高级调度器原理详解)中我们了解了高级调度器的原理。K8s为适应不同需求的调度能力,提供了一套调度框架。在生产环境中,存储也是种类繁杂多样的:比如存储产品时不同存储提供商的产品存在差异性;存储性能时不同磁盘的性能存在差异性;存储地域时不同存储池所服务的地域不同等,面对复杂存储环境,k8s是如何应对的呢?这就是我们将要讨论的云原生存储体系。

1

Kubernetes容器存储发展历程

K8s初期为存算分离所做的解耦设计Volume,采用强耦合、灵活性差的in-tree模式,虽然已经让用户专注于业务功能设计。但这类存储卷的生命周期是跟随pod的,只能用作存储临时数据,无法做为最终数据使用。

随着k8s的不断成熟,为支持更多的应用场景,提供了一种脱离pod生命周期的、用户可管理的存储抽象设计低耦合、灵活性更强的PersistentVolume/PersistentVolumeClaim。

12b66eca1f5bf242d56b4bac010785d5.png

Kubernetes容器存储能力简介

主要包含三种类型:

1) 配置数据

  • ConfigMap:用于存储部署在Kubernetes的应用使用的配置数据,类似建议的配置中心。

  • Secret:用于存储部署在Kubernetes的应用需要的敏感信息,比如密码、token、证书等,提供了一种安全和可扩展的机制。可作为具备加密的ConfigMap使用。

  • Projected:用于汇聚多个不同卷资源,并挂载到同一个目录,当前支持的卷有:secret、configMap、downwardAPI和serviceAccountToken

2) 临时存储

  • EmptyDir:emptyDir生命周期和POD保持一致,pod删除后,emptyDir中的数据也会被清除。

  • HostPath:HostPath是将节点本地文件系统的路径映射到pod容器中,供程序使用。pod删除后,HostPath中的数据K8S不会被清除,依赖用户pod配置。

  • In-tree的网络存储:网络存储跟随pod的生命周期,通过in-tree的存储插件对接不同类型存储;其中FlexVolume虽然允许不同厂商去开发他们自己的驱动来挂载卷到集群节点上供pod使用,但生命周期与pod同步。

3) 持久存储声明

  • PersistentVolumeClaim(网络存储):存储具有独立的生命周期,可以通过存储提供商提供的out-tree插件,对接其存储。当前支持的存储插件类型有FlexVolume和CSI。

2

Kubernetes持久化存储体系

Kubernetes持久化存储体系介绍

K8s持久化存储体系包括:

  • PersistentVolume:简称pv,持久化存储,是k8s为云原生应用提供一种拥有独立生命周期的、用户可管理的存储抽象设计

  • PersistentVolumeClaim:简称pvc,持久化存储声明,是K8S为解耦云原生应用和数据存储而设计的,通过PVC可以让资源管控更细更灵活、团队职责分离、应用模板更通用,进一步解除了用户被云平台锁定的顾虑。

  • StorageClass:简称sc,存储类,是K8S平台为存储提供商提供存储接入的一种声明,通过sc和相应的存储插件(csi)为容器应用提供动态分配存储卷的能力;

  • Driver Plugin:存储驱驱动插件,由存储提供商提供,能够对接网络存储,并管理持久存储卷的生命周期。

1638d610f82052d04d4b604ed3ebd9fa.png

持久化存储优势分析

与临时存储相比,PV具有:

  • 每个存储卷可以拥有独立的生命周期,不再跟随pod创建和销毁;

  • 使能计算+数据的迁移,也即:存储卷中的数据可以随pod在集群中迁移;

  • 多个不同的pod可以共享同一个存储卷(存储卷支持共享);

cb6abcb04c9a297e8b229ae7fc3a4add.png

引入PVC/SC后,带来更大的收益:

  • 资源管控更加灵活,可适应资源管控严格、宽松的不同场景;

  • 团队职责更加明确,开发人员只需考虑存储需求(IO、容量、访问模式等),不需要关注存储类型,甚至品牌;

  • 灵活的扩展一些增强功能,比如:扩容、快照能力;

  • 应用模板更加通用,可通过参数配置,适应不同类型的k8s平台;

  • 进一步消除用户被存储提供商、云平台锁定的顾虑。

3

PV/PVC的工作原理剖析

pv/pvc的分配方式如图示:

298a7ad45e20d5be56fb0a111da8513d.png

静态卷:Volum先有资源,然后通过pv绑定与关联资源,再通过pvc去绑定pv,此时应用可通过pvc使用volum。

94b091abb9fc6821d2a19bfb31c983f1.png

动态卷:pvc先声明,再指定SC,通过pvc与SC最终创建出volum,此时pvc与pv绑定,从而为用户和应用提供存储服务。

静态卷:pv的状态转换

3d5727bc0ca5d806c8ac0021f0022991.png

静态卷:pvc的状态转换

9fb6264c220b16a17b00ee24d3ecb4a1.png

pv/pvc绑定原理分析

20e19277d8b301b8b96aa6b6395971d8.png

pvc刷选pv的流程(findBestMatchForClaim):

  • 通过size刷选恰当的pv;

  • 通过volumeMode刷选一致的pv;

  • 通过Label刷选合适的pv;

  • 通过sc刷选符合的pv;

  • 通过AccessMode刷选符合条件的pv;

  • 返回并绑定符合pvc条件,且size最小的pv。

pvc绑定pv流程解读

913f4de3a536c2ef21bd219fa99bd541.png

Kubernetes中pv/pvc相关的代码

分布位置如下图:

0e8a505be149c5bab3816d67d157b4d8.png

静态卷:pv/pvc使用场景示例

pv/pvc适合在资源管理比较严格的场景:

  • 开发人员向集群管理员申请存储需求;

  • 存储管理员按需求分配存储;

  • 集群管理员按照分配的存储创建pv;

  • 开发人员创建pvc,pvc关联合适的pv;

  • 开发人员创建pod,并且pod使用pvc。

6622cdbd7f9aaf651ccb7f51549a2c6e.png

4

华为云CCE云原生存储解决方案Everest的架构介绍

Everest架构介绍

Everest是部署在用户集群系统命名空间下(kube-system)的。Everes主要分为两部分,管理面部署在Everest-csi-controller,数据面部署在Everest-csi-driver(agent)。

130b8b412daf0599a72145e45b5d7f49.png

Everest管理面:Everest-csi-controller

  • Csi-external-provisioner:负责云存储卷的创建

  • Csi-external-resizer:负责云存储卷的扩容

  • Csi-external-attacher:负责云盘的挂卷/卸卷

  • Csi-external-snapshotter:负责云盘的快照

Everest数据面:Everest-csi-driver(agent)

  • Evs-csi-driver:负责将云盘格式化,并挂给pod使用;

  • Sfs-csi-driver:负责将文件存储卷挂给pod使用

  • Sfsturbo-csi-driver:负责将极速文件系统挂给pod使用使用;

  • Obs-csi-driver:负责将对象存储的并行文件系统准备好,并给pod使用;

云原生应用使用存储的推荐方案

如下图,存储方式不同,其规格与性能是不一致的。

9c355d764479bd6555153941039d2973.png

文件存储:

  • 使用方式:符合标准文件协议,用户可以将文件系统挂载给服务器,像使用本地文件目录一样。

  • 共享方式:数据共享,支持多台服务器共享,多台服务器可挂载相同的文件系统,数据可以共享操作和访问。

  • 场景对比:企业办公OA、AI训练、门户网站、游戏、DEVOPS、容器微服务、渲染等场景。

  • 容器场景使用说明:共享存储,可以同时为多个 Pod 提供共享存储服务,即一个 PVC 可以同时被多个 Pod 使用。读写性能相对于对象存储OSS高。

块存储

  • 使用方式:像使用传统服务器硬盘一样,用户可以对挂载到服务器上的块存储(硬盘)做格式化、创建文件系统等操作。

  • 共享方式:数据不共享,或特殊的数台服务器共享卷,每台服务器使用独立的块存储(硬盘),多服务器之间数据隔离。

  • 场景对比:关系数据库、NoSQL数据库、ELK分布式日志搜索、企业办公应用、数据仓库、高性能计算等场景

  • 容器场景使用说明:非共享存储,通过PV/PVC使用云盘时,一个云盘只能同时被一个Pod挂载。推荐使用有状态应用(StatefulSet)挂载使用云盘。无状态应用(Deployment)挂载云盘时Replica需要为1,不能保证挂载、卸载的优先顺序。

对象存储

  • 使用方式:具备标准Restful API接口,用户必须通过编程或第三方工具访问对象存储

  • 共享方式:数据共享,设备无限制,服务器、嵌入式设备、IOT设备,所有调用相同路径,均可访问共享的对象存储数据

  • 场景对比:互联网应用、OTT视频、视频监控、备份/归档、大数据/IOT等场景

  • 容器场景使用说明:共享存储,可以同时为多个 Pod 提供共享存储服务。适合于读文件场景。例如:读配置文件、视频、图片文件等场景。不擅长于写文件的应用场景。如果您的业务是将文件写入存储的场景,推荐使用文件存储。


感谢您的阅读,也欢迎您发表关于这篇文章的任何建议,关注我,技术不迷茫!

9da8f227f2b98235e5cabc1449881f3d.gif

  • 谈阿里云云效 DevOps | DevOps 不再只是 Jenkins

  • 云原生第10课:Istio 灰度发布管理

  • MySQL性能优化(七):MySQL执行计划,真的很重要,来一起学习吧

  • 微服务架构下的核心话题 (三):微服务架构的技术选型

9ea66f07d28120994015895f9083dcf1.gif

喜欢就点个"在看"呗,留言、转发朋友圈


http://chatgpt.dhexx.cn/article/yc2oW3k6.shtml

相关文章

1.k8s基本使用(测试加分)

测试为什么要学习容器技术及k8s k8s不是运维的专属技术 随着互联网技术的发展,架构也已经从单体架构发展到容器云( “微服务 k8s” 完美结合) 很多人认为,k8s只是运维需要掌握的技术,讲真,测试和运维、开发都有技术交集 所以&…

Kubernetes 持久化存储(Pod Volumes,PV和PVC)

一、Volumes 介绍 Pod Volumes 首先来看一下 Pod Volumes 的使用场景: 场景一:如果 pod 中的某一个容器在运行时异常退出,被 kubelet 重新拉起之后,如何保证之前容器产生的重要数据没有丢失?场景二:如果…

面试题引出的知识点整理

1、自旋锁&可重复锁&公平锁&共享锁&分段锁你都知道吗? 2、无锁&偏向锁&轻量级锁&重量级锁如何膨胀升级? 3、Lock底层AQS实现与Synchronized底层实现异同? 4、LongAdder的分段CAS优化机制如何设计的? 5、Java多线程内存模型…

云集成,给超大规模K8s运维带来的丝滑体验

根据IDC统计,未来五年容器基础架构软件市场将以超过40%的复合增长率爆发式增长,行业也从互联网向更多的传统行业渗透,比如金融、政府、电信,制造和能源等行业。 近年来,随着云技术的日益普及,越来越多的企…

Spring

目录 1.spring介绍 spring中的两个核心概念 1.1 IoC 1.2 AoP 1.3 Spring的优点 1.4 Spring工程构建 1.4.1 Maven Spring 依赖 1.4.2 Spring核心配置文件编写 1.4.2.1 完成控制反转以及依赖注入 1.4.2.2 测试 1.4.2.3 Spring中的IOC 产生的对象是否是单例模式 1.5 B…

动静分离 与 热点缓存

动静分离 让系统“快”起来:1、提高单次请求的效率2、减少没必要的请求 “动静分离”就是瞄着这个大方向去的。所谓“动静分离”,其实就是把用户请求的数据(如HTML页面)划分为“动态数据”和“静态数据”。简单来说,“…

天猫浏览型应用的CDN静态化架构演变

转载自:http://zhu-zhiguo.iteye.com/blog/2145496 在天猫双11活动中,商品详情、店铺等浏览型系统,通常会承受超出日常数倍甚至数十倍的流量冲击。随着历年来双11流量的大幅增加, 每年这些浏览型系统都要面临容量评估、硬件扩容、…

java 确保线程安全_确保不安全感

java 确保线程安全 33岁的克雷格斯宾塞(Craig Spencer)在治疗埃博拉病毒患者后于10月17日从非洲返回美国。 几天后,他的埃博拉病毒呈阳性React。 每个人(尤其是周围的人)和纽约人都感到关切。 纽约市市长走到媒体前&am…

经验:一个秒杀系统的设计思考

前言 秒杀大家都不陌生。自2011年首次出现以来,无论是双十一购物还是 12306 抢票,秒杀场景已随处可见。简单来说,秒杀就是在同一时刻大量请求争抢购买同一商品并完成交易的过程。 从架构视角来看,秒杀系统本质是一个高性能、高一…

Java调用C++/C

Java调用C/C有3中方式:JNI、JNA、JNative。 注:1、个人觉得还是JNA的方式最好。 2、Java和C/C交互的难点在于数据结构的对应 3、java不可以直接调用C#代码,C#代码需要托管 JNI (Android调用,普通java类似)…

kubernetes 静态存储与动态存储

静态存储 Kubernetes 同样将操作系统和 Docker 的 Volume 概念延续了下来,并且对其进一步细化。Kubernetes 将 Volume 分为持久化的 PersistentVolume 和非持久化的普通 Volume 两类。为了不与前面定义的 Volume 这个概念产生混淆,后面特指 Kubernetes …

Java多线程整理

目录 1. 进程与线程 1.1 进程 1.2 线程 1.3 并发与并行 2. 多线程 2.1 多线程的概念 2.2 多线程的好处 2.3 主线程 3. 线程的创建与启动 3.1 继承Thread类 3.2 实现Runnable接口 3.3 实现Callable接口 3.4 run方法调用和start调用的区别 4.线程的状态 4.1 线程状…

th和td标签的区别

th和td标签的区别 开发工具与关键技术: Dw HTML 作者:邹贺汗 撰写时间:2019年2月4日 在写这篇文章的时候我就知道虽然我发的不是第一个,但是说不定我写刚好给有需要的人看到了呢,所以我就写了这篇文章,下面…

html中th标签添加方法,HTML th 标签

HTML 标签 标签表示HTML表格的表头部分,该标签中的内容会以粗体显示,请参考下述示例: 实例 一个简单的 HTML 表格,带有两个表头单元格和两个数据单元格: MonthSavingsJanuary$100 尝试一下 (更多实例见页面底部) 浏览…

thymeleaf标签之th:href的使用

项目中使用springboot来进行开发,自然也就接触到了thymeleaf这套模板,如果你对c标签很熟悉的话,我觉得上手这个应该是很快的。 介绍下th:href在项目中的使用。 它的写法与th:src一样 一般写法为th:href"{值}" 如果是需要从model…

使用thymeleaf时,th:类标签失效的原因

问题出现: 最近学习后端,学到了thymeleaf这一块,学习中出现了一个问题我没有注意到,导致后面页面编写出现重大bug:项目中我使用了thymeleaf,配置的映射路由为:/index,访问首页的时候…

HTML——表头标签th的属性

<th>标签的属性和<td>标签的属性及语法格式非常的相似&#xff0c;用于设定表格中某一表头的属性。 <th>标签中常用的属性 标签描述align设置单元格内容的水平对齐方式valign设置单元格内容的垂直对齐方式bgcolor设置单元格的背景颜色background设置单元格的…

标签thead与th的区别

标签thead与th的区别 如图所示&#xff0c;thead 和 tbody标签在tr外层&#xff0c;具有更好的语义化&#xff0c;而th在 tr 之内&#xff0c;与td同级&#xff0c;起到文字加粗的效果

html中table标签、tr标签、th标签、td标签的基础知识

html中table标签、tr标签、th标签、td标签的基础知识 表格的结构表格的基本标签表格标签的基本属性table标签的基本属性tr标签的基本属性th和td标签的基本属性 表格高级样式设置相关概念外边框线样式属性frame内部边框样式属性rules 单元格合并水平方向单元格的合并垂直方向单元…

4、HTML——表格标签、表单标签

目录 一、表格标签&#xff1a;table—tr—td/th 1、合并单元格 1.1 合并同行不同列的单元格&#xff08;列合并&#xff09; 1.2 合并同列不同行的单元格&#xff08;行合并&#xff09; 二、表单标签&#xff1a;form 1、form标签 2、input输入标签 2.1 type属性…