04_在k8s集群中安装OpenEBS Rawfile并测试快照

发布时间:2026/9/27 9:06:12

04_在k8s集群中安装OpenEBS Rawfile并测试快照 文章目录0 背景与架构0.1 为什么需要OpenEBS Rawfile0.2 环境架构0.3 镜像拉取方案1 安装前准备1.1 检查内核模块1.2 检查文件系统类型1.3 安装 Helm2 下载OpenEBS Helm Chart2.1 在宿主机中下载Chart包2.2 传输到虚拟机Master节点也就是rockylinux10-12.3 在rockylinux10-1中解压查看子Chart的values配置3 在rockylinux10-1中创建自定义values文件4 在rockylinux10-1中安装OpenEBS4.1 清理旧安装如果之前装过4.2 执行安装4.3 处理CRD冲突5 在rockylinux10-1中验证安装5.1 查看Pod状态5.2 查看CSI Driver5.3 查看StorageClass5.4 查看VolumeSnapshotClass6 测试快照与恢复6.1 创建PVC并写入数据6.2 创建快照6.3 从快照恢复6.3.1 查询原始 Pod 所在节点6.3.2 创建从快照恢复的 PVC6.3.3 创建恢复 Pod 并通过 nodeSelector 固定到同一节点7 常见问题与解决7.1 镜像拉取失败ImagePullBackOff7.2 CRD已存在错误7.3 快照无法绑定8 总结感谢阅读0 背景与架构0.1 为什么需要OpenEBS Rawfile在 《02_在多个RockyLinux10虚拟机上安装k8s集群》 的基础上我们已经用kubeadm搭建了一个三节点的 Kubernetes v1.36.3 集群。此时执行kubectl get sc会发现没有任何 StorageClass[rootrockylinux10-1 ~]# kubectl get scNo resources found如果要学习 k8s 中关于VolumeSnapshot的内容就需要一个支持 Kubernetes 原生快照 API 的 CSI 驱动。Kubernetes 的VolumeSnapshot功能只能通过实现了 CSI 接口的存储驱动来提供而 OpenEBS Rawfile 正是这样一个基于本地存储、支持标准快照 API的轻量级方案非常适合在本地实验环境中学习和测试。0.2 环境架构IP虚拟机名称角色说明192.168.56.101rockylinux10-1control-planek8s master 节点192.168.56.102rockylinux10-2workerk8s worker 节点192.168.56.103rockylinux10-3workerk8s worker 节点0.3 镜像拉取方案由于国内网络限制我们采用以下镜像源原始仓库替换地址用途docker.iom.daocloud.io.localcache.registry:65000/docker.io本地 Docker 镜像缓存可以参考https://github.com/DaoCloud/public-image-mirror/tree/main/docs/local-cache或者看我的 《01_手动构建自己开发学习所需的镜像》 的第 19 小节部署 daocloud 的本地缓存registry.k8s.iok8s.m.daocloud.ioDaoCloud 的 k8s 镜像代理1 安装前准备1.1 检查内核模块Rawfile 驱动依赖loop设备需要确保内核模块已加载。在所有 K8s 节点上执行# 检查模块是否已加载grep-E^(loop|br_netfilter) /proc/modules# 如果未加载手动加载sudomodprobe loopsudomodprobe br_netfilter1.2 检查文件系统类型Rawfile 的快照效率取决于底层文件系统是否支持 reflink写时复制。XFS 支持ext4 不支持df-T/如果输出是xfs快照会非常高效如果是ext4快照会退化为完整复制。1.3 安装 Helm刚安装完 K8s 集群时系统里是没有 Helm 的。在master 节点rockylinux10-1上执行以下步骤安装 Helm1. 安装 opensslHelm 安装脚本需要它来校验下载文件sudodnfinstall-yopenssl--disablerepodocker-ce-stable加--disablerepodocker-ce-stable是为了跳过可能会连接失败的 Docker 仓库避免dnf卡住。2. 下载 Helm 官方安装脚本curl-fsSL-oget_helm.sh https://raw.githubusercontent.com/helm/helm/main/scripts/get-helm-33. 赋予执行权限chmod700get_helm.sh4. 运行安装脚本./get_helm.sh安装脚本会自动检测系统架构我的虚拟机是 aarch64下载对应的最新版 Helm并将其安装到/usr/local/bin。5. 验证安装helm version如果输出类似以下内容说明安装成功version.BuildInfo{Version:v3.22.0, GitCommit:..., GitTreeState:clean, GoVersion:go1.26.8}注意安装脚本可能会提示[WARNING] Could not find git. It is required for plugin installation.这不影响 Helm 本身的使用可以忽略。如果以后需要安装 Helm 插件再安装git即可sudodnfinstall-ygit--disablerepodocker-ce-stable2 下载OpenEBS Helm Chart由于虚拟机内直接访问openebs.github.io会超时我们在宿主机上下载 Chart 包然后传输到虚拟机。2.1 在宿主机中下载Chart包curl-L-oopenebs-4.6.1.tgz https://openebs.github.io/openebs/openebs-4.6.1.tgz2.2 传输到虚拟机Master节点也就是rockylinux10-1scp~/Downloads/openebs-4.6.1.tgz root192.168.56.101:/root/2.3 在rockylinux10-1中解压查看子Chart的values配置这一步很关键可以帮助我们找到正确的镜像配置路径cd/roottar-xzfopenebs-4.6.1.tgzcatopenebs/charts/rawfile-localpv/values.yaml在输出中我们重点关注以下字段# CSI Sidecar镜像的统一仓库配置csiSideCars:image:registry:registry.k8s.io# Rawfile自身镜像image:registry:docker.iorepository:openebs/rawfile-localpvtag:v0.15.13 在rockylinux10-1中创建自定义values文件在/root目录下创建openebs-custom-values.yaml内容如下openebs-crds:csi:volumeSnapshots:enabled:falsekeep:trueengines:local:lvm:enabled:falsezfs:enabled:falserawfile:enabled:truehostpath:enabled:falsereplicated:mayastor:enabled:falseloki:enabled:falsealloy:enabled:falsemayastor:crds:enabled:falseloki:enabled:falsealloy:enabled:false# localpv-provisioner来自docker.io指向本地缓存localpv-provisioner:rbac:create:trueglobalImageRegistryOverride:falsehelperPod:image:registry:m.daocloud.io.localcache.registry:65000/docker.iolocalpv:image:registry:m.daocloud.io.localcache.registry:65000/docker.io# Rawfile子chart配置rawfile-localpv:crds:csi:volumeSnapshots:enabled:falseimage:registry:m.daocloud.io.localcache.registry:65000/docker.iorepository:openebs/rawfile-localpvtag:v0.15.1csiSideCars:image:registry:k8s.m.daocloud.iopullPolicy:IfNotPresentnode:snapshotController:enabled:truecapabilities:snapshots:enabled:trueresize:enabled:trueapiServer:enabled:true关键说明engines.local.rawfile.enabled: true只启用 Rawfile 引擎禁用其他存储引擎loki.enabled: false和alloy.enabled: false关闭日志和监控组件避免拉取不必要的镜像csiSideCars.image.registry: k8s.m.daocloud.io所有 CSI sidecar 镜像统一走 DaoCloud 的 k8s 镜像代理image.registry: m.daocloud.io.localcache.registry:65000/docker.ioRawfile 自身镜像走本地 Docker 缓存4 在rockylinux10-1中安装OpenEBS4.1 清理旧安装如果之前装过helm uninstall openebs-nopenebs kubectl delete namespace openebs --ignore-not-found4.2 执行安装cd/root helminstallopenebs ./openebs-4.6.1.tgz\--namespaceopenebs\--create-namespace\-fopenebs-custom-values.yaml4.3 处理CRD冲突如果之前安装过 OpenEBS可能会遇到 CRD 已存在的错误Error: INSTALLATION FAILED: cannot patch volumesnapshotclasses.snapshot.storage.k8s.io ...解决方案有两种方案一推荐在 values 文件中设置openebs-crds.csi.volumeSnapshots.enabled: false跳过 CRD 管理上面的配置已经这样做了。方案二手动删除残留的 CRD 后立即安装kubectl delete crd volumesnapshotclasses.snapshot.storage.k8s.io\volumesnapshotcontents.snapshot.storage.k8s.io\volumesnapshots.snapshot.storage.k8s.io --ignore-not-found5 在rockylinux10-1中验证安装5.1 查看Pod状态kubectl get pods-nopenebs期望输出NAME READY STATUS RESTARTS AGE openebs-rawfile-localpv-controller-554cf4fb59-vxg5m 3/3 Running 0 118s openebs-rawfile-localpv-node-5zjkc 5/5 Running 0 118s openebs-rawfile-localpv-node-hfd54 5/5 Running 0 118s5.2 查看CSI Driverkubectl get csidriver|greprawfile期望输出rawfile.csi.openebs.io false true true unset false Persistent 2m5s5.3 查看StorageClasskubectl get sc|greprawfile期望输出rawfile-localpv rawfile.csi.openebs.io Delete WaitForFirstConsumer true 2m21s5.4 查看VolumeSnapshotClasskubectl get volumesnapshotclass期望输出NAME DRIVER DELETIONPOLICY AGE rawfile-localpv rawfile.csi.openebs.io Delete 2m31s注意OpenEBS 4.6.1 会自动创建一个名为rawfile-localpv的 VolumeSnapshotClass无需手动创建。6 测试快照与恢复6.1 创建PVC并写入数据创建文件test-pvc.yamlapiVersion:v1kind:PersistentVolumeClaimmetadata:name:demo-rawfile-pvcspec:storageClassName:rawfile-localpvaccessModes:[ReadWriteOnce]resources:requests:storage:1Gi创建文件test-pod.yamlapiVersion:v1kind:Podmetadata:name:demo-rawfile-podspec:containers:-name:busyboximage:m.daocloud.io.localcache.registry:65000/docker.io/library/busybox:1.38.0command:[/bin/sh,-c,echo before snapshot /mnt/data/hello.txt sleep infinity]volumeMounts:-name:datamountPath:/mnt/datavolumes:-name:datapersistentVolumeClaim:claimName:demo-rawfile-pvc应用并验证kubectl apply-ftest-pvc.yaml kubectl apply-ftest-pod.yaml kubectl get pvc,pod6.2 创建快照创建文件test-snapshot.yamlapiVersion:snapshot.storage.k8s.io/v1kind:VolumeSnapshotmetadata:name:demo-rawfile-snapshotspec:volumeSnapshotClassName:rawfile-localpvsource:persistentVolumeClaimName:demo-rawfile-pvc应用并等待就绪kubectl apply-ftest-snapshot.yaml kubectl get volumesnapshot-w等READYTOUSE变为true即可。6.3 从快照恢复由于 Rawfile 是节点本地存储快照数据也保存在原 Pod 所在节点的本地磁盘上。因此从快照恢复的 PVC 必须调度到与原始 Pod 相同的节点否则恢复的 Pod 会因为找不到本地卷而一直处于Pending状态。6.3.1 查询原始 Pod 所在节点kubectl get pod demo-rawfile-pod-owide输出示例NAME READY STATUS RESTARTS AGE IP NODE demo-rawfile-pod 1/1 Running 0 10m 10.244.232.50 rockylinux10-2记下NODE列的值例如rockylinux10-2。6.3.2 创建从快照恢复的 PVC创建文件test-restore.yamlapiVersion:v1kind:PersistentVolumeClaimmetadata:name:demo-rawfile-restorespec:storageClassName:rawfile-localpvaccessModes:[ReadWriteOnce]resources:requests:storage:1GidataSource:name:demo-rawfile-snapshotkind:VolumeSnapshotapiGroup:snapshot.storage.k8s.io应用kubectl apply-ftest-restore.yaml6.3.3 创建恢复 Pod 并通过 nodeSelector 固定到同一节点创建文件test-restore-pod.yaml将nodeSelector的值修改为上一步查询到的节点名称apiVersion:v1kind:Podmetadata:name:demo-restore-podspec:nodeSelector:kubernetes.io/hostname:rockylinux10-2# 替换为你实际查询到的节点名containers:-name:busyboximage:m.daocloud.io.localcache.registry:65000/docker.io/library/busybox:1.38.0command:[/bin/sh,-c,cat /mnt/data/hello.txt sleep infinity]volumeMounts:-name:datamountPath:/mnt/datavolumes:-name:datapersistentVolumeClaim:claimName:demo-rawfile-restore应用并验证kubectl apply-ftest-restore-pod.yaml kubectl logs demo-restore-pod如果日志输出before snapshot说明快照恢复成功。说明nodeSelector通过节点的标准标签kubernetes.io/hostname进行匹配语义清晰且兼容默认调度器的其他调度策略。如果你希望更精确地控制也可以使用nodeName直接指定节点但nodeSelector是更推荐的方式。7 常见问题与解决7.1 镜像拉取失败ImagePullBackOff现象Pod 处于ImagePullBackOff或ErrImagePull状态。排查kubectl describe pod-nopenebspod-name|grep-EImage:|Failed常见原因与解决镜像地址问题解决方案docker.io/openebs/...未指向本地缓存检查rawfile-localpv.image.registry配置registry.k8s.io/sig-storage/...未指向 k8s 代理检查csiSideCars.image.registry配置docker.io/grafana/...loki/alloy 未禁用设置loki.enabled: false和alloy.enabled: false7.2 CRD已存在错误现象安装时提示customresourcedefinitions ... already exists。解决在 values 文件中设置openebs-crds.csi.volumeSnapshots.enabled: false。7.3 快照无法绑定现象VolumeSnapshot一直处于Pending状态。排查kubectl describe volumesnapshot demo-rawfile-snapshot kubectl get pods-nopenebs|grepsnapshot确保snapshotController已启用且其镜像可正常拉取。8 总结通过本文我们完成了以下工作理解了 OpenEBS Rawfile 的用途提供支持 Kubernetes 原生 VolumeSnapshot API 的本地存储方案安装了 Helm在 master 节点上通过官方脚本安装了 Helm配置了镜像替换将docker.io指向本地缓存将registry.k8s.io指向 DaoCloud 代理创建了自定义 values 文件禁用不必要的组件loki、alloy、mayastor只保留 Rawfile 和快照功能成功安装了 OpenEBS Rawfile验证了 CSI Driver、StorageClass 和 VolumeSnapshotClass测试了完整的快照流程从创建 PVC、写入数据到创建快照、从快照恢复感谢阅读
延伸阅读

