PV&PVC
PV
PV作为存储设备,主要包括存储能力,访问模式,存储类型,回收信息等关键信息。
下面我们定义一个PV的YAML文件:
apiVersion: v1 kind: PersistentVolume metadata: name: my-pv01 labels: storage: pv spec: accessModes: - ReadWriteOnce capacity: storage: 1Gi persistentVolumeReclaimPolicy: Recycle nfs: path: /data/k8s server: 172.16.1.128
参数说明:
(1)、accessMode:访问模式,有ReadWriteOnce,ReadOnlyMany,ReadWriteMany。其中:
- ReadWriteOnce:表示具有读写权限,但是只能被一个node挂载一次
- ReadOnlyMany:表示具有只读权限,可以被多个node多次挂载
- ReadWriteMany:表示具有读写权限,可以被多个node多次挂载
(2)、capacity:持久卷资源和容量的描述,存储大小是唯一可设置或请求的资源。
(3)、persistentVolumeReclaimPolicy: 回收策略,也就是释放持久化卷时的策略,其有以下几种:
- Retain:保留数据,如果要清理需要手动清理数据,默认的策略;
- Delete:删除,将从Kubernetes中删除PV对象,以及外部基础设施中相关的存储资产,比如AWS EBS, GCE PD, Azure Disk, 或Cinder volume;
- Recycle:回收,清楚PV中的所有数据,相当于执行rm -rf /pv-volume/*;
然后我们创建PV:
kubectl create -f pv01-daemo.yaml
然后观察其PV:
[root@master volume]# kubectl get pv NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE my-pv01 1Gi RWO Recycle Available 3s
PV的状态说明:
- Available(可用):表示可用状态,还未被任何 PVC 绑定
- Bound(已绑定):表示 PVC 已经被 PVC 绑定
- Released(已释放):PVC 被删除,但是资源还未被集群重新声明
- Failed(失败): 表示该 PV 的自动回收失败
PVC
我们来创建PVC,创建PVC所用的类型是PersistentVolumeClaim,其apiVersion为v1,具体帮助文档可以通过kubectl explain PersistentVolumeClaim来查看。
首先我们确定PV是正常的:
[root@master volume]# kubectl get pv NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE my-pv01 1Gi RWO Recycle Available 6s
我们可以看到STATUS的状态是Available,表示可用。
接下来,我们定义PVC的YAML文件,如下:
apiVersion: v1 kind: PersistentVolumeClaim metadata: name: pvc-test spec: accessModes: - ReadWriteOnce resources: requests: storage: 1Gi
spec参数说明:
(1)、accessModes:主要定义卷所应该拥有的访问模式
(2)、resources:主要定义卷应该拥有的最小资源
(3)、dataSource:定义如果提供者具有卷快照功能,就会创建卷,并将数据恢复到卷中,反之不创建
(4)、selector:定义绑定卷的标签查询
(5)、storageClassName:定义的storageClass的名字
(6)、volumeMode:定义卷的类型
(7)、volumeName:需要绑定的PV的名称链接
然后执行以下命令创建PVC:
[root@master volume]# kubectl apply -f pvc-test.yaml
persistentvolumeclaim/pvc-test created
然后查看PVC和PV的状态:
[root@master volume]# kubectl get pv NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE my-pv01 1Gi RWO Recycle Bound default/pvc-test 19m 18h [root@master volume]# kubectl get pvc NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE pvc-test Bound my-pv01 1Gi RWO 34s
我们从上面可以看到pvc处于Bound状态,Bound的VOLUME是my-pv01,我们再看pv的状态有Available变为Bound,其CLAIM是default/pvc-test,其中default为namespace名称。
在上面我们创建了一个PVC,其绑定了我们创建的PV,如果此时我们再创建一个PVC,结果又会如何?
我们copy以下上面的PVC文件,将其名称改一下,如下:
apiVersion: v1 kind: PersistentVolumeClaim metadata: name: pvc-test2 spec: accessModes: - ReadWriteOnce resources: requests: storage: 1Gi
然后创建这个YAML文件,并查看其状态,如下:
[root@master volume]# kubectl apply -f pvc-test2.yaml persistentvolumeclaim/pvc-test2 created [root@master volume]# kubectl get pvc NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE pvc-test Bound my-pv01 1Gi RWO 9m34s pvc-test2 Pending 4s
我们可以看到我们刚创建的pvc-test2的STATUS处于Pending状态,这是由于PVC没有找到达到其要求的PV,我们可以查看我们已有的PV,如下:
[root@master volume]# kubectl get pv NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE my-pv01 1Gi RWO Recycle Bound default/pvc-test 31m pv01 1Gi RWO Recycle Bound default/www-web-0 18h pv02 1Gi RWO Recycle Bound default/www-web-1 18h
我们发现PV都已经用完了,就无法绑定,这是因为一个PV只能允许一个PVC绑定,这时候如果我们再创建一个PV,我们就会发现PVC的状态会变为Bound状态,如下我们创建一个新的pv,然后观察其状态:
[root@master volume]# kubectl get pvc NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE pvc-test Bound my-pv01 1Gi RWO 16m pvc-test2 Bound my-pv02 1Gi RWO 7m21s www-web-0 Bound pv01 1Gi RWO 18h www-web-1 Bound pv02 1Gi RWO 18h [root@master volume]# kubectl get pv NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE my-pv01 1Gi RWO Recycle Bound default/pvc-test 36m my-pv02 1Gi RWO Recycle Bound default/pvc-test2 23s pv01 1Gi RWO Recycle Bound default/www-web-0 18h pv02 1Gi RWO Recycle Bound default/www-web-1 18h
当然,如果我们把PV删除了会是什么效果呢?我们做如下操作:
[root@master volume]# kubectl delete -f pv02.yaml persistentvolume "my-pv02" deleted
删除PV,然后我们会发现其hold住了,然后我们另开一个终端查看PV和PVC的状态:
[root@master ~]# kubectl get pv NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE 42m my-pv02 1Gi RWO Recycle Terminating default/pvc-test2 6m37s 18h [root@master ~]# kubectl get pvc NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE pvc-test2 Bound my-pv02 1Gi RWO 18m
我们发现PVC依然是Bound状态,而PV已经变为Terminating了,这时候如果我们把PVC删除了,其PV也不在了,如下:
[root@master volume]# kubectl delete pvc pvc-test2 persistentvolumeclaim "pvc-test2" deleted [root@master ~]# kubectl get pv NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE my-pv01 1Gi RWO Recycle Bound default/pvc-test 50m pv01 1Gi RWO Recycle Bound default/www-web-0 18h pv02 1Gi RWO Recycle Bound default/www-web-1 18h
如果我们的Pod没有挂载PVC,我们先删PVC,再删PV就会一下全部删除了。
注意:
(1)、如果我们的PVC需求的容量大于PV的可用容量,绑定是不会成功的;
(2)、如果我们的PVC需求的容量小于PV的可用容量,绑定的容量是PV的可用容量;