持久卷PersistentVolume & PersistentVolumeClaim

持久卷(PersistentVolume,PV)是集群中的一块存储,可以由管理员事先供应,或者 使用存储类(Storage Class,它的作用就是创建PV模板,当pvc请求时自动为其创建pv并与其绑定)来动态供应,稍后一一介绍。可以是ceph、nfs、本地存储等等

持久卷申领(PersistentVolumeClaim,PVC)表达的是用户对存储的请求,可以申领特定的大小和访问模式

需要由管理员先创建pv在通过pvc与pv绑定后,才能够由pod进行引用pvc

PV可分为两类:静态供应和动态供应

  • 静态供应:集群管理员创建若干 PV 卷。这些卷对象带有真实存储的细节信息
  • 动态供应:这一供应操作是基于 StorageClass 来实现的:PVC 申领必须请求某个 StorageClass,同时集群管理员必须 已经创建并配置了该类,这样动态供应卷的动作才会发生。 如果 PVC 申领指定存储类为 "",则相当于为自身禁止使用动态供应的卷。

如果用户删除被某 Pod 使用的 PVC 对象,该 PVC 申领不会被立即移除。 PVC 对象的移除会被推迟,直至其不再被任何 Pod 使用。 此外,如果管理员删除已绑定到某 PVC 申领的 PV 卷,该 PV 卷也不会被立即移除。 PV 对象的移除也要推迟到该 PV 不再绑定到 PVC。

你可以看到当 PVC 的状态为 Terminating 且其 Finalizers 列表中包含 kubernetes.io/pvc-protection 时,PVC 对象是处于被保护状态的

]# kubectl describe pv prometheus
Name:            prometheus
Labels:          <none>
Annotations:     pv.kubernetes.io/bound-by-controller: yes
Finalizers:      [kubernetes.io/pv-protection]  <- 该key表示pv处于保护状态
StorageClass:    

]# kubectl describe pvc prometheus -n ns-monitor 
Name:          prometheus
Namespace:     ns-monitor
StorageClass:  
Status:        Bound
Volume:        prometheus
Labels:        <none>
Annotations:   pv.kubernetes.io/bind-completed: yes
               pv.kubernetes.io/bound-by-controller: yes
Finalizers:    [kubernetes.io/pvc-protection]  <- 该key表示该pvc兑现处于保护状态

pv资源的回收策略

PersistentVolumes 可以有多种回收策略,包括 "Retain"、"Recycle" 和 "Delete"。 对于动态配置的 PersistentVolumes 来说,默认回收策略为 "Delete"。 这表示当用户删除对应的 PersistentVolumeClaim 时,动态配置的 volume 将被自动删除。 如果 volume 包含重要数据时,这种自动行为可能是不合适的。 这种情况下,更适合使用 "Retain" 策略。 使用 "Retain" 时,如果用户删除 PersistentVolumeClaim,对应的 PersistentVolume 不会被删除。 相反,它将变为 Released 状态,表示所有的数据可以被手动恢复

Retained(保留): 手动回收
回收策略 Retain 使得用户可以手动回收资源。当 PersistentVolumeClaim 对象 被删除时,PersistentVolume 卷仍然存在,对应的数据卷被视为"已释放(released)"。 由于卷上仍然存在之前申领人的数据,该卷还不能用于其他申领。
管理员可以通过下面的步骤来手动回收该卷:

  • 1、删除 PersistentVolume 对象。与之相关的、位于外部基础设施中的存储资产 (例如 AWS EBS、GCE PD、Azure Disk 或 Cinder 卷)在 PV 删除之后仍然存在。
  • 2、根据情况,手动清除所关联的存储资产上的数据。
  • 3、手动删除所关联的存储资产;如果你希望重用该存储资产,可以基于存储资产的 定义创建新的 PersistentVolume 卷对象。
apiVersion: v1
kind: PersistentVolume
metadata:
  name: prometheus
spec:
  capacity:
    storage: 15Gi
  accessModes:
  - ReadWriteOnce
  persistentVolumeReclaimPolicy: Recycle # 在此处进行定义
  nfs:
    server: 10.196.100.93
    path: /tmp/nfs

