K8s 持久化存储有几种方式?一文了解本地盘/CSI 外接存储/K8s 原生存储的优缺点
当今云原生环境中,Kubernetes(K8s)已成为既定的容器编排工具。随着 K8s 的普及,存储也成为 K8s 用户关注的一个重要问题:为了满足不同的场景需求,K8s 可以支持基于不同架构的多种存储方案。这些方案间有什么区别?用户应如何选择?本文将从架构角度出发,详细介绍本地磁盘、CSI 外接商用存储、K8s 原生存储 3 种 K8s 持久化存储方案,并在文末对比分析各个方案的能力与优劣势。
本地磁盘
首先,K8s 支持用户直接将本地盘插到服务器上作为存储设备。由于磁盘和应用系统中间的 I/O 路径最短,本地磁盘可以提供最佳的性能。同时 RAID 提供了一定程度的可靠性的保证,可以避免因单个磁盘故障而导致的数据丢失。因此,目前有大量用户采用这种方式为有状态的应用提供存储服务。
但同时,本地磁盘方案也在可用性和扩容方面存在着巨大的缺陷:
- 本地磁盘无法提供节点级别的高可用,当物理节点发生故障时,应用无法被恢复到其他节点。如果业务系统有节点级高可用的要求,则必须由业务系统自己实现数据层面的高可用,这极大地增加了业务系统的复杂度。
- 本地磁盘也无法满足 K8s 环境下的业务敏捷性需求:业务使用的存储空间受限于本地磁盘的大小,达到磁盘空间的上限后,增加磁盘的操作步骤复杂,要想使用新增的硬盘空间,必须手工修改 Pod 中的配置,难以实现敏捷的平滑扩容。此外,要想对物理节点内的硬盘实现高可用,就需要部署 RAID,这也是相当费时、费力、费钱的方案,难以实现在短时间内为大量的应用系统配置足够的存储容量。
此外,该方案无论是部署还是故障后的修复,都需要大量人力的参与,这使得本地存储方案的运维成本大大提高。同时由于节点间的存储空间无法共享,也很容易造成存储空间的浪费。
总的来说,本地磁盘的方案只适合在业务容器化的初期阶段进行小规模试用,或者作为较低重要性的数据存储使用,难以在大规模生产场景下被广泛使用。
CSI 外接商用存储
为 K8s 提供持久化存储的另一种方式是通过容器存储接口(CSI)将 K8s 平台与底层存储基础设施连接起来,从而允许 K8s 动态调配和配置存储、实现存储操作自动化。国际分析机构 GigaOm 将这些外接存储方案进一步划分为商用存储(Enterprise Storage)和 K8s 原生存储(Kuernetes-Native Storage)两个类型。
商用存储既包括软件定义式存储(如分布式存储),也包括传统的集中式存储。与专为 K8s 环境而设计的 K8s 原生存储不同,商用存储通常情况下主要为裸金属和虚拟化环境服务,由于在企业中被广泛使用,通过 CSI 插件让商用存储获得容器存储支持能力,是非常方便且经济的选择。
然而,正因为商用存储在本质上更侧重虚拟化时代的功能特性,一些厂商推出的存储方案对云原生环境的支持能力仍有欠缺。另外值得注意的是,CNCF 认可的“云原生存储”不仅包含 K8s 原生存储,也包含基于不同架构的商用存储方案,产品间特性与性能差异较大,因此需要用户多加甄别。
外接集中式存储
K8s 集群外接集中式存储提供了可远程访问共享存储的能力。和本地磁盘的方案相比,集中式存储解决了应用系统高可用的问题,当业务 Pod 所在的服务器发生故障时,可以通过共享存储在其他节点上把应用拉起来,很多基于集中式存储的商用存储方案也提供快照、克隆、容灾等高级功能。此外,由于数据集中存储,也一定程度解决了本地存储对磁盘空间浪费的问题。
然而,传统集中式存储的架构(存储控制器加盘柜的形式)决定了它不能很好满足云原生高并发与敏捷性需求:
- 尽管集中式存储可以为单个业务系统提供较高的性能保证,但是当面临大量业务并发访问时,存储控制器则成为了性能瓶颈。如果想要满足大量业务对性能需求,需要采用多套集中式存储系统,存储系统的管理成本也会急剧上升。
- 有碍于盘柜形式,集中式存储扩展能力较差,运维工作量较大,也难以应对短时间内大量 Volume 的并发创建和销毁需求,缺少云原生敏捷性。
外接分布式存储
通过将数据分散存储在网络上的多台独立设备上,分布式存储具有优秀的横向扩展能力和敏捷性,在对接基于分布式计算架构的云原生应用时,性能和高可用方面也远优于集中式存储。Gartner 在《如何在容器与 Kubernetes 环境进行存储选型和实践》分析报告中也强调,云原生数据服务应该使用的存储必须“基于分布式架构,可以任意规模部署”。
不过,市面上可用于 K8s 的分布式存储方案鱼龙混杂,一些产品仅基于开源技术简单包装,其性能、稳定性以及对 K8s 环境的支持能力都难以达到生产级别的标准。建议用户关注具备自研技术的存储方案,并以“生产级”为标准全方位评估产品性能、可用性、可靠性、安全性和可维护性。
K8s 原生存储
K8s 原生存储是专为支持容器而构建的存储方案。这种存储与 K8s 的集成程度更深,具有容器级别的数据服务粒度和自动化存储资源运维能力,也因此能够为 K8s 上的容器应用提供灵活扩展能力与自动化运维能力。
更多关于 K8s 原生存储的特性与能力,请参考这篇内容:一文看懂 K8s 持久化存储、云原生存储、容器原生存储、K8s 原生存储有何区别。
目前,主流 K8s 原生存储主要有两种类型:开源产品(以 Rook(基于 Ceph)和 Longhorn 为代表)和闭源商用产品(以 Portworx 和 IOMesh 为代表)。这两种方案都能提供 K8s 原生的数据存储功能,也各有利弊:开源产品没有采购成本,具有技术实力的客户可以自行开发,具有社区支持,但若出现严重故障或漏洞,很难像商业厂商那样通过专业团队提供快速相应、深度解决问题的服务支持。另外,通过性能测试可以看出,目前基于自研闭源技术的 K8s 存储方案,在性能和稳定性方面要优于开源产品。欲了解测试详情,请阅读:主流 K8s 持久化存储方案特性与性能对比(Longhorn / Rook / OpenEBS / Portworx / IOMesh)。
总结:不同架构的 K8s 持久存储方案优劣势分析
基于以上分析,结合 K8s 支撑生产级核心应用系统的存储需求(以常见的数据服务为业务场景),我们通过下面的表格整理了各个存储方案在架构、性能、存储资源共享*、扩展性、高可用、安全性、运维难度、K8s 原生支持**等方面的能力,供读者参考。
* 指支持有状态应用跨节点灵活调度、多 Pod 存储同时读写。
** 指与 K8s 紧密集成,可充分发挥 K8s 轻量化、自动化、标准化、敏捷等优势。
由此可见,K8s 原生存储对 K8s 环境有状态应用的支持能力,总体来说更具优势。目前,国内首款 K8s 原生的企业级分布式存储是志凌海纳 SmartX 推出的 IOMesh。IOMesh 以 SmartX 自主研发并经过生产环境验证的分布式块存储为核心,基于容器化部署模式,可无缝融入 K8s 原生的开发和运维体系,对 K8s 集群内的存储资源进行整合与管理,为运行在 K8s 集群上的各类有状态应用提供稳定、高性能的持久化存储资源。欲了解方案详情,您可阅读博客、观看产品解读视频,或点击获取《IOMesh 用户指南》。
参考文章:
1. Key Criteria for Evaluating Kubernetes Data Storage Solutions v4.0,GigaOm,2023
https://research.gigaom.com/report/key-criteria-for-evaluating-kubernetes-data-storage-solutions/
2. How Do I Approach Storage Selection and Implementation for Containers and Kubernetes Deployments,Gartner,2022
https://www.gartner.com/document/4013517
相关文章:

K8s 持久化存储有几种方式?一文了解本地盘/CSI 外接存储/K8s 原生存储的优缺点
当今云原生环境中,Kubernetes(K8s)已成为既定的容器编排工具。随着 K8s 的普及,存储也成为 K8s 用户关注的一个重要问题:为了满足不同的场景需求,K8s 可以支持基于不同架构的多种存储方案。这些方案间有什么…...

【MySQL】3、MySQL的索引、事务、存储引擎
create table class (id int not null,name char(10),score decimal(5,2)); insert into class values (1,zhangsan,80.5); update class set namewangwu,passwd123 where id2; select * from class where id2; drop 索引的概念 是一种帮助系统,能够更快速的查询信…...

【Hello Algorithm】链表相关算法题
本篇博客介绍: 介绍下链表相关的算法题 链表相关算法题 快慢指针回文结构链表将单向链表按某值划分为左边小,中间相等,右边大的形式复制带随机指针的链表 链表相关的算法题其实都算不上难 我们真正要考虑的是一些边界问题 事实上链表题就是在…...

自动化管理管理工具----Ansible
目录 编辑 一、Ansible概念 1.1特点 二、工作机制(日常模块) 2.1 核心程序 三、Ansible 环境安装部署 四、ansible 命令行模块 4.1command 模块 4.2shell 模块 4.3cron 模块 4.4user 模块 4.5group 模块 4.6copy模块 4.7file模块 4.8ho…...