更多相关文章

2026/9/27 9:06:12

免费数据源网站搭站要多少钱?避坑指南

免费数据源网站搭站要多少钱?避坑指南 网站做好了没人访问,这是最让老板们头疼的事。很多客户找到我,第一句话就是:“我花了多少钱做的站,怎么流量还是零?”这时候我得先泼盆冷水,别急着怪搜索引擎,先看看你的数据源和架构是不是从一开始就埋了雷。很…

2026/9/27 9:51:16

什么是网络营销发展的助推器2026最新

网站被黑挂马急死了?搞懂网络营销助推器多少钱才不踩坑 昨天凌晨两点,后台突然收到监控报警,客户的老官网首页被替换成了色情赌博链接,整站数据全乱,SEO排名一夜清零。这种“网站被黑挂马不知道怎么办”的焦虑,很多站长都经历过。更让人崩溃的是,找…

2026/9/27 9:51:15

wordpressdux1.8速查手册

WordPress Dux 1.8实战:网站被黑挂马自救与性能优化全攻略 网站刚上线三天,后台突然弹出一堆乱码广告,打开页面全是赌博链接?别慌,这不是天方夜谭,而是很多用 WordPress…

2026/9/27 9:51:15

196.排班

生产排班表和原材料入库记录很快送到了陈远手上。他坐在孙国平那间简陋的办公室里,将两份资料并排摊在桌上,开始逐行比对。办公室不大,一张办公桌、一台电脑、一个文件柜、几把椅子,墙上挂着一张金丰铸钢的组织架构图和几面锦旗&a…

