一、前言

本文主要以下几方面介绍k8s中的StorageClass:

  • 什么是StorageClass
  • 为什么要引入StorageClass
  • StorageClass实现方式
  • 定义StorageClass

二、什么是StorageClass

StorageClass(存储类)是用于定义在Kubernetes集群中创建持久卷(Persistent Volume)的类型和行为的对象。在Kubernetes中,持久卷是一种抽象层,用于将存储资源(例如磁盘)与容器解耦,从而实现数据的持久性和可靠性。

StorageClass定义了不同类型的存储提供商、存储卷的属性和行为,以及如何将这些存储卷绑定到动态分配的持久卷请求。通过使用StorageClass,Kubernetes管理员可以为不同的应用程序或工作负载配置不同的存储策略。

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

StorageClass可以定义以下属性:

  • volumeBindingMode:指定持久卷绑定模式,可以是"Immediate"或"WaitForFirstConsumer"。"Immediate"表示持久卷将立即绑定到声明的请求,而"WaitForFirstConsumer"表示持久卷将等待第一个消费者使用它之前才进行绑定
  • provisioner:指定用于创建持久卷的存储提供商。不同的存储提供商可能具有不同的实现和配置要求
  • parameters:存储提供商特定的参数,用于配置持久卷的创建和属性。例如,可以指定存储容量、存储类别、访问模式等
  • reclaimPolicy:指定在释放持久卷时应如何处理底层存储资源。可以选择"Retain"(保留)、"Delete"(删除)或"Recycle"(回收)
  • MountOptions:通过StorageClass动态创建的PV可以使用MountOptions指定挂载参数。如果指定的卷插件不支持指定的挂载选项,就不会被创建成功,因此在设置时需要进行确认。
  • AllowVolumeExpansion:是否允许对PV进行扩容,需要后端存储支持,一般不推荐进行缩容

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

三、为什么要引入StorageClass

虽然使用PV和PVC能屏蔽一些存储使用上的细节,降低了存储使用的复杂度,但是也会有另一个问题无法解决。当公司Kubernetes集群很多,并且使用它们的技术人员过多时,对于PV的创建是一个很耗时、耗力的工作,并且达到一定规模后,过多的PV将难以维护。所以就需要某种机制用于自动管理PV的生命周期,比如创建、删除、自动扩容等,于是Kubernetes就设计了一个名为StorageClass(缩写为SC,没有命名空间隔离性)的东西,通过它可以动态管理集群中的PV,这样Kubernetes管理员就无须浪费大量的时间在PV的管理中。

在Kubernetes中,管理员可以只创建StorageClass“链接”到后端不同的存储,比如Ceph、GlusterFS、OpenStack的Cinder、其他公有云提供的存储等,之后有存储需求的技术人员,创建一个PVC指向对应的StorageClass即可,StorageClass会自动创建PV供Pod使用,也可以使用StatefulSet的volumeClaimTemplate自动分别为每个Pod申请一个PVC。

四、StorageClass实现方式

StorageClass的实现方式取决于Kubernetes集群所使用的存储插件和存储提供商。不同的存储插件和提供商可能有不同的实现细节和配置要求。

针对不同厂商的存储管理,k8s编写相应的代码。而不同厂商为了适配k8s,都会提供一个驱动(CSI或者Fiex Volume)安装到k8s集群中,然后StorageClass只需要配置该驱动即可,驱动器会代替StorageClass管理存储。

每个 StorageClass 都有一个制备器(Provisioner),用来决定使用哪个卷插件制备 PV。 该字段必须指定。

卷插件 内置制备器 配置示例
AWSElasticBlockStore AWS EBS
AzureFile Azure File
AzureDisk Azure Disk
CephFS - -
Cinder OpenStack Cinder
FC - -
FlexVolume - -
GCEPersistentDisk GCE PD
iSCSI - -
NFS - NFS
RBD Ceph RBD
VsphereVolume vSphere
PortworxVolume Portworx Volume
Local - Local

五、定义StorageClass

下面演示一个基本的StorageClass配置,用于使用gp2类型创建AWS EBS卷,允许卷扩展,保留存储资源,并使用立即绑定。

apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: standard
provisioner: kubernetes.io/aws-ebs
parameters:
  type: gp2
reclaimPolicy: Retain
allowVolumeExpansion: true
mountOptions:
  - debug
volumeBindingMode: Immediate

上面参数说明如下:

  • apiVersion: 指定了StorageClass对象的API版本。在此示例中,为storage.k8s.io/v1
  • kind: 指定了对象的类型,在此示例中为StorageClass
  • metadata: 包含了有关StorageClass的元数据信息,例如StorageClass的名称(在此示例中为standard
  • provisioner: 指定了负责创建持久卷的提供程序。在此示例中,为kubernetes.io/aws-ebs,表示使用AWS Elastic Block Store(EBS)提供程序。
  • parameters:包含了特定于提供程序的参数,用于配置创建的持久卷的属性。在此示例中,type参数设置为gp2,表示使用AWS EBS的通用目的SSD(gp2)卷类型。
  • reclaimPolicy: 指定了在释放持久卷时如何处理底层存储资源。在此示例中,设置为Retain,表示即使删除了PersistentVolumeClaim(PVC),与持久卷关联的存储资源也会保留。
  • allowVolumeExpansion: 指示是否允许对从此StorageClass创建的持久卷进行扩展。在此示例中,设置为true,启用卷扩展功能,
  • mountOptions:指定在挂载持久卷时传递给底层存储的挂载选项。在此示例中,指定了debug选项。
  • volumeBindingMode: 定义了持久卷的绑定模式。在此示例中,设置为Immediate,表示持久卷将立即绑定到请求的PVC

注意:StorageClass没有命名空间限制