资讯动态

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

发布时间:2026/9/27 9:05:39 来源:尧图企业网站定制
文章目录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、写入数据到创建快照、从快照恢复感谢阅读

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