PV 与 PVC 核心概念与使用逻辑
在 Kubernetes 中,PV(Persistent Volume,持久化卷)和 PVC(Persistent Volume Claim,持久化卷声明)是实现 “存储资源与应用解耦” 的核心组件:PV 是集群管理员提前创建的 “存储资源实体”,PVC 是用户对存储资源的 “申请请求”,二者通过匹配机制绑定,让应用无需关注底层存储细节。
一、核心概念与关系
| 维度 | PV(Persistent Volume) | PVC(Persistent Volume Claim) |
|---|---|---|
| 角色定位 | 集群级别的 “存储资源池”,由管理员创建,独立于 Pod 生命周期。 | 命名空间级别的 “存储申请单”,由用户(或运维)在部署应用时创建,与 Pod 关联。 |
| 核心属性 | 包含存储类型(如 NFS、Ceph、AWS EBS)、容量(capacity)、访问模式(accessModes)、存储类(storageClassName)等,定义 “有什么存储”。 | 包含申请容量、访问模式、存储类等,定义 “需要什么存储”,需与 PV 属性匹配才能绑定。 |
| 生命周期 | 由管理员手动创建 / 删除,或通过 StorageClass 动态创建,生命周期不依赖 Pod。 | 与 Pod 关联:Pod 删除后 PVC 可保留(数据不丢),PVC 删除后绑定的 PV 会按策略回收(如保留、删除、重新初始化)。 |
| 绑定逻辑 | 被动等待 PVC 申请,同一时间只能绑定一个 PVC。 | 主动申请 PV,绑定后独占 PV 资源,Pod 通过volumeMounts挂载 PVC 即可使用存储。 |
二、关键属性:访问模式(accessModes)
访问模式定义了 PV 的读写权限,是 PVC 与 PV 匹配的核心条件之一,支持三种类型(需底层存储支持):
- ReadWriteOnce(RWO):仅允许单个节点以读写方式挂载,适用于 “单 Pod 独占存储” 场景(如数据库 Pod)。
- ReadOnlyMany(ROX):允许多个节点以只读方式挂载,适用于 “多 Pod 共享只读数据” 场景(如静态资源服务)。
- ReadWriteMany(RWX):允许多个节点以读写方式挂载,适用于 “多 Pod 共享读写数据” 场景(如分布式文件系统 NFS、CephFS)。
三、使用流程(以手动创建 PV+PVC 为例)
1. 步骤 1:管理员创建 PV(定义存储资源)
以 NFS 类型 PV 为例,创建pv-nfs.yaml配置文件:
yaml
apiVersion: v1
kind: PersistentVolume
metadata:
name: pv-nfs-10g # PV名称
spec:
capacity:
storage: 10Gi # PV容量
accessModes:
- ReadWriteOnce # 访问模式:单节点读写
storageClassName: "nfs-storage" # 存储类名称(需提前创建)
nfs: # 底层存储类型为NFS
server: 192.168.1.100 # NFS服务器IP
path: "/data/k8s/nfs/pv1" # NFS共享目录
persistentVolumeReclaimPolicy: Retain # 回收策略:PVC删除后PV保留数据,需手动清理
执行命令创建 PV:kubectl apply -f pv-nfs.yaml
2. 步骤 2:用户创建 PVC(申请存储资源)
创建pvc-nfs.yaml,申请与上述 PV 匹配的存储:
yaml
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: pvc-nfs-5g # PVC名称
namespace: default # 所属命名空间
spec:
accessModes:
- ReadWriteOnce # 与PV访问模式一致
storageClassName: "nfs-storage" # 与PV存储类一致
resources:
requests:
storage: 5Gi # 申请容量≤PV容量(10Gi)
执行命令创建 PVC:kubectl apply -f pvc-nfs.yaml
3. 步骤 3:Pod 挂载 PVC 使用存储
在 Pod 配置中通过volumes关联 PVC,再通过volumeMounts挂载到容器目录:
yaml
apiVersion: v1
kind: Pod
metadata:
name: pod-with-pvc
spec:
containers:
- name: nginx
image: nginx:alpine
volumeMounts:
- name: data-volume # 与下方volumes.name一致
mountPath: /usr/share/nginx/html # 容器内挂载路径
volumes:
- name: data-volume
persistentVolumeClaim:
claimName: pvc-nfs-5g # 关联的PVC名称
四、常见问题与解决方案
| 问题现象 | 核心原因 | 解决措施 |
|---|---|---|
| PVC 一直处于 Pending 状态 | 无匹配的 PV(如容量不足、访问模式不匹配、存储类不一致) | 1. 执行kubectl describe pvc <pvc-name>查看具体原因;2. 调整 PVC 申请参数,或创建符合条件的 PV |
| Pod 挂载 PVC 失败(Error 状态) | PV 底层存储不可用(如 NFS 服务器宕机、Ceph 集群故障) | 1. 检查底层存储服务状态;2. 执行kubectl describe pod <pod-name>查看挂载错误日志 |
| PVC 删除后数据丢失 | PV 的回收策略为 Delete(删除 PVC 时自动删除 PV 及底层存储) | 1. 创建 PV 时将persistentVolumeReclaimPolicy设为 Retain(保留数据);2. 生产环境优先使用 Retain 策略 |
7243

被折叠的 条评论
为什么被折叠?



