Kubernetes – PV / PVC / StorageClass讲解
PV = PersistentVolume
PVC = PersistentVolumeClaim
PVC:描述 Pod想要使用的持久化属性,比如存储大小、读写权限等
PV:描述一个具体的Volume属性,比如Volume的类型、挂载目录、远程存储服务器地址等
StorageClass:充当PV的模板,自动为PVC创建PV
- Pod 需要链接外部存储的时候必须连接PVC 才有办法连接外部存储
– PV和PVC的绑定都是一对一的关系
静态管理:管理员必须手动创建PV,PVC会查看PV有没有符合的存储空间和accessModes
动态管理:管理员无需手动创建PV,PVC去找有没有符合链接条件的PV先,如果没有的话才会通过StorageClass去创建一个PV,然后链接他,StorageClass就是存储的模版。比如存储的是SSD或HDD,存储需求的容量必须在PVC当中写好
![](https://www.pangzai.win/wp-content/uploads/2024/07/image-19.png)
AccessMode的设定
只有PV和PVC可以设定这个AccessMode
- ReadWriteOnce:该卷可以被单个节点以读/写模式挂载
- ReadOnlyMany:该卷可以被多个节点以只读模式挂载
- ReadWriteMany:该卷可以被多个节点以读/写模式挂载
PV和PVC的Status
- Available: 资源尚未被claim使用
- Bound: 卷已经被绑定到claim了
- Released: claim被删除,卷处于释放状态,但未被集群回收
- Failed: 卷自动回收失败
回收的生命周期
– PV能设定以下3种生命周期,StorageClass模版只能设定Retain和Delete
– PVC是完全无法设定生命周期的,只能依靠PV的设定
- Retain:允许人工处理保留的数据。
- Delete:将删除pv和外部关联的存储资源,需要插件支持。
- Recycle:将执行清除操作,之后可以被新的pvc使用,需要插件支持。
Yaml范例
- PVC
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: my-pvc
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 3Gi
storageClassName: gp3
YAML2. StorageClass
使用这个模版创建的PV,当PVC删除时,PV和外部的容量盘也会跟着自动删除
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: gp3
provisioner: kubernetes.io/aws-ebs
volumeBindingMode: WaitForFirstConsumer #创建pvc之后也不会创建 pv,直到某个pod与该pvc关联
parameters:
type: gp3
fsType: ext4
iops: "3000" # Minimum: 3000 IOPS
throughput: "125" # Minimum: 125 MiB/s
reclaimPolicy: Delete # 能够设置Retain 或 Delete
allowVolumeExpansion: true
YAML3. PersistentVolume
可以事先自定手动创建EBS,然后绑定到PV上
参考文章:
https://stackoverflow.com/questions/69710969/how-to-deploy-an-existing-ebs-volume-to-eks-pvc
https://aws.amazon.com/blogs/storage/persistent-storage-for-kubernetes/
apiVersion: v1
kind: PersistentVolume
metadata:
name: test-pv
spec:
capacity:
storage: 5Gi
accessModes:
- ReadWriteOnce
storageClassName: "" #没有storage class的话就放空
persistentVolumeReclaimPolicy: Retain
csi:
driver: ebs.csi.aws.com #如果是EFS的话可以放:efs.csi.aws.com
volumeHandle: <VolumeID> #你手动创建的EBS ID
YAML