Dynamic Provisioning 的目标是完全自动化存储资源的生命周期管理,让用户无需过多的关注存储的管理,可以按需求自动动态创建和调整存储资源。StorageClass 本质上是底层存储介质的抽象:不同的存储介质拥有统一的表示和行为。

StorageClass 是 Dynamic Provisioning(动态配置)的基础,允许集群管理员位底层存储平台做定义抽象。用户只需在 PersistentVolumeClaim(PVC)通过名字引用 StorageClass 即可。

PVC允许用户消耗抽象的存储资源,用户也经常需要各种属性(如性能)的PV。集群管理员需要提供各种各样、不同大小、不同访问模式的PV,而不用向用户暴露这些volume如何实现的细节。因为这种需求,就催生出一种StorageClass资源。

StorageClass提供了一种方式,使得管理员能够描述他提供的存储的等级。集群管理员可以将不同的等级映射到不同的服务等级、不同的后端策略。

定义存储类

每个 StorageClass 都包含字段 provisionerparameters,当一个属于某个类的 PersistentVolume 需要被动态提供时,将会使用上述的参数域。

StorageClass 对象的命名是非常重要的,它是用户请求指定等级的方式。当创建 StorageClass 对象时,管理员设置等级的名称和其他参数,存储类的对象一旦被创建,将不能被更新。管理员能够为 PVC 指定一个默认的存储类。

  1. apiVersion: storage.k8s.io/v1
  2. kind: StorageClass
  3. metadata:
  4. name: standard
  5. # 指定存储类的供应者
  6. provisioner: kubernetes.io/glusterfs
  7. parameters:
  8. resturl: "http://10.97.20.153:8080"
  9. clusterid: "630372ccdc720a92c681fb928f27b53f"
  10. restauthenabled: "true"
  11. restuser: "admin"
  12. secretNamespace: "default"
  13. secretName: "heketi-secret"
  14. gidMin: "40000"
  15. gidMax: "50000"
  16. volumetype: "replicate:3"
  17. # 指定回收策略
  18. reclaimPolicy: Retain
  19. mountOptions:
  20. - debug

管理员可以指定一个默认的 StorageClass,用于绑定到那些未请求指定等级的PVC。

kind: StorageClass
apiVersion: storage.k8s.io/v1
metadata:
  name: standard
provisioner: kubernetes.io/aws-ebs
parameters:
  type: gp2

Provisioner 供应者

存储类有一个供应者的参数域,此参数域决定使用哪种存储卷插件提供给PV使用。必须指定该字段。

你不限于指定此处列出的“内部”供应商(其名称前缀为“kubernetes.io”并与Kubernetes一起分发)。你还可以运行和指定外部供应商,它们是遵循Kubernetes定义的规范的独立程序。外部提供者的作者对代码的生命周期,供应商的分发方式,运行状况以及使用的卷插件(包括Flex)等都有充分的自主权。库kubernetes-incubator/external-storage存放了一个库, 用于编写外部存储供应商,而这些提供者实现了大量的规范,并且是各种社区维护的。

存储卷 内置供应者 配置例子
AWSElasticBlockStore AWS
AzureFile Azure File
AzureDisk Azure Disk
CephFS
Cinder OpenStack Cinder
FC
FlexVolume
Flocker
GCEPersistentDisk GCE
Glusterfs Glusterfs
iSCSI
PhotonPersistentDisk
Quobyte Quobyte
NFS
RBD Ceph RBD
VsphereVolume vSphere
PortworxVolume Portworx Volume
ScaleIO ScaleIO
StorageOS StorageOS
Local Local

Kubernetes 的存储类并不局限于表中的“interneal”供应者,“interneal”供应者的名称带有“kubernetes.io”前缀;也可以允许和指定外部的供应者,外部供应者通过独立的程序进行实现。外部供应者的作者对代码在何处生存、如何供应、如何运行、使用什么卷插件(包括 Flex)等有充分的判断权, kubernetes-incubator/external-storage 仓库中存在编写外部提供者的类库。例如,NFS 不是内部的供应者,但也是可以使用。在 kubernetes-incubator/external-storage 仓库中以列表的形式展示了一些外部的供应者,一些第三方供应商也提供了他们自己的外部供应者。