这是《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 动态供给。生产要确认访问模式、回收策略、扩容、快照、备份和恢复演练。
思考题
- PV 和 PVC 的关系是什么?
- RWO 为什么不能随便多节点挂载?
- WaitForFirstConsumer 有什么优点?
- reclaimPolicy 如何选择?
- 快照和备份有什么差异?