Recycled(回收) 基本擦除 (rm -rf /thevolume/*)
警告: 回收策略 Recycle 已被废弃。取而代之的建议方案是使用动态供应。

如果下层的卷插件支持,回收策略 Recycle 会在卷上执行一些基本的 擦除(rm -rf /thevolume/*)操作,之后允许该卷用于新的 PVC 申领。

Deleted(删除) 相关的(如 AWS EBS、GCE PD、Azure Disk 或 Cinder 卷)数据一并删除
对于支持 Delete 回收策略的卷插件,删除动作会将 PersistentVolume 对象从 Kubernetes 中移除,同时也会将(如 AWS EBS、GCE PD、Azure Disk 或 Cinder 卷)中删除相关的数据。 动态供应的卷会继承其 StorageClass 中设置的回收策略,该策略默认 为 Delete。 管理员需要根据用户的期望来配置 StorageClass;否则 PV 卷被创建之后必须要被重新配置后才能够使用

PV示例

apiVersion: v1
kind: PersistentVolume
metadata:
  name: pv0003
spec:
  capacity: # 目前,存储大小是可以设置和请求的唯一资源。 未来可能会包含 IOPS、吞吐量等属性。
    storage: 5Gi
  volumeMode: Filesystem # 卷模式 Filesystem(默认) 和Block 
  accessModes:
    - ReadWriteOnce  # 设定的访问模式
  persistentVolumeReclaimPolicy: Recycle
  storageClassName: slow
  mountOptions:
    - hard
    - nfsvers=4.1
  nfs:
    path: /tmp
    server: 172.17.0.2
  • volumeMode:
    1、Filesystem:属性设置为 Filesystem 的卷会被 Pod 挂载(Mount) 到某个目录。 如果卷的存储来自某块设备而该设备目前为空,Kuberneretes 会在第一次挂载卷之前 在设备上创建文件系统
    2、Block:这类卷以块设备的方式交给 Pod 使用,其上没有任何文件系统。 这种模式对于为 Pod 提供一种使用最快可能方式来访问卷而言很有帮助,Pod 和卷之间不存在文件系统层

  • accessModes:可以一次设定多个模式在PV上
    1、ReadWriteOnce -- 可以被一个节点以读写方式挂载 --> RWO
    2、ReadOnlyMany -- 可以被多个节点以只读方式挂载 --> ROX
    3、ReadWriteMany -- 可以被多个节点以读写方式挂载 --> RWX

  • PV STATUS 阶段状态
    每个卷会处于以下阶段(Phase)之一:

    • Available(可用)-- 卷是一个空闲资源,尚未绑定到PVC任何申领;
    • Bound(已绑定)-- 该卷已经绑定到某PVC;PVC
    • Released(已释放)-- 所绑定的PVC已被删除,但是资源尚未被集群回收;
    • Failed(失败)-- 卷的自动回收操作失败。
  • PVC绑定特定的PV

selector:
  matchLabels:
    name: pvtest

StorageClass 存储类

存储类相当于一个PV模板,创建后不可以在对StorageClass进行修改,PVC在进行kind为StorageClass申领时,StorageClass会自动为PVC创建满足要求的PV并进行绑定使用

  • StorageClass示例:
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: standard
provisioner: kubernetes.io/aws-ebs  # 提供存储的k8s中声明的api
parameters:
  type: gp2
reclaimPolicy: Retain     # PVC删除后的回收策略,和pv的三种策略一样
allowVolumeExpansion: true  # 是否允许PVC进行动态扩容申请,允许用户通过编辑相应的 PVC 对象来调整卷大小。
mountOptions:
  - debug
volumeBindingMode: Immediate  # 卷绑定模式

说明: allowVolumeExpansion: true 此功能仅可用于扩容卷,不能用于缩小卷

  • volumeBindingMode:
    1、Immediate:模式表示一旦创建了 PVC 也就完成了卷绑定和动态分配
    2、WaitForFirstConsumer :等待使用PVC的pod创建完毕后,在进行绑定和分配
    以下插件支持WaitForFirstConsumer模式
    a、AWSElasticBlockStore
    b、GCEPersistentDisk
    c、AzureDisk

  • 集群上设定默认的StorageClass
    在一个集群中可以通过storageclass.kubernetes.io/is-default-class注解 来将特定的 StorageClass 标记为默认,当PVC并未指定storageClassName 时会自动使用默认的StorageClass

注意:一个集群中只能设定一个默认的StorageClass

posted @ 2020-09-18 16:36  Ymei  阅读(1239)  评论(0编辑  收藏  举报