以下内容均来自个人笔记并重新梳理,如有错误欢迎指正!
如果对您有帮助,烦请点赞、关注、转发!如果您有其他想要了解的,欢迎私信联系我~
基本介绍
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
相关说明
Pending:PVC 对象已被创建,但尚未绑定 PV Bound:PVC 对象已成功绑定 PV Lost:PVC 对象绑定的 PV 已不可用或丢失 Failed:PVC 对象无法满足其请求
如果没找到, PVC 对象状态就会一直处于 Pending 如果能找到,会自动将 PV 对象和 PVC 对象进行绑定,对象状态就会变为 Bound
如果 PVC 对象声明的容量小于 PV 对象声明的容量,PVC 对象和 PV 对象可以绑定,且容量为 PV 对象声明的容量值 如果 PVC 对象声明的容量大于 PV 对象声明的容量,PVC 对象和 PV 对象无法绑定 如果 PVC 对象和 PV 对象声明的 accessModes 不一致,PVC 对象和 PV 对象无法绑定
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
...