AKS: Persistent Volume with existing Storage Account
In order to deploy a Persistent Volume in your AKS cluster using an existing Storage Account you should take the following steps:
- Create a Storage Class with a reference to the Storage Account.
- Create a Secret with the credentials used to access the Storage Account.
- Create a Persistent Volume with a reference to the Storage Class, the secret and the File Share.
- Create a Persistent Volume Claim with a reference to the volume by name.
Use the following yaml as a template for the resources described above. Save the contents as aks-existing-storage-account-pv.yaml:
--- # Create a StorageClass object pointing to the existing Storage Account # Remember: that the Storage account must be in the same Resource Group where the AKS cluster is deployed kind: StorageClass apiVersion: storage.k8s.io/v1 metadata: name: azurefile provisioner: kubernetes.io/azure-file mountOptions: - dir_mode=0777 - file_mode=0777 parameters: storageAccount: <storage account name> location: <storage account location> --- # Create a Secret to hold the name and key of the Storage Account # Remember: values are base64 encoded apiVersion: v1 kind: Secret metadata: name: azurefile-secret type: Opaque data: azurestorageaccountname: <base64 encoded storage account name> azurestorageaccountkey: <base64 encoded storage account key> --- # Create a persistent volume, with the corresponding StorageClass and the reference to the Azure File secret. # Remember: Create the share in the storage account otherwise the pods will fail with a "No such file or directory" apiVersion: v1 kind: PersistentVolume metadata: name: nginx-pv spec: capacity: storage: 5Gi accessModes: - ReadWriteOnce storageClassName: azurefile azureFile: secretName: azurefile-secret shareName: <Share Name (must already exist in the storage account)> readOnly: false mountOptions: - dir_mode=0777 - file_mode=0777 - uid=1000 - gid=1000 --- # Create a PersistentVolumeClaim referencing the StorageClass and the volume # Remember: this is a static scenario. The volume was created in the previous step. apiVersion: v1 kind: PersistentVolumeClaim metadata: name: nginx-pvc spec: accessModes: - ReadWriteOnce resources: requests: storage: 5Gi storageClassName: azurefile volumeName: nginx-pv
Deploy to your cluster and verify that the Private Volume Claim status is Bound:
kubectl apply -f aks-existing-storage-account-pv.yaml kubectl get pvc
Result should show something like:
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE nginx-pvc Bound nginx-pv 5Gi RWO azurefile ...
That’s it! now you can mount a volume in a container with a reference to the Private Volume Claim as in the following deployment:
--- # Deploy an nginx mounting a volume and referencing the persisten volume claim # Remember: using pvc decouples your deployment from the volume implementations apiVersion: extensions/v1beta1 kind: Deployment metadata: name: nginx spec: template: metadata: labels: app: nginx-storage spec: containers: - name: nginx-pod image: nginx:1.15.5 resources: requests: cpu: 100m memory: 128Mi limits: cpu: 250m memory: 256Mi volumeMounts: - mountPath: "/mnt/azure" name: volume volumes: - name: volume persistentVolumeClaim: claimName: nginx-pvc
Hope it helps.
Please download all code and files here.