PVC是用户层面,作为对存储资源的需求申请,主要包括了存储空间大小、访问模式、PV的选择条件、存储类别等信息的设置。
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: test-pvc1
spec:
accessModes:
- ReadWriteMany
resources:
requests:
storage: 1Gi
storageClassName: nfs-stoarge
selector:
matchLabels:
pv: test-pv1
spec.accessModes
:访问模式;描述用户应用对存储资源的访问权限。spec.resources.requests.storage
:资源请求的存储大小;spec.storageClassName
:存储卷模式,指定一个StorageClass资源对象的名称,具有特定类别的PV只能与请求了该类别的PVC进行绑定;(动态存储);当然,也可以设置为spec.storageClassName=“”
,未设置特定类型的PV只能与不请求任何类型的PVC进行绑定(静态存储)。spec.selector.matchLabels
: PV的选择条件,可以通过标签匹配进行PV绑定;也可以通过spec.selector.matchExpressions
进行条件标签描述;$ kubectl get pvc
PVC一共也有4个生命周期阶段:Available/Bound/Released/Failed
创建(yaml的方式)
$ kubectl create -f pvc.yaml
删除
$ kubectl delete pvc pvc_name
查看所有PVC
$ kubectl get pvc
查看某个PVC
$ kubectl get pvc pvc_name
查看详情
$ kubectl describe pvc pvc_name
注意: 若在某个命名空间下,以上命令可以加上-n ns_name
by 《k8s 权威指南》
其实,使用共享存储就几步:
Pod(Deployment等配置好PVC)—>PVC—>PV—>存储资源。
资源供应
PVC使用存储资源可以通过静态绑定或者动态绑定,静态模式就是集权管理员预先创建对应的PV对存储特性进行设置;动态模式就是集权管理员预先创建好StorageClass资源对后端存储进行描述,PVC创建时对存储类型进行声明,PVC创建后,k8s会自动创建合适的PV与PVC进行绑定。
资源绑定
创建好PVC后,PVC会在已存在的PV中选择合适的PV进行绑定(可以通过标签进行特定绑定,也可以不通过标签,系统会自动选择合适(容量大小等参数)的PV进行绑定。),绑定成功,状态变成Bound,且该PV被对应的PVC独占绑定,不可以再被其他PVC绑定,除非该PVC释放。若在k8s系统中没有找到合适的PV,则PVC一直处于Pending状态。
资源使用
在Deployment等资源中,通过spec.template.spec.volumes:
进行PVC挂载路径设置。
spec:
tempeate:
spec:
containers:
- name: container1
image: image1
volumeMounts:
- name: volume1
mountPath: /data/dir1
volumes:
- name: volume1
persistentVolumeClaim:
claimName: pvc1
资源释放
删除PVC,与该PVC绑定的PV状态就会变成“Released”,该PVC在存储设备上的数据删除后,对应的PV才能与其他的PVC进行绑定。
资源回收
PV中可以通过spec.persistentVolumeReclaimPolicy
设置回收策略,这个主要用于绑定的PVC删除后,资源释放后如何处理该PVC在存储设备上写入的数据。
Retain:保留,删除PVC后,PV保留数据;
Recycle:回收空间,删除PVC后,简单的清除文件;(NFS和HostPath存储支持)
Delete:删除,删除PVC后,与PV相连接的后端存储会删除数据;(AWS EBS、Azure Disk、Cinder volumes、GCE PD支持)
我们可以通过标签的方式,将pvc绑定到特定的pv上。需要做两步,一个是pv的yaml标签,另一步是pvc的标签匹配。
by 《k8s权威指南》
举例:
pv的yaml需要有metadata.labels
进行标签标记;
如:
[root@k8s /pv_test]# vim test_pv1.yaml
apiVersion: v1
kind: PersistentVolume
metadata:
name: test-pv1
labels:
pv: test-pv1
spec:
capacity:
storage: 2Mi
accessModes:
pvc的yaml里需要有spec.selector.matchLabels
进行标签匹配。
[root@k8s /pvc_test]# vim test_pvc1.yaml
#persistent Volume Claim
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: test-pvc1
namespace: t1
spec:
#storageClassName: managed-nfs-storage
accessModes:
- ReadWriteMany
resources:
requests:
storage: 1Mi
selector:
matchLabels:
pv: test-pv1
创建pv和pvc
$ kubectl create -f test_pv.yaml
$ kubectl create -f test_pvc.yaml
查看pv
$ kubectl get pv test-pv1
查看pvc
$ kubectl get pvc test-pvc1
我们可以看出test-pvc1持久卷声明绑定到了test-pv1这个持久卷上了。
除了pvc绑定手动创建pv的方式,我们还可以通过动态卷配置StorageClass跳过手动pv的方式。
by 《k8s权威指南》
我们先要创建一个StorageClass资源。
[root@k8s /sc_test]# vim test_storageclass1.yaml
apiVersion: storage.k8s.io/v1beta1
kind: StorageClass
metadata:
name: course-nfs-storage
provisioner: fuseim.pri/ifs
然后在pvc的yaml中增加spec.storageClassName
进行配置。
[root@k8s /pvc_test]# vim test_pvc_sc.yaml
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: test-pvc
spec:
accessModes:
创建StorageClass和PVC资源
$ kubectl create -f test_storageclass1.yaml
$ kubectl create -f test_pv_sc.yaml
查看SC
$ kubectl get sc course-nfs-storage
查看SC详情
$ kubectl describe sc course-nfs-storage
查看PVC
$ kubectl get pvc test-pvc
查看PV
$ kubectl get pv
可以看到一个自动创建的pv,它的策略是Delete,即pvc删除后会自动删除。
手机扫一扫
移动阅读更方便
你可能感兴趣的文章