Kubernetes 存储
存储对象关系
Pod → PVC → PV → CSI/存储后端
↑
StorageClass(动态制备策略)- Volume 是 PodSpec 中的挂载声明。
- PVC 是命名空间内对存储的请求。
- PV 是集群级存储资源,生命周期独立于 Pod。
- StorageClass 描述动态制备器、参数、回收策略和绑定模式。
- CSI Driver 实现制备、挂载、扩容和快照等能力。
临时 Volume
emptyDir
volumes:
- name: cache
emptyDir:
sizeLimit: 2Gi
containers:
- name: web
volumeMounts:
- name: cache
mountPath: /cacheemptyDir 与 Pod 生命周期一致,容器重启时保留,Pod 被删除或迁移时丢失。默认消耗节点临时存储;medium: Memory 使用 tmpfs 并计入容器内存相关限制,不能当持久存储。
hostPath
hostPath 把宿主机路径暴露给 Pod,存在节点耦合、权限逃逸和数据不一致风险。除受控节点系统组件外,不应给业务使用;优先 CSI Volume。
PVC 与动态制备
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
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: fast-rwo
provisioner: csi.example.com
parameters:
type: ssd
reclaimPolicy: Retain
allowVolumeExpansion: true
volumeBindingMode: WaitForFirstConsumerWaitForFirstConsumer等 Pod 调度需求确定后再制备,有助于在正确可用区创建卷。Immediate会在 PVC 创建时制备,可能与 Pod 节点拓扑冲突。reclaimPolicy: Delete删除 PVC 后通常删除后端卷;Retain保留 PV/数据供人工处理。- 参数由 CSI 驱动定义,切勿从其他云或驱动照抄。
检查默认 StorageClass,避免未写 storageClassName 时落到错误介质:
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'绑定和调度
kubectl -n demo get pvc web-data
kubectl -n demo describe pvc web-data
kubectl get pv
kubectl get volumeattachments.storage.k8s.ioPVC Pending 常见原因:没有匹配 StorageClass、制备器不可用、配额不足、拓扑无可用容量、访问模式不支持,或 WaitForFirstConsumer 正在等待 Pod。
Pod ContainerCreating 时则重点检查 Attach/Mount Event、CSI Controller/Node 插件和节点权限。
容量扩容
前提是 StorageClass allowVolumeExpansion: true 且驱动/文件系统支持:
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 和驱动支持:
apiVersion: snapshot.storage.k8s.io/v1
kind: VolumeSnapshot
metadata:
name: web-data-20260812
namespace: demo
spec:
volumeSnapshotClassName: csi-snapshot-retain
source:
persistentVolumeClaimName: web-datakubectl -n demo get volumesnapshot
kubectl -n demo describe volumesnapshot web-data-20260812快照通常是崩溃一致而非应用一致。数据库应先使用其备份/冻结机制,定期把备份复制到独立故障域,并实际演练恢复。快照不是备份的同义词。
从快照创建 PVC:
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: 40GiStatefulSet PVC 生命周期
volumeClaimTemplates 为每个副本创建独立 PVC,如 data-db-0。缩容或删除 StatefulSet 默认保留 PVC。新版本支持 PVC 保留策略,但生产仍应保守:
- 明确 scale-down 和 StatefulSet 删除时
Retain/Delete语义。 - 删除前把 Pod 序号、PVC、PV、后端卷 ID 和复制成员对应起来。
- 恢复同名 StatefulSet 之前确认旧 PVC 是否会重新绑定。
- 不手工交换有状态副本的数据盘,除非应用层恢复流程要求。
PV 回收与危险操作
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。
继续阅读
- 命令
- 故障排查
- 故障排查