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

yaml
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: fast
provisioner: kubernetes.io/aws-ebs
parameters:
  type: gp2
  • 示例: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

数据卷迁移

迁移数据卷的目录,需要先停止所有使用 PVC 的 Pod,然后迁移数据,最后修改 PV 的目录。

bash
/opt/local-path-provisioner/

所以所有 local-path 的卷都在这里。


适用于迁移目标是:

换目录(例如 /data -> /mnt/nvme) 换磁盘 换节点(但不换 storageClass)

步骤 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

步骤 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