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

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

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

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

定义存储类

每个 StorageClass 都包含字段 provisioner 和 parameters,当一个属于某个类的 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 仓库中以列表的形式展示了一些外部的供应者,一些第三方供应商也提供了他们自己的外部供应者。