文章

kubernetes持久化存储(二)| StorageClass的使用

前面的文章里我们学习了 PVPVC 的使用方法,但是前面的 PV 都是静态的,什么意思呢?就是我要使用的一个 PVC 的话就必须手动去创建一个 PV,我们也说过这种方式在很大程度上并不能满足我们的需求,比如我们有一个应用需要对存储的并发度要求比较高,而另外一个应用对读写速度又要求比较高,特别是对于 StatefulSet 类型的应用简单的来使用静态的 PV 就很不合适了,这种情况下我们就需要用到动态 PV,也就是我们今天要讲解的 StorageClass

StorageClass资源

每个 StorageClass 都包含 provisionerparametersreclaimPolicy 字段, 这些字段会在 StorageClass 需要动态分配 PersistentVolume 时会使用到。

StorageClass 对象的命名很重要,用户使用这个命名来请求生成一个特定的类。 当创建 StorageClass 对象时,管理员设置 StorageClass 对象的命名和其他参数,一旦创建了对象就不能再对其更新。

管理员可以为没有申请绑定到特定 StorageClass 的 PVC 指定一个默认的存储类 : 更多详情请参阅 PersistentVolumeClaim 章节

 apiVersion: storage.k8s.io/v1
 kind: StorageClass
 metadata:
   name: my-storageclass
   annotations:
     storageclass.beta.kubernetes.io/is-default-class: "true"
 provisioner: kubernetes.io/aws-ebs
 parameters:
   type: gp2
 reclaimPolicy: Retain
 allowVolumeExpansion: true
 mountOptions:
   - debug
 volumeBindingMode: Immediate

provisioner

每个 StorageClass 都有一个分配器,用来决定使用哪个卷插件分配 PV。该字段必须指定。

reclaimPolicy

由 StorageClass 动态创建的 PersistentVolume 会在类的 reclaimPolicy 字段中指定回收策略,可以是 Delete 或者 Retain。如果 StorageClass 对象被创建时没有指定 reclaimPolicy,它将默认为 Delete

通过 StorageClass 手动创建并管理的 PersistentVolume 会使用它们被创建时指定的回收政策。

allowVolumeExpansion

PersistentVolume 可以配置为可扩展。将此功能设置为 true 时,允许用户通过编辑相应的 PVC 对象来调整卷大小。

当基础存储类的 allowVolumeExpansion 字段设置为 true 时,以下类型的卷支持卷扩展。

卷类型

Kubernetes 版本要求

gcePersistentDisk

1.11

awsElasticBlockStore

1.11

Cinder

1.11

glusterfs

1.11

rbd

1.11

Azure File

1.11

Azure Disk

1.11

Portworx

1.11

FlexVolume

1.13

CSI

1.14 (alpha), 1.16 (beta)

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

volumeBindingMode

volumeBindingMode 字段控制了卷绑定和动态分配 应该发生在什么时候。

默认情况下,Immediate 模式表示一旦创建了 PersistentVolumeClaim 也就完成了卷绑定和动态分配。 对于由于拓扑限制而非集群所有节点可达的存储后端,PersistentVolume 会在不知道 Pod 调度要求的情况下绑定或者分配。

集群管理员可以通过指定 WaitForFirstConsumer 模式来解决此问题。 该模式将延迟 PersistentVolume 的绑定和分配,直到使用该 PersistentVolumeClaim 的 Pod 被创建。

parameters

Storage class 具有描述属于卷的参数。取决于分配器,可以接受不同的参数。 例如,参数 type 的值 io1 和参数 iopsPerGB 特定于 EBS PV。当参数被省略时,会使用默认值。

一个 StorageClass 最多可以定义 512 个参数。这些参数对象的总长度不能超过 256 KiB, 包括参数的键和值。

本地StorageClass

Yaml文件如下:

 kind: StorageClass
 apiVersion: storage.k8s.io/v1
 metadata:
   name: local-storage
 provisioner: kubernetes.io/no-provisioner
 volumeBindingMode: WaitForFirstConsumer

在PVC中如何使用:

 apiVersion: v1
 kind: PersistentVolume
 metadata:
   name: local-pv
 spec:
   capacity:
     storage: 10Gi
   accessModes:
     - ReadWriteOnce
   storageClassName: local-storage
   persistentVolumeReclaimPolicy: Retain
   local:
     path: /data/
   nodeAffinity:
     required:
       nodeSelectorTerms:
         - matchExpressions:
             - key: kubernetes.io/hostname
               operator: In
               values:
                 - 10.0.0.3 # node name

StorageClass使用

PVC

 kind: PersistentVolumeClaim
 apiVersion: v1
 metadata:
   name: my-pvc
 spec:
   accessModes:
     - "ReadWriteOnce"
   resources:
     requests:
       storage: "10Gi"
   storageClassName: "my-storageclass"
 ​

StatefulSet

 spec:
   volumeClaimTemplates:
     - metadata:
         name: data
       spec:
         accessModes: [ "ReadWriteOnce" ]
         storageClassName: my-storageclass
         resources:
           requests:
             storage: 10Gi 

参考

Kubernetes Volumes

Kubernetes Persistem Volumes

Kubernates Storage

License:  CC BY 4.0