深入理解css3背景图边框
border-image知识点 重点理解 border-image-slice 设置的值将边框背景图分为9份,图像中间的舍弃,其他部分图像对应边框的相应区域放置,上右下左四角固定,border-image-repeat设置的是除四角外其他部分的显示方式。 截图来自菜鸟教…...

【rust/egui】(六)看看template的app.rs:TextEdit
说在前面 rust新手,egui没啥找到啥教程,这里自己记录下学习过程环境:windows11 22H2rust版本:rustc 1.71.1egui版本:0.22.0eframe版本:0.22.0上一篇:这里 TextEdit 文本编辑框 其定义为&#…...

Redis内存空间预估与内存优化策略:保障数据安全与性能的架构实践
推荐阅读 AI文本 OCR识别最佳实践 AI Gamma一键生成PPT工具直达链接 玩转cloud Studio 在线编码神器 玩转 GPU AI绘画、AI讲话、翻译,GPU点亮AI想象空间 资源分享 史上最全文档AI绘画stablediffusion资料分享 AI绘画关于SD,MJ,GPT,SDXL百科全书 「java、python面试题」…...

【zookeeper】zookeeper集群安装
环境规划 实际的生产使用中,我们一般推荐搭建奇数多节点的zookeeper集群,如3/5/7。在本次测试中,我使用了centos7 三台服务器搭建,复用了我搭建k8s集群的环境,如下表。 IPhostname192.168.2.140k8s-m1192.168.2.141k…...

CUDA小白 - NPP(2) - Arithmetic and Logical Operations(1)
cuda小白 原文链接 NPP GPU架构近些年也有不少的变化,具体的可以参考别的博主的介绍,都比较详细。还有一些cuda中的专有名词的含义,可以参考《详解CUDA的Context、Stream、Warp、SM、SP、Kernel、Block、Grid》 常见的NppStatus,…...

计算机视觉-LeNet
目录 LeNet LeNet在手写数字识别上的应用 LeNet在眼疾识别数据集iChallenge-PM上的应用 LeNet LeNet是最早的卷积神经网络之一。1998年,Yann LeCun第一次将LeNet卷积神经网络应用到图像分类上,在手写数字识别任务中取得了巨大成功。LeNet通过连续使用…...

Java 复习笔记 - 面向对象篇
文章目录 一,面向对象概述二,类和对象(一)类和对象的概述(二)定义类的补充注意事项 三,封装四,就近原则和this关键字(一)就近原则(二)…...

行业追踪,2023-08-31
自动复盘 2023-08-31 凡所有相,皆是虚妄。若见诸相非相,即见如来。 k 线图是最好的老师,每天持续发布板块的rps排名,追踪板块,板块来开仓,板块去清仓,丢弃自以为是的想法,板块去留让…...

科技资讯|苹果发布新专利:可在车内定位苹果的智能设备
根据美国商标和专利局近期公示的清单,苹果公司获得了一项名为《车内定位移动设备的系统和方式》专利,概述了在车内狭窄空间内如何定位 iPhone 等移动设备。 Find My 服务现阶段没有使用 UWB 来追踪 iPhone 或者 iPad,而是依赖 GPS 等相关辅…...

浅析Linux SCSI子系统:IO路径
文章目录 概述scsi_cmd:SCSI命令result字段proto_op字段proto_type字段 SCSI命令下发scsi_request_fnscsi_dev_queue_readyscsi_host_queue_ready SCSI命令响应命令请求完成的软中断处理 相关参考 概述 SCSI子系统向上与块层对接,由块层提交的对块设备的…...

linux系统(centos、Ubuntu、银河服务器)备份
制作u盘启动盘 下载usblive系统镜像 Get Kali | Kali Linux 下载u盘启动工具 balenaEtcher - Flash OS images to SD cards & USB drives 点击下载,等待下载完成 双击安装,等待安装完成 双击 启动 选择镜像 选择U盘 开始烧录 等地制作完成 进入…...

堆栈深度超过限制
报错:Cause: com.kingbase8.util.KSQLException: 错误: 堆栈深度超过限制 Hint: 在确定了平台的堆栈深度限制是足够大后,增加配置参数 "max_stack_depth"的值(当前值为2048kB).; 错误: 堆栈深度超过限制 Hint: 在确定了平台的堆栈深度限制是足…...

Linux ptrace系统调用
文章目录 一、ptrace 简介二、ptrace 参数request2.1 PTRACE_TRACEME2.2 PTRACE_PEEKTEXT, PTRACE_PEEKDATA2.3 PTRACE_PEEKUSER2.4 PTRACE_POKETEXT, PTRACE_POKEDATA2.5 PTRACE_POKEUSER2.6 PTRACE_GETREGS, PTRACE_GETFPREGS2.7 PTRACE_GETREGSET2.8 PTRACE_SETREGS, PTRACE…...

