本文主要是介绍【K8s】专题十二(3):Kubernetes 存储之 PersistentVolumeClaim,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
本文内容均来自个人笔记并重新梳理,如有错误欢迎指正!
如果对您有帮助,烦请点赞、关注、转发、订阅专栏!
专栏订阅入口
Linux 专栏 | Docker 专栏 | Kubernetes 专栏
往期精彩文章
【Docker】(全网首发)Kylin V10 下 MySQL 容器内存占用异常的解决方法
【Docker】(全网首发)Kylin V10 下 MySQL 容器内存占用异常的解决方法(续)
【Docker】MySQL 源码构建 Docker 镜像(基于 ARM 64 架构)
目录
一、基本介绍
二、工作原理
三、资源清单(示例)
四、相关说明
1、状态类型(Status)
2、可能情形
3、Pod 挂载
一、基本介绍
在 Kubernetes 中,PersistentVolumeClaim(持久化卷声明,PVC)是一种与存储相关的资源对象,可以定义申请容量、访问模式等内容。
PVC 与 PV 共同构成了 Kubernetes 中持久存储的基础,它们之间的关系是请求与分配的关系:
- PV 代表集群中的实际存储资源,可以是任何类型(如 NFS、iSCSI、云存储等), 包含了存储的具体实现细节,如存储位置、容量大小、访问模式等
- PVC 是对 PV 的请求,包含了用户预期获得的存储资源的详细规格
二、工作原理
- 定义对象:在 PVC 对象的资源清单中可以指定其存储类、访问模式、存储容量等配置信息
- 创建对象:Kubernetes 按照管理员预先定义好的资源清单创建 PVC 对象
- 绑定:当一个 PVC 对象创建后,静态模式下 Kubernetes 会寻找一个匹配的 PV 进行绑定;在动态模式下 StorageClass 会根据 PVC 的申请动态创建 PV 对象。这个过程可以是立即的,也可以是延迟的
- 使用:PVC 对象与 PV 对象完成绑定后,Pod 就可以通过挂载 PVC 来访问持久化存储。Pod 的资源清单中会包含对 PVC 对象的引用,Kubernetes 负责将与 PVC 对象绑定的 PV 对象挂载到 Pod 的容器中
- 销毁:当 PVC 对象被销毁时,Kubernetes 会根据 PV 的回收策略来处理 PV 对象
三、资源清单(示例)
# 静态存储供应模式
apiVersion: v1
kind: PersistentVolumeClaim
metadata:name: demo-pvc
spec:storageClass: "" # 确保 PVC 绑定到由管理员预先创建的 PV,而不是由 SC 动态创建的新 PVaccessModes:- ReadWriteManyresources:requests:storage: 1Gi------------------------------------------------------------------------------
# 动态存储供应模式
apiVersion: v1
kind: PersistentVolumeClaim
metadata:name: demo-pvc
spec:storageClass: "demo-sc" # 确保 PVC 绑定到由 SC 动态创建的新 PVaccessModes:- ReadWriteManyresources:requests:storage: 1Gi
四、相关说明
1、状态类型(Status)
PVC 对象创建后,通常会存在以下几种状态:
- Pending:PVC 对象已被创建,但尚未绑定 PV
- Bound:PVC 对象已成功绑定 PV
- Lost:PVC 对象绑定的 PV 已不可用或丢失
- Failed:PVC 对象无法满足其请求
新建 PVC 对象后,Kubernetes 会根据资源清单的声明查找处于 Available 状态的 PV 对象
- 如果没找到, PVC 对象状态就会一直处于 Pending
- 如果能找到,会自动将 PV 对象和 PVC 对象进行绑定,对象状态就会变为 Bound
2、可能情形
- 如果 PVC 对象声明的容量小于 PV 对象声明的容量,PVC 对象和 PV 对象可以绑定,且容量为 PV 对象声明的容量值
- 如果 PVC 对象声明的容量大于 PV 对象声明的容量,PVC 对象和 PV 对象无法绑定
- 如果 PVC 对象和 PV 对象声明的 accessModes 不一致,PVC 对象和 PV 对象无法绑定
3、Pod 挂载
- Pod 挂载 PVC 时要使用相对路径,避免使用 “ / ” 开头
- 当多个 Pod 挂载同一个 PVC 时,可以在数据目录下设置子目录(subPath)以避免冲突
- 当单个 Pod 要在同一个 PVC 下使用 subPath 属性时,name 需要保持一致,否则会出现报错:unmounted volumes=[data], unattached volumes=[data logs default-token-4ss5k]: timed out waiting for the condition
# deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:name: demo-deployment
spec:replicas: 3selector:matchLabels:app: demo-deploymenttemplate:metadata:labels:app: demo-deploymentspec:containers:- name: demo-containerimage: demo-image:latestports:- containerPort: 80
...volumeMounts:- name: pvc # 错误示范:datamountPath: /datasubPath: data- name: pvc # 错误示范:logsmountPath: /logssubPath: logsvolumes:- name: pvc # 错误示范:volumes 有两个元素,分别是 data 和 logspersistentVolumeClaim:claimName: demo-pvc
...
这篇关于【K8s】专题十二(3):Kubernetes 存储之 PersistentVolumeClaim的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!