2026/9/27 0:00:45

东莞市品牌网站建设报价常见报错与解决

东莞品牌网站建设报价单背后:一份保姆级建站教程避坑实录 网站做好了没人访问,这大概是很多老板最头疼的事。花了大几万做的品牌站,上线后流量惨淡,比路边摊还冷清。别急着骂外包公司,很多“东莞品牌网站建设报价”里藏着不少猫腻,比如用模板站冒充定制…

2026/9/27 0:00:45

如何划分训练/验证集:Spirula Studio五种eval_mode策略详解

如何划分训练/验证集:Spirula Studio五种eval_mode策略详解 【免费下载链接】spirula-studio Cross-vendor 3D Gaussian Splatting trainer - video to splat to mesh, Vulkan or CUDA. 项目地址: https://gitcode.com/GitHub_Trending/sp/spirula-studio Sp…

2026/9/27 0:00:45

SEO怎么推广速查手册新手避坑实战指南

SEO怎么推广速查手册新手避坑实战指南 模板网站太丑不够用?别急着加滤镜,那是治标不治本。很多老板盯着后台流量掉得眼红,却还在纠结首页Banner的圆角是不是3像素。这就像穿着西装去挖土,姿势不对,努力白费。我整理这份 速查手册…

2026/9/27 0:00:45

