数据存储——高级存储之PV和PVC
一、概述
PV ( Persistent Volume )是持久化卷的意思,是对底层的共享存储的一种抽象。一般情况下 PV 由
kubernetes 管理员进行创建和配置,它与底层具体的共享存储技术有关,并通过插件完成与共享存储的对接。
PVC ( Persistent Volume Claim )是持久卷声明的意思,是用户对于存储需求的一种声明。换句话
说, PVC 其实就是用户向kubernetes系统发出的一种资源需求申请。

二、PV
PV 是存储资源的抽象,下面是资源清单文件 :
apiVersion: v1
kind: PersistentVolume
metadata:
name: pv2
spec:
nfs: # 存储类型,与底层真正存储对应
capacity: # 存储能力,目前只支持存储空间的设置
storage: 2Gi
accessModes: # 访问模式
storageClassName: # 存储类别
persistentVolumeReclaimPolicy: # 回收策略
PV 的关键配置参数说明:存储类型底层实际存储的类型,kubernetes 支持多种存储类型,每种存储类型的配置都有所差异存储能力( capacity )目前只支持存储空间的设置( storage=1Gi ) ,不过未来可能会加入 IOPS 、吞吐量等指标的配置访问模式( accessModes )用于描述用户应用对存储资源的访问权限,访问权限包括下面几种方式:ReadWriteOnce( RWO ):读写权限,但是只能被单个节点挂载ReadOnlyMany( ROX ): 只读权限,可以被多个节点挂载ReadWriteMany( RWX ):读写权限,可以被多个节点挂载需要注意的是,底层不同的存储类型可能支持的访问模式不同回收策略( persistentVolumeReclaimPolicy )当PV 不再被使用了之后,对其的处理方式。目前支持三种策略:Retain (保留) 保留数据,需要管理员手工清理数据Recycle(回收) 清除 PV 中的数据,效果相当于执行 rm -rf /thevolume/*Delete (删除) 与 PV 相连的后端存储完成 volume 的删除操作,当然这常见于云服务商的存储服务需要注意的是,底层不同的存储类型可能支持的回收策略不同存储类别PV可以通过 storageClassName 参数指定一个存储类别具有特定类别的PV 只能与请求了该类别的 PVC 进行绑定未设定类别的PV 则只能与不请求任何类别的 PVC 进行绑定状态( status )一个 PV 的生命周期中,可能会处于 4 中不同的阶段:Available(可用): 表示可用状态,还未被任何 PVC 绑定Bound(已绑定): 表示 PV 已经被 PVC 绑定Released(已释放): 表示 PVC 被删除,但是资源还未被集群重新声明Failed(失败): 表示该 PV 的自动回收失败
实验:使用NFS作为存储,来演示PV的使用,创建3个PV,对应NFS中的3个暴露的路径
1、准备NFS环境
创建目录:
暴露服务,使服务生效:
2、创建pv.yaml
[root@k8s-master ~]# cat pv.yaml
apiVersion: v1
kind: PersistentVolume
metadata:name: pv1
spec:capacity:storage: 1GiaccessModes:- ReadWriteManypersistentVolumeReclaimPolicy: Retainnfs:path: /root/data/pv1server: master---apiVersion: v1
kind: PersistentVolume
metadata:name: pv2
spec:capacity:storage: 2GiaccessModes:- ReadWriteManypersistentVolumeReclaimPolicy: Retainnfs:path: /root/data/pv2server: master
---apiVersion: v1
kind: PersistentVolume
metadata:name: pv3
spec:capacity:storage: 3GiaccessModes:- ReadWriteManypersistentVolumeReclaimPolicy: Retainnfs:path: /root/data/pv3server: master
创建pv:
查看pv:
三、PVC
PVC 是资源的申请,用来声明对存储空间、访问模式、存储类别需求信息。下面是资源清单文件:
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: pvc
namespace: dev
spec:
accessModes: # 访问模式
selector: # 采用标签对PV选择
storageClassName: # 存储类别
resources: # 请求空间
requests:
storage: 5Gi
PVC 的关键配置参数说明:访问模式( accessModes )用于描述用户应用对存储资源的访问权限选择条件( selector )通过Label Selector 的设置,可使 PVC 对于系统中己存在的 PV 进行筛选存储类别( storageClassName )PVC在定义时可以设定需要的后端存储的类别,只有设置了该 class 的 pv 才能被系统选出资源请求( Resources )描述对存储资源的请求
实验:
1、创建 pvc.yaml
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: pvc1
namespace: dev
spec:
accessModes:
- ReadWriteMany
resources:
requests:
storage: 1Gi
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: pvc2
namespace: dev
spec:
accessModes:
- ReadWriteMany
resources:
requests:
storage: 1Gi
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: pvc3
namespace: dev
spec:
accessModes:
- ReadWriteMany
resources:
requests:
storage: 1Gi
2、创建pvc、查看pvc
3、创建pods.yaml,使用pv
[root@k8s-master ~]# vim pods.yaml
apiVersion: v1
kind: Pod
metadata:
name: pod1
namespace: dev
spec:
containers:
- name: busybox
image: busybox:1.30
command: ["/bin/sh","-c","while true;do echo "this is pod3" >> /root/out.txt; sleep
10; done;"]
volumeMounts:
- name: volume
mountPath: /root/
volumes:
- name: volume
persistentVolumeClaim:
claimName: pvc3
readOnly: false[root@k8s-master ~]# kubectl create -f pods.yaml
pod/pod66 created# 查看pod
[root@k98s-master ~]# kubectl get pods -n dev -o wide
NAME READY STATUS RESTARTS AGE IP NODE
pod66 1/1 Running 0 14s 10.244.1.69 node1
查看pod:
查看NFS中的文件存储: