Skip to content

Kubernetes 存储 ​

存储对象关系 ​

text
Pod → PVC → PV → CSI/存储后端
          ↑
     StorageClass(动态制备策略)
  • Volume 是 PodSpec 中的挂载声明。
  • PVC 是命名空间内对存储的请求。
  • PV 是集群级存储资源,生命周期独立于 Pod。
  • StorageClass 描述动态制备器、参数、回收策略和绑定模式。
  • CSI Driver 实现制备、挂载、扩容和快照等能力。

临时 Volume ​

emptyDir ​

yaml
volumes:
  - name: cache
    emptyDir:
      sizeLimit: 2Gi
containers:
  - name: web
    volumeMounts:
      - name: cache
        mountPath: /cache

emptyDir 与 Pod 生命周期一致,容器重启时保留,Pod 被删除或迁移时丢失。默认消耗节点临时存储;medium: Memory 使用 tmpfs 并计入容器内存相关限制,不能当持久存储。

hostPath ​

hostPath 把宿主机路径暴露给 Pod,存在节点耦合、权限逃逸和数据不一致风险。除受控节点系统组件外,不应给业务使用;优先 CSI Volume。

PVC 与动态制备 ​

yaml
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: web-data
  namespace: demo
spec:
  accessModes:
    - ReadWriteOnce
  storageClassName: fast-rwo
  resources:
    requests:
      storage: 20Gi
---
apiVersion: v1
kind: Pod
metadata:
  name: data-client
  namespace: demo
spec:
  containers:
    - name: app
      image: registry.example.com/data-client:1.0.0
      volumeMounts:
        - name: data
          mountPath: /data
  volumes:
    - name: data
      persistentVolumeClaim:
        claimName: web-data

访问模式表示后端支持的挂载语义,不一定直接强制文件系统写锁:

模式含义
ReadWriteOnce(RWO)可被单个节点读写;同节点可能有多个 Pod
ReadOnlyMany(ROX)可被多个节点只读挂载
ReadWriteMany(RWX)可被多个节点读写
ReadWriteOncePod(RWOP)集群范围只允许一个 Pod 读写,需 CSI 支持

StorageClass ​

yaml
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: fast-rwo
provisioner: csi.example.com
parameters:
  type: ssd
reclaimPolicy: Retain
allowVolumeExpansion: true
volumeBindingMode: WaitForFirstConsumer
  • WaitForFirstConsumer 等 Pod 调度需求确定后再制备,有助于在正确可用区创建卷。
  • Immediate 会在 PVC 创建时制备,可能与 Pod 节点拓扑冲突。
  • reclaimPolicy: Delete 删除 PVC 后通常删除后端卷;Retain 保留 PV/数据供人工处理。
  • 参数由 CSI 驱动定义,切勿从其他云或驱动照抄。

检查默认 StorageClass,避免未写 storageClassName 时落到错误介质:

bash
kubectl get storageclass
kubectl get storageclass -o custom-columns='NAME:.metadata.name,DEFAULT:.metadata.annotations.storageclass\.kubernetes\.io/is-default-class,MODE:.volumeBindingMode,RECLAIM:.reclaimPolicy'

绑定和调度 ​

bash
kubectl -n demo get pvc web-data
kubectl -n demo describe pvc web-data
kubectl get pv
kubectl get volumeattachments.storage.k8s.io

PVC Pending 常见原因:没有匹配 StorageClass、制备器不可用、配额不足、拓扑无可用容量、访问模式不支持,或 WaitForFirstConsumer 正在等待 Pod。

Pod ContainerCreating 时则重点检查 Attach/Mount Event、CSI Controller/Node 插件和节点权限。

容量扩容 ​

前提是 StorageClass allowVolumeExpansion: true 且驱动/文件系统支持:

bash
kubectl -n demo get pvc web-data -o yaml
kubectl -n demo patch pvc web-data --type=merge \
  -p '{"spec":{"resources":{"requests":{"storage":"40Gi"}}}}' \
  --dry-run=server -o yaml

确认后再去掉 dry-run。PVC 通常只支持扩容,不支持缩容。后端扩容和文件系统扩容可能分阶段完成,观察 PVC Conditions、容量和 CSI Event;不要在未备份时通过复制/重建尝试“缩容”。

快照与恢复 ​

快照使用 CSI Snapshot CRD,需要集群安装 snapshot controller 和驱动支持:

yaml
apiVersion: snapshot.storage.k8s.io/v1
kind: VolumeSnapshot
metadata:
  name: web-data-20260812
  namespace: demo
spec:
  volumeSnapshotClassName: csi-snapshot-retain
  source:
    persistentVolumeClaimName: web-data
bash
kubectl -n demo get volumesnapshot
kubectl -n demo describe volumesnapshot web-data-20260812

快照通常是崩溃一致而非应用一致。数据库应先使用其备份/冻结机制,定期把备份复制到独立故障域,并实际演练恢复。快照不是备份的同义词。

从快照创建 PVC:

yaml
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: web-data-restore
  namespace: demo
spec:
  storageClassName: fast-rwo
  dataSource:
    name: web-data-20260812
    kind: VolumeSnapshot
    apiGroup: snapshot.storage.k8s.io
  accessModes: [ReadWriteOnce]
  resources:
    requests:
      storage: 40Gi

StatefulSet PVC 生命周期 ​

volumeClaimTemplates 为每个副本创建独立 PVC,如 data-db-0。缩容或删除 StatefulSet 默认保留 PVC。新版本支持 PVC 保留策略,但生产仍应保守:

  • 明确 scale-down 和 StatefulSet 删除时 Retain/Delete 语义。
  • 删除前把 Pod 序号、PVC、PV、后端卷 ID 和复制成员对应起来。
  • 恢复同名 StatefulSet 之前确认旧 PVC 是否会重新绑定。
  • 不手工交换有状态副本的数据盘,除非应用层恢复流程要求。

PV 回收与危险操作 ​

bash
kubectl get pv <pv> -o yaml
kubectl -n demo get pvc <pvc> -o yaml

删除数据

删除 PVC 可能依据 PV/StorageClass 的 Delete 策略永久删除云盘;删除 PV 也可能触发后端清理。执行前必须确认回收策略、快照/备份可恢复、业务已停写以及目标 UID/卷 ID。不要把 kubectl delete pvc --all 写进清理脚本。

需要保留数据时,先按照存储平台流程保护后端资源,再考虑修改 PV 回收策略。直接编辑 claimRef、Finalizer 或强制删除对象可能造成双重绑定或泄漏,应作为受控恢复操作。

生产存储清单 ​

  • StorageClass 名称、性能、IOPS、吞吐、加密和故障域有明确 SLO。
  • 有状态应用使用应用级备份,并跨账户/区域保留所需副本。
  • RPO/RTO 通过定期恢复演练验证,而非只看快照成功。
  • PVC、PV、后端卷、快照均有容量与失败告警。
  • 文件系统写满、inode 用尽、挂载卡死和 CSI 故障有 Runbook。
  • StatefulSet、PDB、节点维护和卷拓扑协调设计。
  • 删除权限最小化,生产数据删除需要审批与保护策略。

官方资料见 Persistent Volumes 和 Volume Snapshots。

继续阅读