当前位置: 首页 > news >正文

研发工程师玩转Kubernetes——PVC使用Label和storage选择PV

在《研发工程师玩转Kubernetes——local型PV和PVC绑定过程中的状态变化》和《研发工程师玩转Kubernetes——使用local型PV在不同Pod上共享数据》中,我们介绍了指定VPC的spec.volumeName为PV名称来绑定它们的方法。本文将介绍PVC在创建时,系统自动选择绑定哪个PV。
在设计上,PV是系统管理员分配的,它用于隔绝具体是哪种介质。比如一些PV来源于谷歌云,一些PV来源于阿里云,还有一些PV来源于AWS。
在这里插入图片描述
使用者只要通过PVC向其申请使用即可。
在这里插入图片描述
申请时可以通过spec.volumeName指定特定名称PV,还可以使用spec.selector在一堆PV中选择符合条件的PV。

创建多个PV

我们分别使用下面三个配置创建storage为256K、512K和1M的PV。它们都有名字是volume,值是lb-default-storage-class-pv的label。

# default_storage_class_pv_256k.yaml
apiVersion: v1
kind: PersistentVolume
metadata:name: default-storage-class-pv-256klabels:volume: lb-default-storage-class-pv
spec:capacity:storage: 256KivolumeMode: FilesystemaccessModes:- ReadWriteOncepersistentVolumeReclaimPolicy: Retainlocal:path: /tmpnodeAffinity:required:nodeSelectorTerms:- matchExpressions:- key: kubernetes.io/hostnameoperator: Invalues:- ubuntud
# default_storage_class_pv_512k.yaml
apiVersion: v1
kind: PersistentVolume
metadata:name: default-storage-class-pv-256klabels:volume: lb-default-storage-class-pv
spec:capacity:storage: 512KivolumeMode: FilesystemaccessModes:- ReadWriteOncepersistentVolumeReclaimPolicy: Retainlocal:path: /tmpnodeAffinity:required:nodeSelectorTerms:- matchExpressions:- key: kubernetes.io/hostnameoperator: Invalues:- ubuntud
# default_storage_class_pv_1024k.yaml
apiVersion: v1
kind: PersistentVolume
metadata:name: default-storage-class-pv-256klabels:volume: lb-default-storage-class-pv
spec:capacity:storage: 1MivolumeMode: FilesystemaccessModes:- ReadWriteOncepersistentVolumeReclaimPolicy: Retainlocal:path: /tmpnodeAffinity:required:nodeSelectorTerms:- matchExpressions:- key: kubernetes.io/hostnameoperator: Invalues:- ubuntud

创建带选择功能的PVC

PVC申请的空间是600K,介于512K和1M。

# default_storage_class_pvc_600k.yaml
apiVersion: v1
kind: PersistentVolumeClaim
metadata:name: default-storage-class-pvc-600k
spec:resources:requests:storage: 600KiaccessModes:- ReadWriteOnceselector:matchLabels:volume: lb-default-storage-class-pv

创建之后,我们查看该PVC的信息。

kubectl describe persistentvolumeclaims default-storage-class-pvc-600k 
Name:          default-storage-class-pvc-600k
Namespace:     default
StorageClass:  
Status:        Bound
Volume:        default-storage-class-pv-1024k
Labels:        <none>
Annotations:   pv.kubernetes.io/bind-completed: yespv.kubernetes.io/bound-by-controller: yes
Finalizers:    [kubernetes.io/pvc-protection]
Capacity:      1Mi
Access Modes:  RWO
VolumeMode:    Filesystem
Used By:       <none>
Events:        <none>

可以看到,因为这三个PV的Label都符合PVC的选择器。但是由于256K和512K的PV都小于600K的要求,于是它只能选择最接近它的1M大小的PV。

不匹配的Label

我们创建一个Label不匹配的PVC清单,并创建它。

# default_storage_class_pvc_100k_not_match.yaml
apiVersion: v1
kind: PersistentVolumeClaim
metadata:name: default-storage-class-pvc-100k-not-match
spec:resources:requests:storage: 100KiaccessModes:- ReadWriteOnceselector:matchLabels:volume: lb-default-storage-class-pv-not-match

可以看到它一直处于Pending状态,因为没有符合Label要求的PV。

kubectl describe persistentvolumeclaims default-storage-class-pvc-100k-not-match
Name:          default-storage-class-pvc-100k-not-match
Namespace:     default
StorageClass:  
Status:        Pending
Volume:        
Labels:        <none>
Annotations:   <none>
Finalizers:    [kubernetes.io/pvc-protection]
Capacity:      
Access Modes:  
VolumeMode:    Filesystem
Used By:       <none>
Events:Type    Reason         Age               From                         Message----    ------         ----              ----                         -------Normal  FailedBinding  5s (x2 over 11s)  persistentvolume-controller  no persistent volumes available for this claim and no storage class is set

