AKS Storage
AKS supports multiple storage options for persistent data: Azure Disk for block storage and Azure Files for shared file storage. Understanding when to use each storage type and how to configure them is essential for running stateful applications on AKS.
Storage Overview
Kubernetes abstracts storage through PersistentVolumes (PVs) and PersistentVolumeClaims (PVCs). On AKS, these map to Azure storage services:
Azure Disk CSI Driver
The Azure Disk Container Storage Interface (CSI) driver provides block storage using Azure managed disks. Azure Disks are network-attached block storage devices that persist independently of VM lifecycles.
Architecture
Storage Classes
Define storage classes for different Azure Disk types:
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: managed-premium
provisioner: disk.csi.azure.com
parameters:
skuname: Premium_LRS
cachingMode: ReadWrite
volumeBindingMode: WaitForFirstConsumer
allowVolumeExpansion: true
reclaimPolicy: Delete
Azure Disk Types:
| Type | Use Case | IOPS | Throughput | Cost |
|---|---|---|---|---|
| Standard HDD | Development/Testing | 500 | 60 MB/s | Low |
| Standard SSD | General purpose | 2,000 | 150 MB/s | Medium |
| Premium SSD | Production workloads | 7,500 | 250 MB/s | High |
| Ultra Disk | High-performance | 160,000 | 2,000 MB/s | Very High |
Creating Persistent Volumes
Dynamic Provisioning (Recommended):
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: mysql-pvc
spec:
accessModes:
- ReadWriteOnce
storageClassName: managed-premium
resources:
requests:
storage: 100Gi
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: mysql
spec:
replicas: 1
selector:
matchLabels:
app: mysql
template:
metadata:
labels:
app: mysql
spec:
containers:
- name: mysql
image: mysql:8.0
volumeMounts:
- name: data
mountPath: /var/lib/mysql
env:
- name: MYSQL_ROOT_PASSWORD
value: secretpassword
volumes:
- name: data
persistentVolumeClaim:
claimName: mysql-pvc
Access Modes:
ReadWriteOnce- Single node read/write (Azure Disk default)ReadOnlyMany- Multiple nodes read-only (not supported by Azure Disk)ReadWriteMany- Multiple nodes read/write (not supported by Azure Disk, use Azure Files)
Volume Expansion
Azure Disks can be expanded:
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: managed-premium-expandable
provisioner: disk.csi.azure.com
parameters:
skuname: Premium_LRS
allowVolumeExpansion: true # Enable expansion
Expand a PVC:
# Edit PVC to increase size
kubectl patch pvc mysql-pvc -p '{"spec":{"resources":{"requests":{"storage":"200Gi"}}}}'
# Verify expansion
kubectl get pvc mysql-pvc
Volume Snapshots
Create snapshots for backups:
apiVersion: snapshot.storage.k8s.io/v1
kind: VolumeSnapshotClass
metadata:
name: disk-snapshot-class
driver: disk.csi.azure.com
deletionPolicy: Retain
---
apiVersion: snapshot.storage.k8s.io/v1
kind: VolumeSnapshot
metadata:
name: mysql-snapshot
spec:
volumeSnapshotClassName: disk-snapshot-class
source:
persistentVolumeClaimName: mysql-pvc
Azure Files CSI Driver
Azure Files provides shared file storage that can be accessed by multiple pods simultaneously. Azure Files supports SMB protocol and is network-attached storage.
Architecture
Storage Class for Azure Files
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: azurefile
provisioner: file.csi.azure.com
parameters:
skuName: Premium_LRS
storageAccount: mystorageaccount
volumeBindingMode: Immediate
allowVolumeExpansion: true
reclaimPolicy: Delete
Using Azure Files
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: shared-storage
spec:
accessModes:
- ReadWriteMany
storageClassName: azurefile
resources:
requests:
storage: 100Gi
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: web-app
spec:
replicas: 3
selector:
matchLabels:
app: web
template:
metadata:
labels:
app: web
spec:
containers:
- name: app
image: nginx:latest
volumeMounts:
- name: shared
mountPath: /shared
volumes:
- name: shared
persistentVolumeClaim:
claimName: shared-storage
Azure Files Use Cases:
- Shared configuration files
- Content management systems
- Shared application data
- Log aggregation
- Multi-pod read/write access
Azure Files Tiers:
- Standard - General purpose, up to 100 TiB
- Premium - High performance, up to 100 TiB
Multi-Zone Storage Considerations
Zonal Azure Disks
Azure Disks are zonal resources:
Considerations:
- Azure Disks are tied to a specific availability zone
- Pods must be scheduled in the same zone as the disk
- Use
WaitForFirstConsumerbinding mode - Replicate data across zones for high availability
Azure Files Multi-Zone
Azure Files provides multi-zone availability:
Benefits:
- Accessible from all availability zones
- Automatic replication
- High availability
- Perfect for shared storage
Best Practices
Use Premium SSD for Production - Best price/performance for general use
Enable Encryption - Always encrypt Azure Disks and Azure Files
Use WaitForFirstConsumer - For Azure Disk to ensure proper zone placement
Plan for Multi-Zone - Use Azure Files for shared data, replicate Azure Disks for critical data
Monitor Storage Usage - Set up Azure Monitor alerts for disk usage
Use Snapshots - Regular Azure Disk snapshots for backups
Right-Size Volumes - Start small, expand as needed
Use Azure Files for Shared Data - When multiple pods need access
Consider Ultra Disk - For high-performance workloads
Tag Resources - Tag volumes for cost allocation
Common Issues
Volume Not Attaching
Problem: Pod stuck in Pending, volume not attaching
Solutions:
- Check Azure Disk CSI driver status
- Verify service principal permissions
- Check Network Security Group rules
- Verify disk is in same zone as node
- Review Azure Activity Log
Azure Files Mount Timeout
Problem: Azure Files mount fails or times out
Solutions:
- Verify storage account exists
- Check Network Security Group rules (port 445)
- Verify network connectivity
- Check Azure Files CSI driver logs
- Review Azure Activity Log
Volume Expansion Fails
Problem: Volume expansion doesn’t work
Solutions:
- Verify storage class allows expansion
- Check Azure Disk type supports expansion
- Ensure pod is running (expansion requires mounted volume)
- Check Azure Disk CSI driver version
- Review Azure Activity Log
See Also
- Cluster Setup - Initial cluster configuration
- Add-ons - Storage driver configuration
- Troubleshooting - Storage issues