解释PV和PVC的关系,开发有状态应用时如何挂载持久化存储?
Kubernetes PV/PVC 关系
核心概念定位
PV(PersistentVolume)和 PVC(PersistentVolumeClaim)属于 Kubernetes 存储管理中的持久化存储抽象层,解决容器化有状态应用的存储需求。
- PV(持久卷)
集群级别的存储资源池,由管理员预先创建
apiVersion: v1
kind: PersistentVolume
metadata:name: mysql-pv
spec:capacity:storage: 10Gi # 存储容量accessModes:- ReadWriteOnce # 单节点读写模式persistentVolumeReclaimPolicy: Retain # 保留策略nfs: # 存储类型为NFSserver: <nfs-server-ip>path: "/shared/data"
- PVC(持久卷声明)
应用级别的存储请求,开发者通过 PVC 申请存储资源
apiVersion: v1
kind: PersistentVolumeClaim
metadata:name: mysql-pvc
spec:accessModes:- ReadWriteOnceresources:requests:storage: 5Gi # 申请5G空间storageClassName: "" # 空字符串表示使用静态配置
有状态应用存储挂载实战
以 MySQL StatefulSet 为例:
apiVersion: apps/v1
kind: StatefulSet
metadata:name: mysql
spec:serviceName: "mysql"replicas: 1template:metadata:labels:app: mysqlspec:containers:- name: mysqlimage: mysql:5.7volumeMounts:- name: mysql-data # 挂载点名称mountPath: /var/lib/mysql # 容器内挂载路径volumes:- name: mysql-datapersistentVolumeClaim:claimName: mysql-pvc # 绑定已创建的PVC
关键配置解析
-
访问模式
- ReadWriteOnce(RWO):单节点读写
- ReadOnlyMany(ROX):多节点只读
- ReadWriteMany(RWX):多节点读写
-
回收策略
- Retain:手动回收(数据安全首选)
- Delete:自动删除(慎用)
- Recycle:基础擦除(已废弃)
动态供应方案(进阶)
使用 StorageClass 实现动态创建 PV:
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:name: fast-ssd
provisioner: kubernetes.io/gce-pd
parameters:type: pd-ssd # 指定SSD类型磁盘
此时 PVC 只需指定 StorageClass:
apiVersion: v1
kind: PersistentVolumeClaim
metadata:name: dynamic-pvc
spec:accessModes:- ReadWriteOncestorageClassName: fast-ssd # 指向动态存储类resources:requests:storage: 20Gi