Manually create and use a volume with Azure disks in Azure Kubernetes Service (AKS)
Container-based applications often need to access and persist data in an external data volume. If a single pod needs access to storage, you can use Azure disks to present a native volume for application use. This article shows you how to manually create an Azure disk and attach it to a pod in AKS.
An Azure disk can only be mounted to a single pod at a time. If you need to share a persistent volume across multiple pods, use Azure Files.
For more information on Kubernetes volumes, see Storage options for applications in AKS.
Before you begin
You also need the Azure CLI version 2.0.59 or later installed and configured. Run
az --version to find the version. If you need to install or upgrade, see Install Azure CLI.
Create an Azure disk
When you create an Azure disk for use with AKS, you can create the disk resource in the node resource group. This approach allows the AKS cluster to access and manage the disk resource. If you instead create the disk in a separate resource group, you must grant the Azure Kubernetes Service (AKS) service principal for your cluster the
Contributor role to the disk's resource group.
For this article, create the disk in the node resource group. First, get the resource group name with the az aks show command and add the
--query nodeResourceGroup query parameter. The following example gets the node resource group for the AKS cluster name myAKSCluster in the resource group name myResourceGroup:
$ az aks show --resource-group myResourceGroup --name myAKSCluster --query nodeResourceGroup -o tsv MC_myResourceGroup_myAKSCluster_eastus
Now create a disk using the az disk create command. Specify the node resource group name obtained in the previous command, and then a name for the disk resource, such as myAKSDisk. The following example creates a 20GiB disk, and outputs the ID of the disk once created:
az disk create \ --resource-group MC_myResourceGroup_myAKSCluster_eastus \ --name myAKSDisk \ --size-gb 20 \ --query id --output tsv
Azure disks are billed by SKU for a specific size. These SKUs range from 32GiB for S4 or P4 disks to 32TiB for S80 or P80 disks (in preview). The throughput and IOPS performance of a Premium managed disk depends on both the SKU and the instance size of the nodes in the AKS cluster. See Pricing and Performance of Managed Disks.
The disk resource ID is displayed once the command has successfully completed, as shown in the following example output. This disk ID is used to mount the disk in the next step.
Mount disk as volume
To mount the Azure disk into your pod, configure the volume in the container spec. Create a new file named
azure-disk-pod.yaml with the following contents. Update
diskName with the name of the disk created in the previous step, and
diskURI with the disk ID shown in output of the disk create command. If desired, update the
mountPath, which is the path where the Azure disk is mounted in the pod.
apiVersion: v1 kind: Pod metadata: name: mypod spec: containers: - image: nginx:1.15.5 name: mypod resources: requests: cpu: 100m memory: 128Mi limits: cpu: 250m memory: 256Mi volumeMounts: - name: azure mountPath: /mnt/azure volumes: - name: azure azureDisk: kind: Managed diskName: myAKSDisk diskURI: /subscriptions/<subscriptionID>/resourceGroups/MC_myAKSCluster_myAKSCluster_eastus/providers/Microsoft.Compute/disks/myAKSDisk
kubectl command to create the pod.
kubectl apply -f azure-disk-pod.yaml
You now have a running pod with an Azure disk mounted at
/mnt/azure. You can use
kubectl describe pod mypod to verify the disk is mounted successfully. The following condensed example output shows the volume mounted in the container:
[...] Volumes: azure: Type: AzureDisk (an Azure Data Disk mount on the host and bind mount to the pod) DiskName: myAKSDisk DiskURI: /subscriptions/<subscriptionID/resourceGroups/MC_myResourceGroupAKS_myAKSCluster_eastus/providers/Microsoft.Compute/disks/myAKSDisk Kind: Managed FSType: ext4 CachingMode: ReadWrite ReadOnly: false default-token-z5sd7: Type: Secret (a volume populated by a Secret) SecretName: default-token-z5sd7 Optional: false [...] Events: Type Reason Age From Message ---- ------ ---- ---- ------- Normal Scheduled 1m default-scheduler Successfully assigned mypod to aks-nodepool1-79590246-0 Normal SuccessfulMountVolume 1m kubelet, aks-nodepool1-79590246-0 MountVolume.SetUp succeeded for volume "default-token-z5sd7" Normal SuccessfulMountVolume 41s kubelet, aks-nodepool1-79590246-0 MountVolume.SetUp succeeded for volume "azure" [...]
For associated best practices, see Best practices for storage and backups in AKS.
For more information about AKS clusters interact with Azure disks, see the Kubernetes plugin for Azure Disks.
We'd love to hear your thoughts. Choose the type you'd like to provide:
Our feedback system is built on GitHub Issues. Read more on our blog.