Skip to content

存储管理

HostPath

HostPath 将宿主机的某个目录挂载到 Pod 内。

  • 适用场景

    • 日志采集。
    • 本地测试。
    • 注意:不推荐在生产环境中使用(存在安全风险)。
  • 示例

yaml
volumes:
  - name: host-volume
    hostPath:
      path: /data/logs
      type: Directory

EmptyDir

EmptyDir 是在 Pod 创建时被初始化的临时存储。

  • 特点

    • 容器重启数据不丢失。
    • Pod 删除后数据即清空。
    • 可用于容器间数据共享、缓存临时文件等。
  • 示例

yaml
volumes:
  - name: cache
    emptyDir: {}

NFS

NFS(Network File System) 是一种共享文件存储方式,多个 Pod 可以同时读写。

  • 特点

    • 跨节点共享。
    • 需事先部署 NFS 服务。
    • 读写权限需配置合理。
  • 示例

yaml
volumes:
  - name: nfs-volume
    nfs:
      server: 10.0.0.1
      path: /exports/data

PV / PVC(持久卷)

PersistentVolume(PV)

  • 集群管理员提前配置的存储资源。
  • 抽象底层存储设备(如 NFS、云盘等)。

PersistentVolumeClaim(PVC)

  • 用户申请存储的声明。
  • 系统会自动匹配满足需求的 PV。
  • 示例
yaml
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: my-pvc
spec:
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 1Gi

存储类(StorageClass)

StorageClass 定义了存储卷的类型、配置策略、动态供应方式等。

  • 用途

    • 实现 PVC 自动绑定与卷创建。
    • 支持不同级别性能(如 SSD、普通磁盘等)。
  • 示例:AWS EBS CSI

yaml
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: fast
provisioner: ebs.csi.aws.com
parameters:
  type: gp3
  • 示例:local-path
bash
kubectl apply -f https://raw.githubusercontent.com/rancher/local-path-provisioner/v0.0.29/deploy/local-path-storage.yaml

kubectl -n local-path-storage logs -f -l app=local-path-provisioner

PVC 示例:

yaml
spec:
  storageClassName: fast

数据卷迁移

下面只讨论 rancher local-path-provisioner 的本地目录迁移,不适用于 NFS、云盘或其他 CSI 驱动。local volume 与节点和路径绑定,直接改 provisioner 的默认目录通常只影响新建卷,不会自动修改已有 PV 的 local.pathhostPath.path 或节点亲和性。

本地卷迁移是高风险操作。操作前应备份数据,确认 PV reclaimPolicy,记录 PVC、PV、节点和实际目录映射,并在恢复业务前校验数据。跨节点迁移还必须更新或重建 PV 的节点亲和性,不能只修改 StorageClass。

bash
/opt/local-path-provisioner/

默认安装通常使用这个父目录,但实际路径以 local-path-config 和每个 PV 的定义为准。


适用于迁移目标是:

换目录(例如 /data -> /mnt/nvme) 换磁盘 同节点换目录或磁盘。跨节点迁移需要额外处理 PV 节点亲和性,不属于下面的简单流程。

步骤 1:暂停 local-path-provisioner(避免新建)

bash
kubectl scale deployment local-path-provisioner -n local-path-storage --replicas=0

步骤 2:停止使用 PVC 的 Pod(确保数据不会写入)

例如:

bash
kubectl scale deploy myapp -n default --replicas=0
kubectl -n <namespace> scale deploy --all --replicas=0

步骤 3:拷贝数据到新目录(关键步骤)

例子:你准备把 local-path-provisioner 从 /opt/local-path-provisioner 迁到 /data/local-pv

bash
mkdir -p /data/local-pv
rsync -avh --progress --numeric-ids /opt/local-path-provisioner/ /data/local-pv/

步骤 4:修改 local-path-provisioner 的 ConfigMap

获取当前 configmap:

bash
kubectl -n local-path-storage get cm local-path-config -o yaml > lpp.yaml

编辑:

yaml
# 原来:
# hostpath: "/opt/local-path-provisioner"
hostpath: "/data/local-pv"

应用后,这个配置主要决定后续新建卷的位置:

bash
kubectl apply -f lpp.yaml

已有 PV 需要逐个核对其实际 volume source。不要直接修改 Bound PV 后就恢复业务;某些字段不可变,可能需要保留底层数据后重建 PV,并用 Retain 回收策略重新绑定 PVC。

步骤 5:重新启动 local-path-provisioner

bash
kubectl scale deployment local-path-provisioner -n local-path-storage --replicas=1

步骤 6:恢复使用该 PVC 的应用

bash
kubectl scale deploy myapp -n default --replicas=1