Docker KubernetesNotes

第 16 章:存储

zjc 于 2026-01-16 发布

这是《Docker 与 Kubernetes 零基础实战指南》的独立章节版。本章从概念、实操和生产排查三个视角展开,代码块保留了原书可直接运行的版本。 Kubernetes 通过 StorageClass、PersistentVolume 和 PersistentVolumeClaim 解耦应用存储需求与底层存储实现。

16.1 核心对象

对象 职责
PV 集群存储资源
PVC 用户存储申请
StorageClass 动态供给模板
CSI 存储驱动接口
Pod -> PVC -> PV -> Storage Backend

16.2 PVC

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: pg-data
spec:
  accessModes:
    - ReadWriteOnce
  storageClassName: fast-ssd
  resources:
    requests:
      storage: 100Gi

访问模式:

模式 含义
ReadWriteOnce 单节点读写
ReadOnlyMany 多节点只读
ReadWriteMany 多节点读写
ReadWriteOncePod 单 Pod 读写

实际支持取决于存储插件。

16.3 Pod 挂载

spec:
  containers:
    - name: postgres
      image: postgres:16
      volumeMounts:
        - name: data
          mountPath: /var/lib/postgresql/data
  volumes:
    - name: data
      persistentVolumeClaim:
        claimName: pg-data

16.4 StorageClass

apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: fast-ssd
provisioner: ebs.csi.aws.com
parameters:
  type: gp3
reclaimPolicy: Delete
volumeBindingMode: WaitForFirstConsumer

reclaimPolicy: Delete 表示删除 PVC 后释放存储。数据安全要求高的场景应评估 Retain 或快照策略。

16.5 扩容与快照

在线扩容依赖 CSI 与 StorageClass 支持。扩容前要确认文件系统和云平台限制。

快照:

kubectl get volumesnapshot

快照不等于完整备份,仍要验证恢复和一致性。

16.6 常见问题

问题 排查
Pending StorageClass、容量、拓扑
VolumeAttachment 失败 CSI、节点、权限
Mount 失败 文件系统、路径、权限
多写损坏 访问模式误用
删除 PVC 数据丢失 reclaimPolicy

查看:

kubectl describe pvc pg-data
kubectl get pv
kubectl get sc
kubectl get events --sort-by=.lastTimestamp

本章小结

Kubernetes 存储以 PVC 声明需求,由 StorageClass 和 CSI 动态供给。生产要确认访问模式、回收策略、扩容、快照、备份和恢复演练。

思考题

  1. PV 和 PVC 的关系是什么?
  2. RWO 为什么不能随便多节点挂载?
  3. WaitForFirstConsumer 有什么优点?
  4. reclaimPolicy 如何选择?
  5. 快照和备份有什么差异?