Appearance
存储卷管理
**本文引用的文件** - [nfs.yaml](file://lemes-cloud/src/devops/k8s/nfs.yaml) - [pvc-seaweedfs.yaml](file://lemes-cloud/src/devops/k8s/service/base/pvc-seaweedfs.yaml) - [application.yml(dm-store)](file://lemes-cloud/lemes-business-devicemate/lemes-service-dm-store/lemes-service-dm-store-server/src/main/resources/application.yml) - [bootstrap.yml(dm-store)](file://lemes-cloud/lemes-business-devicemate/lemes-service-dm-store/lemes-service-dm-store-server/src/main/resources/bootstrap.yml) - [localstorage.js](file://app/devicemate-app/utils/localstorage.js)目录
简介
本文件面向DeviceMate项目的存储卷管理,系统性阐述Kubernetes中PersistentVolume(PV)与PersistentVolumeClaim(PVC)机制,覆盖存储类(StorageClass)选择、容量请求、访问模式配置;并结合仓库中的NFS与SeaweedFS CSI驱动实例,说明动态存储供应的工作原理与运维要点。同时给出主机目录(HostPath)、网络文件系统(NFS)、云存储卷与本地存储卷的适用场景与配置思路,并补充存储安全策略、性能优化建议及监控要点。
项目结构
与存储卷相关的关键位置如下:
- K8s部署清单与动态供应
- NFS动态供应与默认StorageClass:nfs.yaml
- SeaweedFS CSI驱动与PVC:pvc-seaweedfs.yaml
- 业务侧配置
- dm-store服务配置(端口、日志、Nacos注册等):application.yml(dm-store),bootstrap.yml(dm-store)
- 前端本地存储
- 本地缓存工具(非持久化卷,用于前端离线数据):localstorage.js
图示来源
- nfs.yaml:1-136
- pvc-seaweedfs.yaml:1-396
- application.yml(dm-store):1-28
- bootstrap.yml(dm-store):1-50
- localstorage.js:1-21
章节来源
- nfs.yaml:1-136
- pvc-seaweedfs.yaml:1-396
- application.yml(dm-store):1-28
- bootstrap.yml(dm-store):1-50
- localstorage.js:1-21
核心组件
- StorageClass(存储类)
- 作用:定义可被动态创建的存储模板,决定后端提供者、回收策略、绑定模式等。
- 示例:NFS动态供应的StorageClass与默认类标注;SeaweedFS CSI驱动的StorageClass。
- PersistentVolume(持久卷)
- 作用:对集群中的一块存储资源的抽象,通常由管理员或动态供应器创建。
- 示例:NFS清单中通过Provisioner动态创建的PV;SeaweedFS CSI控制器负责创建/管理PV。
- PersistentVolumeClaim(持久卷声明)
- 作用:用户对存储的请求,绑定到合适的PV上。
- 示例:NFS PVC与SeaweedFS PVC,分别绑定到对应StorageClass。
- 动态供应器(Provisioner)
- 作用:根据PVC请求自动创建PV。
- 示例:NFS Provisioner容器;SeaweedFS CSI Controller与Node插件。
章节来源
架构总览
下图展示从“业务请求PVC”到“动态创建PV并挂载”的关键流程,映射至仓库中的实际清单与组件。
图示来源
组件详解
NFS 动态供应(StorageClass + PVC)
- StorageClass配置要点
- 提供者(provisioner):cluster.local/nfs-provisioner
- 回收策略(reclaimPolicy):Retain
- 绑定模式(volumeBindingMode):Immediate
- 挂载选项(mountOptions):如vers=4.1、noatime
- 默认类标注:storageclass.kubernetes.io/is-default-class
- PVC配置要点
- 访问模式:ReadWriteMany
- 请求容量:如50Gi
- 存储类:nfs-provisioner
- 关键实现位置
- StorageClass与PVC定义:nfs.yaml:104-135
- NFS Provisioner容器与端口暴露:nfs.yaml:47-99
图示来源
章节来源
SeaweedFS CSI 动态供应(StorageClass + PVC + 控制器/节点)
- StorageClass
- 提供者(provisioner):seaweedfs-csi-driver
- 用途:通过CSI控制器与节点插件实现动态卷生命周期管理
- 控制器组件
- CSI Provisioner:负责创建/删除卷
- CSI Attacher:负责卷与节点的附加
- SeaweedFS 插件:对接后端filer(10.176.66.58:9332)
- 节点组件
- Driver Registrar:注册CSI插件
- SeaweedFS CSI Node 插件:在节点侧挂载卷
- PVC
- 访问模式:ReadWriteMany
- 存储类:seaweedfs-storage
- 容量请求:20Gi(注释说明该值在某些场景下不生效)
图示来源
- pvc-seaweedfs.yaml:14-21
- pvc-seaweedfs.yaml:202-298
- pvc-seaweedfs.yaml:299-374
- pvc-seaweedfs.yaml:385-396
章节来源
- pvc-seaweedfs.yaml:14-21
- pvc-seaweedfs.yaml:202-298
- pvc-seaweedfs.yaml:299-374
- pvc-seaweedfs.yaml:385-396
不同类型存储卷的适用场景与配置思路
- HostPath
- 场景:单节点测试、临时数据、开发环境
- 配置:在Pod的volume中指定hostPath路径;注意节点路径存在性与权限
- 注意:跨节点不可共享,不适合生产多副本
- NFS
- 场景:多Pod共享读写、需要持久化且跨节点访问
- 配置:StorageClass使用nfs-provisioner;PVC设置ReadWriteMany;挂载选项按需调整
- 云存储卷(以AWS EBS为例)
- 场景:公有云弹性块存储,按需扩容
- 配置:StorageClass使用云厂商提供的provisioner;PVC设置容量与IOPS/吞吐要求
- 本地存储卷(Local PV)
- 场景:高性能本地SSD/NVMe,低延迟访问
- 配置:静态创建PV并绑定至节点;PVC显式选择对应PV或通过StorageClass动态创建
[本节为通用概念说明,不直接分析具体文件,故无“章节来源”]
依赖关系分析
- dm-store服务通过Nacos进行服务发现与配置拉取,其日志输出路径等运行时参数与存储卷无直接耦合,但业务可能依赖后端存储(数据库/对象存储)。
- 前端localstorage仅用于本地缓存,不涉及K8s存储卷。
图示来源
章节来源
性能与容量优化
- I/O调度与内核参数
- 在宿主机层面合理设置块设备队列深度、IO调度算法,避免抖动
- 缓存策略
- 对频繁读取的数据可考虑使用内存缓存(如应用层LRU),减少磁盘随机读
- 存储监控
- 使用Prometheus+Grafana采集卷使用率、IOPS、延迟指标,结合告警阈值
- 容量管理
- 合理设置PVC容量请求与StorageClass的配额限制,避免资源争用
- 访问模式
- 多Pod共享优先使用ReadWriteMany;单写或多写场景评估后端能力与一致性
[本节为通用指导,不直接分析具体文件,故无“章节来源”]
故障排查指南
- PVC长期处于Pending
- 检查StorageClass是否存在、provisioner是否正确
- 检查节点可调度性与容忍度
- 查看事件:kubectl describe pvc
- PV无法绑定
- 检查容量请求是否超过可用PV
- 检查访问模式与PV不兼容
- 动态供应失败
- 查看Provisioner日志(nfs或CSI控制器)
- 校验后端存储可达性(如NFS导出路径、SeaweedFS Filer地址)
- 挂载失败
- 检查mountOptions与内核版本兼容性
- 检查节点权限与SELinux/AppArmor策略
[本节为通用指导,不直接分析具体文件,故无“章节来源”]
结论
DeviceMate项目在Kubernetes侧通过NFS与SeaweedFS CSI实现了动态存储供应,结合StorageClass与PVC完成了对业务的灵活支撑。建议在生产环境中:
- 明确不同业务的存储需求,选择合适的访问模式与后端
- 强化监控与容量规划,确保动态供应稳定
- 加强安全策略(访问控制、网络隔离、审计),保障数据安全
[本节为总结性内容,不直接分析具体文件,故无“章节来源”]
附录:配置示例与最佳实践
StorageClass 配置要点
- NFS(默认类)
- provisioner:cluster.local/nfs-provisioner
- reclaimPolicy:Retain
- volumeBindingMode:Immediate
- mountOptions:vers=4.1、noatime
- 默认类标注:storageclass.kubernetes.io/is-default-class=true
- SeaweedFS
- provisioner:seaweedfs-csi-driver
- 通过CSI控制器与节点插件完成卷生命周期管理
章节来源
PVC 配置要点
- NFS PVC
- accessModes:ReadWriteMany
- resources.requests.storage:如50Gi
- storageClassName:nfs-provisioner
- SeaweedFS PVC
- accessModes:ReadWriteMany
- storageClassName:seaweedfs-storage
- resources.requests.storage:20Gi(注释说明该值在某些场景下不生效)
章节来源
dm-store 服务配置要点
- 端口与优雅停机
- server.port:8042
- server.shutdown:graceful
- Nacos注册与配置
- spring.cloud.nacos.discovery.server-addr、namespace、group
- spring.cloud.nacos.config.shared-configs
- 日志路径
- logging.file.path:logs/$
章节来源
前端本地缓存(非持久化卷)
- 作用:前端本地存储(如登录态、临时数据)
- 方法:基于uni.setStorageSync/uni.getStorageSync封装
章节来源