如果有多个PV时,PVC又是如何匹配PV的呢?

开篇先总结一下三个存储相关的概念:
persistentvolume(pv) 是对具体存储资源的描述,比如nfs、ceph、glusterfs等,通过pv可以访问到具体的存储资源; persistentvolumeclaim(pvc) pod想要使用具体的存储资源需要对接到pvc,pvc里会定义好pod希望使用存储的属性,通过pvc再去申请合适的存储资源(pv),匹配到合适的资源后pvc和pv会进行绑定,它们两者是一一对应的; storageclass(sc) pv可以手动创建,也可以自动创建,当pv需求量非常大时,如果靠手动创建pv就非常麻烦了,sc可以实现自动创建pv,并且会将pvc和pv绑定。
sc会定义两部分内容:
① pv的属性,比如存储类型、大小;
② 创建该pv需要用到的存储插件(provisioner),这个provisioner是实现自动创建pv的关键。
api资源对象pv和pvc
1)pv yaml示例:
vi  testpv.yaml #内容如下
apiversion: v1kind: persistentvolumemetadata:  name: testpvspec: 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 定义该存储访问路径,这里指的是本地的磁盘。
2)pvc  yaml示例:
vi  testpvc.yaml  #内容如下
apiversion: v1kind: persistentvolumeclaimmetadata:  name: testpvcspec: storageclassname: test-storage accessmodes: - readwriteonce resources: requests: storage: 100mi ##期望申请100mi空间  
应用pv和pvc的yaml
kubectl apply -f testpv.yaml -f testpvc.yaml  
查看状态
kubectl get pv,pvc  
3)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。
api资源对象storageclass
sc的主要作用在于,自动创建pv,从而实现pvc按需自动绑定pv。
下面我们通过创建一个基于nfs的sc来演示sc的作用。
要想使用nfs的sc,还需要安装一个nfs provisioner,provisioner里会定义nfs相关的信息(服务器ip、共享目录等)
修改yaml,并创建rbac授权
cd nfs-subdir-external-provisioner/deploysed -i 's/namespace: default/namespace: kube-system/' rbac.yaml ##修改命名空间为kube-systemkubectl apply -f rbac.yaml ##创建rbac授权修改deployment.yamlsed -i 's/namespace: default/namespace: kube-system/' deployment.yaml ##修改命名空间为kube-system  ##另外,你还需要手动修改下面内容 spec: serviceaccountname: nfs-client-provisioner containers: - name: nfs-client-provisioner image: chronolaw/nfs-subdir-external-provisioner:v4.0.2 ##改为dockerhub地址 volumemounts: - name: nfs-client-root mountpath: /persistentvolumes env: - name: provisioner_name value: k8s-sigs.io/nfs-subdir-external-provisioner - name: nfs_server              value: 192.168.222.99  ##改为你自己的nfs服务器地址 - name: nfs_path              value: /data/nfs  ##改为你自己的nfs共享目录 volumes: - name: nfs-client-root nfs: server: 192.168.222.99 ##改为你自己的nfs服务器地址 path: /data/nfs ##改为你自己的nfs共享目录应用yamlkubectl apply -f deployment.yaml kubectl apply -f class.yaml ##创建storageclasssc yaml示例 如下是class.yaml文件内容:apiversion: storage.k8s.io/v1kind: storageclassmetadata: name: nfs-clientprovisioner: k8s-sigs.io/nfs-subdir-external-provisioner # or choose another name, must match deployment's env provisioner_name'parameters: archiveondelete: false ##自动回收存储空间有了sc,还需要一个pvc vi nfspvc.yaml #增加如下内容apiversion: v1kind: persistentvolumeclaimmetadata: name: nfspvcspec: storageclassname: nfs-client accessmodes: - readwritemany resources: requests: storage: 500mi下面创建一个pod,来使用pvc vi  nfspod.yaml  #内容如下apiversion: v1kind: podmetadata: name: nfspodspec: containers: - name: nfspod image: nginx:1.23.2 volumemounts: - name: nfspv mountpath: /usr/share/nginx/html volumes: - name: nfspv persistentvolumeclaim: claimname: nfspvc


华为平板M5青春版8英寸评测 到底值不值得买
ATA-2161高压放大器在微流控技术细胞分选中的应用
芯讯通携多款模组解决方案亮相 日本IoT M2M 物联网展会
高速串行连接火爆 推动保障性技术创新和市场发展
模拟电路
如果有多个PV时,PVC又是如何匹配PV的呢?
仪表放大器电路原理、构成及电路设计
疫情防控:AI价值及应用场景分析
一文了解导入测试数据自动化生成测试用例的方法
PCB组装和制造:组件选择中的常见错误
扬尘在线检测设备技术参数以及重要性
哪个牌子的蓝牙耳机好?推荐几款质量好的耳机排行榜
超低延迟,畅玩吃鸡,手游爱好者最爱几款蓝牙耳机推荐
回顾驭势科技助推智能网联汽车产业的生根发芽
地物光谱仪的组成及应用领域-莱森光学
我们该如何改善PCBA加工焊接气孔的问题
区块链IM即时通讯系统开发技术
ARCM500系列智慧用电在线监控装置
买灯选红外感应还是雷达感应好?
如何购买功放和解码器