Persistent Storage in Kubernetes
/ 3 min read
kubernetes , k8s , storage , persistent-volumes , pv , pvc , devops , cloud-native , series:kubernetes:11
Understanding Persistent Volumes
Persistent Volumes (PV) provide a way to store data that persists beyond the lifecycle of a Pod. They are cluster resources that exist independently of Pods.
Basic Concepts
1. Persistent Volume (PV)
apiVersion: v1kind: PersistentVolumemetadata: name: pv-examplespec: capacity: storage: 10Gi accessModes: - ReadWriteOnce persistentVolumeReclaimPolicy: Retain storageClassName: standard hostPath: path: /mnt/data2. Persistent Volume Claim (PVC)
apiVersion: v1kind: PersistentVolumeClaimmetadata: name: pvc-examplespec: accessModes: - ReadWriteOnce resources: requests: storage: 5Gi storageClassName: standardStorage Classes
Basic StorageClass
apiVersion: storage.k8s.io/v1kind: StorageClassmetadata: name: standardprovisioner: kubernetes.io/aws-ebsparameters: type: gp2reclaimPolicy: DeleteallowVolumeExpansion: trueCloud Provider Examples
1. AWS EBS
apiVersion: storage.k8s.io/v1kind: StorageClassmetadata: name: ebs-scprovisioner: kubernetes.io/aws-ebsparameters: type: gp3 iopsPerGB: "10" encrypted: "true"2. Azure Disk
apiVersion: storage.k8s.io/v1kind: StorageClassmetadata: name: azure-diskprovisioner: kubernetes.io/azure-diskparameters: storageaccounttype: Premium_LRS kind: Managed3. Google Persistent Disk
apiVersion: storage.k8s.io/v1kind: StorageClassmetadata: name: gcp-pdprovisioner: kubernetes.io/gce-pdparameters: type: pd-standard replication-type: noneAccess Modes
- ReadWriteOnce (RWO)
- ReadOnlyMany (ROX)
- ReadWriteMany (RWX)
Example with multiple access modes:
apiVersion: v1kind: PersistentVolumemetadata: name: multi-access-pvspec: capacity: storage: 10Gi accessModes: - ReadWriteOnce - ReadOnlyMany nfs: server: nfs-server.example.com path: "/share"Dynamic Provisioning
StorageClass with Dynamic Provisioning
apiVersion: storage.k8s.io/v1kind: StorageClassmetadata: name: fastprovisioner: kubernetes.io/aws-ebsparameters: type: gp3 encrypted: "true"allowVolumeExpansion: truereclaimPolicy: DeletevolumeBindingMode: WaitForFirstConsumerPVC Using Dynamic Provisioning
apiVersion: v1kind: PersistentVolumeClaimmetadata: name: dynamic-pvcspec: accessModes: - ReadWriteOnce storageClassName: fast resources: requests: storage: 100GiReal-World Examples
1. Database Storage
apiVersion: v1kind: PersistentVolumeClaimmetadata: name: mysql-dataspec: accessModes: - ReadWriteOnce resources: requests: storage: 20Gi storageClassName: fast---apiVersion: apps/v1kind: StatefulSetmetadata: name: mysqlspec: serviceName: mysql 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 volumes: - name: data persistentVolumeClaim: claimName: mysql-data2. Shared File Storage
apiVersion: v1kind: PersistentVolumemetadata: name: nfs-pvspec: capacity: storage: 100Gi accessModes: - ReadWriteMany nfs: server: nfs-server.example.com path: "/shared"---apiVersion: v1kind: PersistentVolumeClaimmetadata: name: nfs-pvcspec: accessModes: - ReadWriteMany resources: requests: storage: 100Gi volumeName: nfs-pvVolume Expansion
Expanding PVC
apiVersion: v1kind: PersistentVolumeClaimmetadata: name: expandable-pvcspec: accessModes: - ReadWriteOnce resources: requests: storage: 100Gi # Can be increased later storageClassName: expandable-scStorageClass with Expansion
apiVersion: storage.k8s.io/v1kind: StorageClassmetadata: name: expandable-scprovisioner: kubernetes.io/aws-ebsallowVolumeExpansion: trueparameters: type: gp3Backup and Restore
Volume Snapshot
apiVersion: snapshot.storage.k8s.io/v1kind: VolumeSnapshotmetadata: name: data-snapshotspec: volumeSnapshotClassName: csi-hostpath-snapclass source: persistentVolumeClaimName: data-pvcRestore from Snapshot
apiVersion: v1kind: PersistentVolumeClaimmetadata: name: restore-pvcspec: dataSource: name: data-snapshot kind: VolumeSnapshot apiGroup: snapshot.storage.k8s.io accessModes: - ReadWriteOnce resources: requests: storage: 10GiBest Practices
1. Capacity Planning
- Right-size volumes
- Monitor usage
- Plan for growth
- Consider costs
2. Performance
- Choose appropriate storage class
- Monitor I/O metrics
- Consider workload requirements
- Use local storage when needed
3. Data Protection
- Regular backups
- Use snapshots
- Implement disaster recovery
- Test restore procedures
4. Security
- Encrypt data at rest
- Use appropriate access modes
- Implement RBAC
- Follow security policies
Troubleshooting
Common issues and solutions:
-
PVC Pending
- Check storage class
- Verify capacity
- Review access modes
- Check provisioner status
-
Volume Mount Issues
- Check permissions
- Verify paths
- Review mount options
- Check node capacity
Advanced Configurations
Local Volumes
apiVersion: v1kind: PersistentVolumemetadata: name: local-pvspec: capacity: storage: 100Gi accessModes: - ReadWriteOnce persistentVolumeReclaimPolicy: Delete storageClassName: local-storage local: path: /mnt/disks/vol1 nodeAffinity: required: nodeSelectorTerms: - matchExpressions: - key: kubernetes.io/hostname operator: In values: - node-1CSI Integration
apiVersion: storage.k8s.io/v1kind: StorageClassmetadata: name: csi-scprovisioner: csi.example.comparameters: csi.storage.k8s.io/provisioner-secret-name: csi-secret csi.storage.k8s.io/provisioner-secret-namespace: defaultMonitoring
Prometheus Metrics
apiVersion: monitoring.coreos.com/v1kind: ServiceMonitormetadata: name: storage-monitorspec: selector: matchLabels: app: storage-provider endpoints: - port: metricsSeries Navigation
- Previous: Kubernetes Services and Ingress
- Next: Monitoring Kubernetes Clusters
Conclusion
Understanding Persistent Volumes is crucial for managing stateful applications in Kubernetes. Proper configuration and management of storage resources ensures data persistence and reliability in your applications.