
Kubernetes 存储之 PersistentVolumeClaim
基本介绍
在 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 动态创建的新 PV
accessModes:
- ReadWriteMany
resources:
requests:
storage: 1Gi
------------------------------------------------------------------------------
# 动态存储供应模式
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: demo-pvc
spec:
storageClass: "demo-sc" # 确保 PVC 绑定到由 SC 动态创建的新 PV
accessModes:
- ReadWriteMany
resources:
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: 3
selector:
matchLabels:
app: demo-deployment
template:
metadata:
labels:
app: demo-deployment
spec:
containers:
- name: demo-container
image: demo-image:latest
ports:
- containerPort: 80
...
volumeMounts:
- name: pvc # 错误示范:data
mountPath: /data
subPath: data
- name: pvc # 错误示范:logs
mountPath: /logs
subPath: logs
volumes:
- name: pvc # 错误示范:volumes 有两个元素,分别是 data 和 logs
persistentVolumeClaim:
claimName: demo-pvc
...
- 感谢你赐予我前进的力量