一、什么是动态存储¶
动态存储可以在用户需要存储资源时自动创建和配置动态存储可以在用户需要存储资源时自动创建和配置配变得更加灵活,并且可以随着应用程序的需求变化而动态调整。
二、动态存储工作原理¶
动态存储依赖StorageClass和CSI(Container Storage Interface)实现,当我们创建一个PVC时,通过storageClassName指定动态存储的类,该类指向了不同的存储供应商,比如Ceph、NFS等,之后通过该类就可完成PV的自动创建。
三、动态存储架构图¶

动态存储架构的流程如下:
- 用户创建 PVC
用户定义
PersistentVolumeClaim(PVC),声明所需存储的容量、访问模式,并指定StorageClass名称。 - 匹配 StorageClass
Kubernetes 根据 PVC 中指定的
StorageClass名称,找到对应的StorageClass对象。StorageClass中定义了存储类型(如云盘、SSD)、参数(如 IOPS、区域)以及关联的Provisioner(通常是 CSI Driver 名称)。 - 触发 CSI Driver
StorageClass的Provisioner字段指向 CSI Driver。Kubernetes 通过控制器(如persistent-volume-controller)调用 CSI Driver 的CreateVolume接口,请求创建存储卷。 - 创建底层存储资源
CSI Driver 根据
StorageClass中的参数,与底层存储系统(如云厂商的块存储、分布式存储系统)交互,动态创建存储卷(如 AWS EBS 卷、Azure Disk)。 - 生成 PV 并绑定 PVC
底层存储创建成功后,CSI Driver 将存储卷信息返回给 Kubernetes。Kubernetes 自动生成对应的
PersistentVolume(PV),并将该 PV 与用户的 PVC 绑定。 - Pod 挂载存储
用户在 Pod 中引用 PVC 名称,Kubernetes 调度器将 Pod 调度到合适节点后,CSI Driver 通过
NodePublishVolume接口将存储卷挂载到 Pod 的指定路径,供应用使用。
组件关系总结: PVC(需求方) → StorageClass(存储规格模板) → CSI Driver(控制器) → Storage(底层存储系统)
四、什么是容器存储接口—CSI¶
参考链接:https://github.com/kubernetes-csi
CSI(Container Storage Interface)是一个标准化的存储接口,用于在容器环境中集成外部存储系统。它提供了一种统一的方式来集成各种存储系统,无论是云提供商的存储服务,还是自建的存储集群,都可以通过CSI对接到容器平台中。
在同一个Kubernetes集群中,可以同时存在多个CSI对接不同的存储平台,之后可以通过StorageClass的provisioner字段声明该Class对接哪一种存储平台。
五、什么是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进行扩容,需要后端存储支持,一般不推荐进行缩容
动态存储可以在用户需要存储资源时自动创建和配置PV,而无需手动创建和配置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没有命名空间限制