StorageClass是什么、为什么需要以及如何定义

来自AI助手的总结
StorageClass用于K8s动态管理PV,简化存储创建、扩容与回收。
StorageClass是什么、为什么需要以及如何定义

一、前言

本文主要以下几方面介绍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没有命名空间限制

© 版权声明
THE END
喜欢就支持一下吧
点赞14 分享
评论 抢沙发

请登录后发表评论

    暂无评论内容