Use a custom StorageClass with your workloads
To define specific storage behaviors for your containerized workloads on Google Kubernetes Engine (GKE) on Azure, create and use custom StorageClasses. By customizing StorageClasses, you can optimize storage performance and cost for your applications by selecting different Azure disk types, file system types, and other parameters for your PersistentVolumes. This capability helps you run efficient services by tailoring storage to your workload's exact needs.
GKE on Azure automatically deploys and manages the Azure Disk CSI Driver and Azure File CSI Driver, which are essential for handling storage provisioning. The versions of these drivers are tied to your GKE on Azure Kubernetes version and update automatically with cluster upgrades, ensuring seamless compatibility for your custom StorageClasses.
Use a custom StorageClass
You can create additional StorageClasses for volumes or use Container Storage Interface (CSI) Drivers.
Choose if you are using an Azure disk volume or another CSI driver.
Azure Disk Volume
You can create your own custom StorageClass that specifies an Azure Disk volume type, file system type, and other parameters. You can find additional StorageClass parameters on the GKE on Azure Azure Disk CSI Driver GitHub page.
To configure a custom StorageClass, copy the following YAML manifest into a file named
my-custom-class.yaml.apiVersion: storage.k8s.io/v1 kind: StorageClass metadata: name: CLASS_NAME provisioner: disk.csi.azure.com volumeBindingMode: WaitForFirstConsumer allowVolumeExpansion: trueReplace CLASS_NAME with the name of your new StorageClass.
For example, the following YAML creates a new StorageClass that provisions volumes in a specific storage account and applies a tag of
group=devto each new volume.apiVersion: storage.k8s.io/v1 kind: StorageClass metadata: name: my-custom-class provisioner: disk.csi.azure.com volumeBindingMode: WaitForFirstConsumer allowVolumeExpansion: true parameters: storageAccount: my-storage-account tags: group=devCSI Driver
You can specify a different CSI driver in the
provisionerfield.To create a StorageClass with another CSI driver, you can use the following example YAML.
apiVersion: storage.k8s.io/v1 kind: StorageClass metadata: name: CLASS_NAME provisioner: CSI_DRIVER_NAME volumeBindingMode: WaitForFirstConsumer parameters: ...Replace the following values:
- CLASS_NAME: the name of the StorageClass (for example,
my-custom-class). - CSI_DRIVER_NAME: the name of the CSI driver (for example,
csi.example.com).
Next, configure subfields under
parametersaccording to your CSI driver's documentation.- CLASS_NAME: the name of the StorageClass (for example,
Apply the YAML to your cluster.
kubectl apply -f my-custom-class.yamlCreate a PersistentVolumeClaim with a custom StorageClass.
After you create a custom StorageClass, you can specify it in a PVC. The following example creates a PVC named
my-pvcthat references the StorageClassmy-custom-class.apiVersion: v1 kind: PersistentVolumeClaim metadata: name: my-pvc spec: accessModes: - ReadWriteOnce resources: requests: storage: 30Gi storageclassName: my-custom-class
Set the default StorageClass
GKE on Azure uses a default StorageClass called standard-rwo that
provisions standard SSD Azure disks with
LRS. You can change the default to another StorageClass.
To change the default StorageClass:
Update the
is-default-classannotation for thestandard-rwoStorageClass withkubectl patch.kubectl patch storageclass standard-rwo -p \ '{"metadata": {"annotations":{"storageclass.kubernetes.io/is-default-class":"false"}}}'Create a new StorageClass that has the annotation
storageclass.kubernetes.io/is-default-class: true.The following example StorageClass uses the
disk.csi.azure.comdriver. To install another storage driver, see Installing a CSI driver.Copy the following YAML into a file named
my-custom-class.yaml.apiVersion: storage.k8s.io/v1 kind: StorageClass metadata: name: CLASS_NAME annotations: storageclass.kubernetes.io/is-default-class: true provisioner: disk.csi.azure.com volumeBindingMode: WaitForFirstConsumer parameters: skuName: VOLUME_TYPEReplace the following:
- CLASS_NAME: the name of your new StorageClass.
- VOLUME_TYPE: the Azure Disk volume type that the StorageClass creates.
For example, the following YAML creates a new default StorageClass that provisions Premium SSD Azure Disk volumes.
apiVersion: storage.k8s.io/v1 kind: StorageClass metadata: name: my-custom-default-class annotations: storageclass.kubernetes.io/is-default-class: "true" provisioner: disk.csi.azure.com volumeBindingMode: WaitForFirstConsumer parameters: skuName: Premium_LRSApply the new custom class to your cluster.
kubectl apply -f my-custom-class.yaml
After applying this manifest, GKE on Azure uses the
my-custom-default-class StorageClass for new storage requests.
Reference the StorageClass in a StatefulSet
To use your new StorageClass, you can reference it in a StatefulSet's
volumeClaimTemplates.
When you reference a StorageClass in a StatefulSet's volumeClaimTemplates
specification, Kubernetes provides stable storage using PersistentVolumes (PVs).
Kubernetes calls the provisioner defined in the StorageClass to create a new
storage volume. After the volume is provisioned, Kubernetes automatically
creates a PV.
The following StatefulSet references the my-custom-class StorageClass and
provisions a 1 gibibyte volume:
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: web
spec:
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: registry.k8s.io/nginx-slim:0.8
volumeMounts:
- name: www
mountPath: /usr/share/nginx/html
volumeClaimTemplates: # This is the specification in which you reference the StorageClass
- metadata:
name: www
spec:
accessModes: [ "ReadWriteOnce" ]
resources:
requests:
storage: 1Gi
storageClassName: my-custom-class # This field references the existing StorageClass
What's next
Read the documentation for the Azure Disk CSI driver or the Azure File CSI driver.
Learn about Persistent volumes in GKE.
Install Storage drivers on your GKE on Azure cluster.
Deploy your first workload with the Quickstart.