PV

PV YAML示例

$ vi  testpv.yaml

apiVersion: v1
kind: PersistentVolume
metadata:
  name: testpv

spec:
  storageClassName: test-storage
  accessModes:
  - ReadWriteOnce
  capacity:
    storage: 500Mi  ##提供500Mi空间
  hostPath:
    path: /tmp/testpv/

说明:

  • storageClassName: 定义存储类名称,PV和PVC中都会有该字段,目的是为了方便两者匹配绑定在一起

  • accessModes定义该pv的访问权限模式,有三种:

  • ReadWriteOnce:存储卷可读可写,但只能被一个节点上的 Pod 挂载;
  • ReadOnlyMany:存储卷只读不可写,可以被任意节点上的 Pod 多次挂载;
  • ReadWriteMany:存储卷可读可写,也可以被任意节点上的 Pod 多次挂载;

  • capacity 定义该存储大小。

  • hostPath 定义该存储访问路径,这里指的是本地的磁盘。

PVC

PVC YAML示例

1、定义YAML文件

$ vi  testpvc.yaml

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: testpvc

spec:
  storageClassName: test-storage
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 100Mi  ##期望申请100Mi空间

2、应用pv和pvc的YAML

$ k apply -f testpv.yaml -f testpvc.yaml

3、查看状态

$ k get pv testpv

NAME     CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS   CLAIM             STORAGECLASS   REASON   AGE
testpv   500Mi      RWO            Retain           Bound    default/testpvc   test-storage            53s

$ k get pvc testpvc
NAME      STATUS   VOLUME   CAPACITY   ACCESS MODES   STORAGECLASS   AGE
testpvc   Bound    testpv   500Mi      RWO            test-storage   58s

4、将testpvc的期望100Mi改为1000Mi

删除原来的pvc

$ k delete -f testpvc.yaml

定义新的YAML文件

$ vi  testpvc.yaml

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: testpvc

spec:
  storageClassName: test-storage
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 1000Mi  ##期望申请1000Mi空间

重新应用YAML文件

$ k apply -f testpvc.yaml

5、查看PVC的STATUS,处于Pending状态

$ k get pvc testpvc

NAME      STATUS    VOLUME   CAPACITY   ACCESS MODES   STORAGECLASS   AGE
testpvc   Pending                                      test-storage   28s

6、恢复

$ k delete -f testpv.yaml,testpvc.yaml

PV和PVC匹配规则

PV创建好后,会等待PVC与其进行绑定,PVC一旦找到合适的PV就会绑定。如果有多个PV时,PVC又是如何匹配PV的呢?它有如下一些规则:

① 访问模式和存储类匹配:Kubernetes会筛选出访问模式(accessModes)和存储类(storageClassName)与PVC相匹配的PV。如果没有匹配的PV,PVC将保持未绑定状态。

② 资源大小:在满足访问模式和存储类匹配的PV中,Kubernetes会选择资源大小大于或等于PVC请求大小的PV。

③ 最佳匹配:在满足访问模式、存储类和资源大小的PV中,Kubernetes会选择资源大小最接近PVC请求大小的PV。如果有多个PV具有相同的资源大小,Kubernetes会选择其中一个进行绑定。

④ 避免重复绑定:一个PV在任何时候只能被一个PVC绑定。一旦PV被绑定到一个PVC,它将不再可用于其他PVC。