东莞市品牌网站建设报价常见报错与解决

东莞品牌网站建设报价单背后:一份保姆级建站教程避坑实录 网站做好了没人访问,这大概是很多老板最头疼的事。花了大几万做的品牌站,上线后流量惨淡,比路边摊还冷清。别急着骂外包公司,很多“东莞品牌网站建设报价”里藏着不少猫腻,比如用模板站冒充定制…

2026/9/27 0:00:45

如何划分训练/验证集:Spirula Studio五种eval_mode策略详解

如何划分训练/验证集:Spirula Studio五种eval_mode策略详解 【免费下载链接】spirula-studio Cross-vendor 3D Gaussian Splatting trainer - video to splat to mesh, Vulkan or CUDA. 项目地址: https://gitcode.com/GitHub_Trending/sp/spirula-studio Sp…

2026/9/27 0:00:45

SEO怎么推广速查手册新手避坑实战指南

SEO怎么推广速查手册新手避坑实战指南 模板网站太丑不够用?别急着加滤镜,那是治标不治本。很多老板盯着后台流量掉得眼红,却还在纠结首页Banner的圆角是不是3像素。这就像穿着西装去挖土,姿势不对,努力白费。我整理这份 速查手册…

2026/9/25 20:55:38

USB Type-C PCB布局分区设计:电源、高速信号与PD协议全攻略

