A persistent volume represents a piece of storage that has been provisioned for use with Kubernetes pods. A persistent volume can be used by one or many pods and can be dynamically or statically provisioned.
Note
An Azure disk can only be mounted with Access mode type ReadWriteOnce, which makes it available to only a single AKS node. If needing to share a persistent volume across multiple nodes, consider using Azure Files
A storage class is used to define how a unit of storage is dynamically created with a persistent volume. For more information on Kubernetes storage classes, see [Kubernetes Storage Classes][kubernetes-storage-classes].
Each AKS cluster includes two pre-created storage classes, both configured to work with Azure disks:
- The default storage class provisions a standard Azure disk.
- Standard storage is backed by HDDs, and delivers cost-effective storage while still being performant. Standard disks are ideal for a cost effective dev and test workload.
- The managed-premium storage class provisions a premium Azure disk.
- Premium disks are backed by SSD-based high-performance, low-latency disk. Perfect for VMs running production workload. If the AKS nodes in your cluster use premium storage, select the managed-premium class.
Use the [kubectl get sc][kubectl-get] command to see the pre-created storage classes. The following example shows the pre-create storage classes available within an AKS cluster:
$ kubectl get sc
NAME PROVISIONER AGE
default (default) kubernetes.io/azure-disk 1h
managed-premium kubernetes.io/azure-disk 1h
Note
Persistent volume claims are specified in GiB but Azure managed disks are billed by SKU for a specific size. These SKUs range from 32GiB for S4 or P4 disks to 4TiB for S50 or P50 disks. The throughput and IOPS performance of a Premium managed disk depends on the both the SKU and the instance size of the nodes in the AKS cluster. For more information, see [Pricing and Performance of Managed Disks][managed-disk-pricing-performance].
A persistent volume claim (PVC) is used to automatically provision storage based on a storage class. In this case, a PVC can use one of the pre-created storage classes to create a standard or premium Azure managed disk.
Create a file named azure-premium.yaml
, and copy in the following manifest. The claim requests a disk named azure-managed-disk
that is 5GB in size with ReadWriteOnce access. The managed-premium storage class is specified as the storage class. This file is already available in your repo
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: azure-managed-disk
spec:
accessModes:
- ReadWriteOnce
storageClassName: managed-premium
resources:
requests:
storage: 5Gi
Tip
To create a disk that uses standard storage, use storageClassName: default
rather than managed-premium.
Create the persistent volume claim with the [kubectl create][kubectl-create] command and specify your azure-premium.yaml file:
$ kubectl create -f azure-premium.yaml
persistentvolumeclaim/azure-managed-disk created
Once the persistent volume claim has been created and the disk successfully provisioned, a pod can be created with access to the disk. The following manifest creates a basic NGINX pod that uses the persistent volume claim named azure-managed-disk to mount the Azure disk at the path /mnt/azure
.
Create a file named azure-pvc-disk.yaml
, and copy in the following manifest. This file is already available in your cloned repo
kind: Pod
apiVersion: v1
metadata:
name: mypod
spec:
containers:
- name: myfrontend
image: nginx
volumeMounts:
- mountPath: "/mnt/azure"
name: volume
volumes:
- name: volume
persistentVolumeClaim:
claimName: azure-managed-disk
Create the pod with the [kubectl create][kubectl-create] command, as shown in the following example:
$ kubectl create -f azure-pvc-disk.yaml
pod/mypod created
You now have a running pod with your Azure disk mounted in the /mnt/azure
directory. This configuration can be seen when inspecting your pod via kubectl describe pod mypod
, as shown in the following condensed example:
$ kubectl describe pod mypod
[...]
Volumes:
volume:
Type: PersistentVolumeClaim (a reference to a PersistentVolumeClaim in the same namespace)
ClaimName: azure-managed-disk
ReadOnly: false
default-token-smm2n:
Type: Secret (a volume populated by a Secret)
SecretName: default-token-smm2n
Optional: false
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Normal Scheduled 2m default-scheduler Successfully assigned mypod to aks-nodepool1-79590246-0
Normal SuccessfulMountVolume 2m kubelet, aks-nodepool1-79590246-0 MountVolume.SetUp succeeded for volume "default-token-smm2n"
Normal SuccessfulMountVolume 1m kubelet, aks-nodepool1-79590246-0 MountVolume.SetUp succeeded for volume "pvc-faf0f176-8b8d-11e8-923b-deb28c58d242"
[...]