Skip to content

存储卷管理

**本文引用的文件** - [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)

目录

  1. 简介
  2. 项目结构
  3. 核心组件
  4. 架构总览
  5. 组件详解
  6. 依赖关系分析
  7. 性能与容量优化
  8. 故障排查指南
  9. 结论
  10. 附录:配置示例与最佳实践

简介

本文件面向DeviceMate项目的存储卷管理,系统性阐述Kubernetes中PersistentVolume(PV)与PersistentVolumeClaim(PVC)机制,覆盖存储类(StorageClass)选择、容量请求、访问模式配置;并结合仓库中的NFS与SeaweedFS CSI驱动实例,说明动态存储供应的工作原理与运维要点。同时给出主机目录(HostPath)、网络文件系统(NFS)、云存储卷与本地存储卷的适用场景与配置思路,并补充存储安全策略、性能优化建议及监控要点。

项目结构

与存储卷相关的关键位置如下:

图示来源

章节来源

核心组件

  • 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
  • 关键实现位置

图示来源

章节来源

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(注释说明该值在某些场景下不生效)

图示来源

章节来源

不同类型存储卷的适用场景与配置思路

  • 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封装

章节来源