做硬件这行,Type-C接口算是典型的“看着简单,做起来全坑”的东西。光引脚就24个,高低速信号、电源、控制线全部塞在一个小小的连接器里,如果PCB布局不做规划,打样回来基本就是“插上没反应”、“高速掉线”、“静电一打…

2026/9/26 19:58:38

系统编程学习原型如何补齐稳定性边界

系统编程学习原型如何补齐稳定性边界预算有限时&#xff0c;我先优化明显多余的复制&#xff0c;而不是猜测性地换容器。用借用传递只读数据通常就能减少分配&#xff1a; fn parse(line: &str) -> Result<Item, Error> { /* ... */ }用基准确认热点确实在分配&am…

2026/9/25 18:34:56

雨花区哪家财务公司代理记账比较好?

在雨花区&#xff0c;企业处理财税事务常常面临诸多挑战&#xff0c;选择一家靠谱的财务公司至关重要。湖南巨勤财务管理咨询有限公司就是本地正规实体财税服务机构&#xff0c;深耕本地工商财税行业多年&#xff0c;熟悉当地工商局、税务局最新政策与申报流程。主营公司注册、…

还想了解更多?直接咨询顾问

免费诊断 + 免费方案 + 透明报价。

全国咨询热线400-8866-253
免费获取方案
☎咨询二维码 ☎ ↑