基于上节创建的PV,我们来创建PVC,创建PVC所用的类型是PersistentVolumeClaim,其apiVersion为v1,具体帮助文档可以通过kubectl explain PersistentVolumeClaim来查看。

    首先我们确定PV是正常的:

    1. [root@master volume]# kubectl get pv
    2. NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE
    3. my-pv01 1Gi RWO Recycle Available 6s

    我们可以看到STATUS的状态是Available,表示可用。

    接下来,我们定义PVC的YAML文件,如下:

    1. apiVersion: v1
    2. kind: PersistentVolumeClaim
    3. metadata:
    4. name: pvc-test
    5. spec:
    6. accessModes:
    7. - ReadWriteOnce
    8. resources:
    9. requests:
    10. storage: 1Gi

    spec参数说明:
    (1)、accessModes:主要定义卷所应该拥有的访问模式
    (2)、resources:主要定义卷应该拥有的最小资源
    (3)、dataSource:定义如果提供者具有卷快照功能,就会创建卷,并将数据恢复到卷中,反之不创建
    (4)、selector:定义绑定卷的标签查询
    (5)、storageClassName:定义的storageClass的名字
    (6)、volumeMode:定义卷的类型
    (7)、volumeName:需要绑定的PV的名称链接

    然后执行以下命令创建PVC:

    1. [root@master volume]# kubectl apply -f pvc-test.yaml
    2. persistentvolumeclaim/pvc-test created

    然后查看PVC和PV的状态:

    1. [root@master volume]# kubectl get pv
    2. NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE
    3. my-pv01 1Gi RWO Recycle Bound default/pvc-test 19m 18h
    4. [root@master volume]# kubectl get pvc
    5. NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE
    6. 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文件,将其名称改一下,如下:

    1. apiVersion: v1
    2. kind: PersistentVolumeClaim
    3. metadata:
    4. name: pvc-test2
    5. spec:
    6. accessModes:
    7. - ReadWriteOnce
    8. resources:
    9. requests:
    10. storage: 1Gi

    然后创建这个YAML文件,并查看其状态,如下:

    1. [root@master volume]# kubectl apply -f pvc-test2.yaml
    2. persistentvolumeclaim/pvc-test2 created
    3. [root@master volume]# kubectl get pvc
    4. NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE
    5. pvc-test Bound my-pv01 1Gi RWO 9m34s
    6. pvc-test2 Pending 4s

    我们可以看到我们刚创建的pvc-test2的STATUS处于Pending状态,这是由于PVC没有找到达到其要求的PV,我们可以查看我们已有的PV,如下:

    1. [root@master volume]# kubectl get pv
    2. NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE
    3. my-pv01 1Gi RWO Recycle Bound default/pvc-test 31m
    4. pv01 1Gi RWO Recycle Bound default/www-web-0 18h
    5. pv02 1Gi RWO Recycle Bound default/www-web-1 18h

    我们发现PV都已经用完了,就无法绑定,这是因为一个PV只能允许一个PVC绑定,这时候如果我们再创建一个PV,我们就会发现PVC的状态会变为Bound状态,如下我们创建一个新的pv,然后观察其状态:

    1. [root@master volume]# kubectl get pvc
    2. NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE
    3. pvc-test Bound my-pv01 1Gi RWO 16m
    4. pvc-test2 Bound my-pv02 1Gi RWO 7m21s
    5. www-web-0 Bound pv01 1Gi RWO 18h
    6. www-web-1 Bound pv02 1Gi RWO 18h
    7. [root@master volume]# kubectl get pv
    8. NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE
    9. my-pv01 1Gi RWO Recycle Bound default/pvc-test 36m
    10. my-pv02 1Gi RWO Recycle Bound default/pvc-test2 23s
    11. pv01 1Gi RWO Recycle Bound default/www-web-0 18h
    12. pv02 1Gi RWO Recycle Bound default/www-web-1 18h

    当然,如果我们把PV删除了会是什么效果呢?我们做如下操作:

    1. [root@master volume]# kubectl delete -f pv02.yaml
    2. persistentvolume "my-pv02" deleted

    删除PV,然后我们会发现其hold住了,然后我们另开一个终端查看PV和PVC的状态:

    1. [root@master ~]# kubectl get pv
    2. NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE 42m
    3. my-pv02 1Gi RWO Recycle Terminating default/pvc-test2 6m37s 18h
    4. [root@master ~]# kubectl get pvc
    5. NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE
    6. pvc-test2 Bound my-pv02 1Gi RWO 18m

    我们发现PVC依然是Bound状态,而PV已经变为Terminating了,这时候如果我们把PVC删除了,其PV也不在了,如下:

    1. [root@master volume]# kubectl delete pvc pvc-test2
    2. persistentvolumeclaim "pvc-test2" deleted
    3. [root@master ~]# kubectl get pv
    4. NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE
    5. my-pv01 1Gi RWO Recycle Bound default/pvc-test 50m
    6. pv01 1Gi RWO Recycle Bound default/www-web-0 18h
    7. pv02 1Gi RWO Recycle Bound default/www-web-1 18h

    如果我们的Pod没有挂载PVC,我们先删PVC,再删PV就会一下全部删除了。

    注意:
    (1)、如果我们的PVC需求的容量大于PV的可用容量,绑定是不会成功的;
    (2)、如果我们的PVC需求的容量小于PV的可用容量,绑定的容量是PV的可用容量;