无法满足大小的PVC

之前创建的600K大小的default-storage-class-pvc-600k已经把default-storage-class-pv-256k占用了,只剩下512K和256K大小的PV。
我们再创建一个不满足剩余PV大小的PVC。

# default_storage_class_pvc_700k.yaml
apiVersion: v1
kind: PersistentVolumeClaim
metadata:name: default-storage-class-pvc-700k
spec:resources:requests:storage: 700KiaccessModes:- ReadWriteOnceselector:matchLabels:volume: lb-default-storage-class-pv

观察其状态,可以发现其也处于Pending状态。

kubectl describe persistentvolumeclaims default-storage-class-pvc-700k 
Name:          default-storage-class-pvc-700k
Namespace:     default
StorageClass:  
Status:        Pending
Volume:        
Labels:        <none>
Annotations:   <none>
Finalizers:    [kubernetes.io/pvc-protection]
Capacity:      
Access Modes:  
VolumeMode:    Filesystem
Used By:       <none>
Events:Type    Reason         Age              From                         Message----    ------         ----             ----                         -------Normal  FailedBinding  8s (x2 over 9s)  persistentvolume-controller  no persistent volumes available for this claim and no storage class is set

延迟绑定

对于处于Pending状态的PVC,只要我们创建符合条件的PV,系统就会自动将其绑定。
创建下面的PV,它大小是2M,可以满足上面700K请求空间的PVC。

# default_storage_class_pv_2m.yaml
apiVersion: v1
kind: PersistentVolume
metadata:name: default-storage-class-pv-2048klabels:volume: lb-default-storage-class-pv
spec:capacity:storage: 2MivolumeMode: FilesystemaccessModes:- ReadWriteOncepersistentVolumeReclaimPolicy: Retainlocal:path: /tmpnodeAffinity:required:nodeSelectorTerms:- matchExpressions:- key: kubernetes.io/hostnameoperator: Invalues:- ubuntud

然后再观察之前处于Pending状态的PVC状态。可以看到其变成了Bound状态,且其绑定的PV就是刚创建的符合其条件的default-storage-class-pv-2048k。

kubectl describe persistentvolumeclaims default-storage-class-pvc-700k
Name:          default-storage-class-pvc-700k
Namespace:     default
StorageClass:  
Status:        Bound
Volume:        default-storage-class-pv-2048k
Labels:        <none>
Annotations:   pv.kubernetes.io/bind-completed: yespv.kubernetes.io/bound-by-controller: yes
Finalizers:    [kubernetes.io/pvc-protection]
Capacity:      2Mi
Access Modes:  RWO
VolumeMode:    Filesystem
Used By:       <none>
Events:Type    Reason         Age                     From                         Message----    ------         ----                    ----                         -------Normal  FailedBinding  2m36s (x26 over 8m37s)  persistentvolume-controller  no persistent volumes available for this claim and no storage class is set
http://www.lryc.cn/news/116973.html

相关文章:

  • 【VUE】localStorage、indexedDB跨域数据操作实战笔记
  • 四、web应用程序技术——HTTP
  • B2B2C小程序商城系统--跨境电商后台数据采集功能开发
  • Python-OpenCV中的图像处理-形态学转换
  • 理解 Python 的 for 循环
  • 携程验证码
  • 资深媒体人宋繁银加入《数据猿》任总编辑,全面负责公司整体内容工作
  • 【Unity实战100例】人物状态栏UI数据刷新—MVC观察者模式
  • 8路AD采集FMC子卡【产品资料】
  • 文章三:团队协作实践 - 协作高手:Git团队开发最佳实践
  • Pyinstaller 打包 django 项目如何将命令行参数加入?
  • hive锁的管理器的介绍
  • 以太网TCP协议(十二)
  • ARM 架构下的汇编指令(持续更新中)
  • 11款UML/SysML建模工具更新(2023.7)Papyrus、UModel……
  • FPGA外部触发信号毛刺产生及滤波
  • day38 滑动窗口
  • 翻出了我当时学习的笔记来了html
  • vuejs 设计与实现 - 快速diff算法
  • webpack基础知识七:说说webpack proxy工作原理?为什么能解决跨域?
  • nginx负载均衡(nginx结束)
  • Git与Github常用方法
  • Centos7离线安装MySQL8
  • AWD攻防学习总结(草稿状态,待陆续补充)
  • 扫雷(超详解+全部码源)
  • python生成exe脚本全过程
  • 【机器学习1】什么是机器学习机器学习的重要性
  • 立即开始使用 3D 图像
  • 鸿鹄工程项目管理系统em Spring Cloud+Spring Boot+前后端分离构建工程项目管理系统em
  • 《向量数据库》——怎么安装向量检索库Faiss?