Storage Classes

Default StorageClass

MetaKube clusters come with a default StorageClass:

OpenStack

Using SysEleven Stack Block Storage:

$ kubectl get storageclasses
NAME                                          PROVISIONER                AGE
sys11-quobyte-external-provisioner (default)  cinder.csi.openstack.org   8d

AWS

Using Elastic Block Store

$ kubectl get storageclasses
NAME                      PROVISIONER            AGE
sys11-aws (default)       kubernetes.io/aws-ebs  8d

Azure

Azure Disks on Azure:

$ kubectl get storageclasses
NAME                      PROVISIONER               AGE
sys11-azure (default)     kubernetes.io/azure-disk  8d

The default StorageClass can currently not be changed.
If you add the annotation to another StorageClass, creating PVCs that don't reference a spec.storageClassName will fail.

Access Mode RWX (ReadWriteMany)

MetaKube Core currently does not support RWX volumes.

Usually, volumes of cloud network storage may only be attached to one node at the time.
This limitation stems from the fact that otherwise writes from different hosts would have to be serialized and synchronized.

Even if the cloud storage type supports attaching a disk on multiple nodes at once (e.g. SysEleven Stack "quobyte-multiattach"),
it does not mean that write operations are synchronized by the filesystem driver.
If multiple hosts actually write to the disk, the filesystem (if it doesn't support it, e.g. ext4) will inevitably get corrupted.

You may still create a StorageClass using SysEleven Stack's multi attach volume type, if you install a suitable filesystem driver:

apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: sys11-quobyte-multi
provisioner: cinder.csi.openstack.org
allowVolumeExpansion: true
parameters:
  type: d578ba45-0e46-4dcb-b886-ba882c74a8e5
  fsType: ext4

The volume type IDs differ for each OpenStack region respectively:

  • DBL: b9a45f96-37cc-4e0b-888d-c1fee05547b5
  • CBK: 1ff7f857-fb02-425c-9d11-42e6ff7cfd50
  • FES: d578ba45-0e46-4dcb-b886-ba882c74a8e5

Use StorageClass

Kubernetes differentiates three options for spec.storageClassName in a PVC (or indirectly in a StatefulSets' spec.persistentVolumeClaimTemplates):

  1. null or equivalent: not specifying the field at all

    Kube-apiserver will automatically populate the field with the name of the default StorageClass.

    We recommend this option if possible, because it allows switching the default StorageClass without recreating a StatefulSet.

  2. Name of a specific StorageClass

    Kubernetes will use the CSI driver of the StorageClass to provision a PV according to the PVC.

  3. "" (the empty string)

    This option is reserved for "manual" PV provisioning.
    Kubernetes will not dynamically create a PV and the PVC will be left in status Pending until a matching PV is created.