CSDN每日一练 |『贝博士发奖金』『Longest Continuous Increasing Subsequence』『最小差值』2023-09-01
CSDN每日一练 |『贝博士发奖金』『Longest Continuous Increasing Subsequence』『最小差值』2023-09-01 一、题目名称:贝博士发奖金二、题目名称:Longest Continuous Increasing Subsequence三、题目名称:最小差值一、题目名称:贝博士发奖金 时间限制:1000ms内存限制:25…...

二维数组创建方式比较
暑假跟着地质队去跑山了,到现在还没结束,今天休息的时候突然刷到了一篇关于C二维数组创建方面的文章,我觉得还是非常不错滴,就将其中提到的新方法和我已经使用过的三种方法进行了比较,发现该方法提高了二维数组的分配、…...

安达发|富士康科技集团利用自动排程APS软件打造智慧工厂
富士康科技集团作为全球领先的3C产品研发制造企业,近年来积极布局智能制造领域,通过引入先进的自动化排程系统(APS),成功打造了智慧工厂,提高了生产质量与效率,降低了生产成本。 富士康集团自2019年下半年提出在观澜厂区建立数字可…...

云计算在大数据分析中的应用与优势
文章目录 云计算在大数据分析中的应用云计算在大数据分析中的优势云计算在大数据分析中的示例未来发展和拓展结论 🎉欢迎来到AIGC人工智能专栏~云计算在大数据分析中的应用与优势 ☆* o(≧▽≦)o *☆嗨~我是IT陈寒🍹✨博客主页:IT陈寒的博客&…...

linux————ELK(日志收集系统集群)
目录 一、为什么要使用ELK 二、ELK作用 二、组件 一、elasticsearch 特点 二、logstash 工作过程 INPUT(输入) FILETER(过滤) OUTPUTS(输出) 三、kibana 三、架构类型 ELK ELKK ELFK ELFKK EFK 四、构建ELk集群…...

Leetcode213 打劫家舍2
思路:既然头尾不能同时取,那就分别算只取头或者只取尾,不考虑特殊情况的话是一个简单的动态规划 class Solution:def rob(self, nums: list[int]) -> int:if len(nums) < 3:return max(nums)max_sum [nums[0], max(nums[1], nums[0])…...

Redis全局命令
"那篝火在银河尽头~" Redis-cli命令启动 现如今,我们已经启动了Redis服务,下⾯将介绍如何使⽤redis-cli连接、操作Redis服务。客户端与服务端交互的方式有两种: ● 第⼀种是交互式⽅式: 后续所有的操作都是通过交互式的⽅式实现,…...

Xml转json
利用fastjson转换,pom文件依赖: <dependency><groupId>dom4j</groupId><artifactId>dom4j</artifactId><version>1.6.1</version> </dependency> <dependency><groupId>com.alibaba</groupId><artifa…...

Spring框架知识点汇总
01.Spring框架的基本理解 关键字:核心思想IOC/AOP,作用(解耦,简化),简单描述框架组成; Spring框架是一款轻量级的开发框架,核心思想是IOC(反转控制)和AOP&a…...

JavaScript Web APIs - 06 正则表达式
Web APIs - 06 文章目录 Web APIs - 06正则表达式正则基本使用元字符边界符量词范围字符类 替换和修饰符正则插件change 事件判断是否有类 目标:能够利用正则表达式完成小兔鲜注册页面的表单验证,具备常见的表单验证能力 正则表达式综合案例阶段案例 正…...

Python入门教程 | Python3 字符串
字符串是 Python 中最常用的数据类型。我们可以使用引号( ’ 或 " )来创建字符串。 创建字符串很简单,只要为变量分配一个值即可。例如: var1 Hello World! var2 "Tarzan"Python 访问字符串中的值 Python 不支持单字符类型ÿ…...

Playwright for Python:安装及初步使用
文章目录 一、Playwright介绍1.1 简单介绍1.2 支持的平台1.3 支持语言1.4 官方文档(python) 二、开始2.1 安装要求2.2 安装2.3 脚本录制2.4 代码示例 一、Playwright介绍 1.1 简单介绍 Playwright是微软推出来的一款自动化测试工具,是专门为…...

Ubuntu 20.04.5 怎么安装微信
这是我的ubutun版本号 在这个系统装桌面版微信很多功能不健全。搜索了很多方法,这个算是不错的一个法子。 1.添加仓库 首次使用时,你需要运行如下一条命令将移植仓库添加到系统中。 wget -O- https://deepin-wine.i-m.dev/setup.sh | sh 2.应用安装 …...