Kubernetes – PV / PVC / StorageClass讲解

参考文章:https://boilingfrog.github.io/2021/07/01/k8s%E4%B8%AD%E7%9A%84PV%E5%92%8CPVC%E7%90%86%E8%A7%A3/#%E4%BB%80%E4%B9%88%E6%98%AFpv%E5%92%8Cpvc

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当中写好

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范例

  1. PVC
YAML
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: my-pvc
spec:
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 3Gi
  storageClassName: gp3
YAML

2. StorageClass
使用这个模版创建的PV,当PVC删除时,PV和外部的容量盘也会跟着自动删除

YAML
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
YAML

3. 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/

YAML
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

Loading

Facebook评论