KubeSphere 在最小化安装时,默认使用 OpenEBS Local PV 作为存储类型(StorageClass local)。所有 PVC 数据最终落在 host 节点的本地磁盘上,默认路径为 /var/openebs/local/

一、为什么是 /var/openebs/local/

OpenEBS Local PV 的工作机制:

PVC (Pod 申请存储)
  ↓
StorageClass "local" / openebs.io/local
  ↓
OpenEBS Local PV Provisioner
  ↓
在 host 节点 /var/openebs/local/ 下自动创建子目录
  ↓
通过 hostPath 把子目录挂载进 Pod

与 NFS、CSI 等网络存储不同,Local PV 数据只在单个节点本地,Pod 漂移到其他节点就读不到。

二、查看 PVC 数据在哪

2.1 查 PVC 实际挂载到哪个 host

# 看 PVC 绑定到哪个 PV
kubectl get pvc -A -o wide

# 看 PV 的 hostPath 路径
kubectl get pv -o jsonpath='{range .items[*]}{.metadata.name}{"\t"}{.spec.local.path}{"\n"}{end}'

2.2 直接进节点查看

# 进节点
ssh node-1

# 看 openebs local 下的所有 PVC 数据
ls /var/openebs/local/

# 典型输出
pvc-0a1b2c3d4e5f6a7b8c9d0e1f2a3b4c5d
pvc-1b2c3d4e5f6a7b8c9d0e1f2a3b4c5d6e
...

每个 pvc-xxx 子目录对应一个 PVC 的数据。

2.3 查看某个 PVC 占用的空间

du -sh /var/openebs/local/pvc-<id>

三、实战场景

3.1 PVC 数据误删恢复

Local PV 的 reclaimPolicy 默认是 Delete,PVC 删除后子目录会被 Provisioner 一起清掉——这是 Local PV 最危险的特性。

生产建议:

apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: local
provisioner: openebs.io/local
reclaimPolicy: Retain        # 改为 Retain,防止误删
volumeBindingMode: WaitForFirstConsumer

改成 Retain 后,PVC 删除只会释放 PV 绑定,子目录数据保留,你可以手工备份后再清理。

3.2 节点磁盘满了怎么办

# 1. 找出哪些 PVC 占空间最大
du -sh /var/openebs/local/* | sort -hr | head -10

# 2. 找这些 PVC 是哪个 Pod 在用
kubectl get pvc -A | grep <pvc-name>

# 3. 评估:删除 PVC 还是扩容 host 节点

3.3 PVC 数据迁移到新节点

Local PV 数据无法直接迁移(没有网络访问能力),只有两种方案:

  1. 应用层导出/导入:在 Pod 内 kubectl exec 跑备份命令(如 mysqldumppg_dump)
  2. 重建 PVC:新节点上建新 PVC,应用启动后从备份恢复

四、常见问题

问题 原因 处理
Pod 一直 Pending,提示找不到节点 Local PV 绑死在原节点,新节点无对应路径 WaitForFirstConsumer 模式或手动调度
/var/openebs/local 占满 host 磁盘 Local PV 数据全在本地,无容量回收 扩容 host 或迁移到 NFS/Ceph
节点宕机后 PVC 数据丢失 Local PV 没有副本,只有一份 重要业务用网络存储(NFS/Ceph)
想改默认路径(如 /data/openebs) helm 部署时改 hostpath 见下

自定义默认路径

KubeSphere 安装时若使用 local 模式,可在 cluster-configuration.yaml 中修改:

openebs:
  hostpath:
    path: /data/openebs    # 自定义路径

⚠️ 生产环境慎用 Local PV:无高可用、无跨节点共享、性能看单盘 IOPS。KubeSphere 文档也只推荐用于开发测试或非关键业务。生产用 NFS、Ceph 或云厂商块存储。

相关阅读