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。