一、前言¶
本文主要以下几方面介绍k8s中的StorageClass:
- 什么是StorageClass
- 为什么要引入StorageClass
- StorageClass实现方式
- 定义StorageClass
二、什么是StorageClass¶
StorageClass(存储类)是用于定义在Kubernetes集群中创建持久卷(Persistent Volume)的类型和行为的对象。在Kubernetes中,持久卷是一种抽象层,用于将存储资源(例如磁盘)与容器解耦,从而实现数据的持久性和可靠性。
StorageClass定义了不同类型的存储提供商、存储卷的属性和行为,以及如何将这些存储卷绑定到动态分配的持久卷请求。通过使用StorageClass,Kubernetes管理员可以为不同的应用程序或工作负载配置不同的存储策略。
每个 StorageClass 都包含 provisioner、parameters 和 reclaimPolicy 字段, 这些字段会在 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没有命名空间限制