Kubernetes Series - Part 4: Storage and Persistence
/ 3 min read
Series Navigation
- Part 1: Core Fundamentals
- Part 2: Workload Management
- Part 3: Networking Essentials
- Part 4: Storage and Persistence (Current)
- Part 5: Configuration and Secrets
- Part 6: Security and Access Control
- Part 7: Observability
- Part 8: Advanced Patterns
- Part 9: Production Best Practices
Introduction
After managing stateful applications in Kubernetes for several years, I’ve learned that proper storage configuration is crucial for data reliability and performance. In this article, I’ll share practical insights from real-world experience managing persistent storage in production environments.
Persistent Volumes
Here’s a production-ready PV configuration we use with cloud providers:
apiVersion: v1kind: PersistentVolumemetadata: name: data-volume labels: type: ssd environment: productionspec: capacity: storage: 100Gi volumeMode: Filesystem accessModes: - ReadWriteOnce persistentVolumeReclaimPolicy: Retain storageClassName: fast-ssd csi: driver: ebs.csi.aws.com volumeHandle: vol-0123456789abcdef0 fsType: ext4 volumeAttributes: encrypted: "true"Storage Classes
We use different storage classes for different needs:
apiVersion: storage.k8s.io/v1kind: StorageClassmetadata: name: fast-ssdprovisioner: ebs.csi.aws.comparameters: type: gp3 iopsPerGB: "3000" encrypted: "true"reclaimPolicy: RetainvolumeBindingMode: WaitForFirstConsumerallowVolumeExpansion: truePV Best Practices
-
Volume Types
- Use SSD for performance-critical workloads
- Consider cost vs performance
- Implement proper encryption
-
Reclaim Policies
- Use Retain for important data
- Implement backup strategies
- Plan for disaster recovery
Persistent Volume Claims
Here’s how we request storage in our applications:
apiVersion: v1kind: PersistentVolumeClaimmetadata: name: database-dataspec: accessModes: - ReadWriteOnce storageClassName: fast-ssd resources: requests: storage: 100Gi selector: matchLabels: type: ssd environment: productionPVC Tips from Production
-
Sizing Considerations
- Start with conservative estimates
- Monitor usage patterns
- Plan for growth
resources:requests:storage: 100Gilimits:storage: 150Gi -
Access Modes
- Choose appropriate access mode
- Consider multi-pod access needs
- Plan for scaling
Volume Snapshots
We use this for backup and migration:
apiVersion: snapshot.storage.k8s.io/v1kind: VolumeSnapshotmetadata: name: data-snapshotspec: volumeSnapshotClassName: csi-aws-vsc source: persistentVolumeClaimName: database-dataSnapshot Best Practices
-
Backup Strategy
- Regular automated snapshots
- Retention policy
- Verification process
-
Restoration Testing
- Regular restore tests
- Document procedures
- Automate where possible
Dynamic Provisioning
Our dynamic provisioning setup:
apiVersion: storage.k8s.io/v1kind: StorageClassmetadata: name: dynamic-ssdprovisioner: ebs.csi.aws.comparameters: type: gp3 encrypted: "true" kmsKeyId: arn:aws:kms:region:account:key/key-idvolumeBindingMode: WaitForFirstConsumerallowVolumeExpansion: trueDynamic Provisioning Tips
-
Storage Options
- Configure default storage class
- Set appropriate parameters
- Monitor provisioning status
-
Cost Management
- Set storage limits
- Monitor usage
- Implement cleanup policies
Volume Expansion
How we handle growing storage needs:
apiVersion: v1kind: PersistentVolumeClaimmetadata: name: expandable-pvcspec: accessModes: - ReadWriteOnce resources: requests: storage: 100Gi storageClassName: expandable-storageExpansion Considerations
-
Planning
- Monitor usage trends
- Set up alerts
- Plan for downtime if needed
-
Implementation
- Test expansion procedures
- Document steps
- Monitor for errors
Common Storage Issues
From my experience, here are frequent problems and solutions:
-
Performance Issues
- Monitor IOPS
- Check storage class settings
- Verify network connectivity
-
Capacity Problems
- Set up monitoring
- Implement alerts
- Plan for expansion
-
Data Loss Prevention
- Regular backups
- Snapshot strategy
- Disaster recovery plan
Production Checklist
✅ Storage Configuration
- Appropriate storage classes
- Backup configuration
- Monitoring setup
- Encryption enabled
✅ Volume Management
- Snapshot schedule
- Retention policy
- Restore procedures
- Expansion strategy
✅ Performance
- IOPS monitoring
- Latency tracking
- Resource utilization
- Alert configuration
✅ Security
- Encryption at rest
- Access controls
- Audit logging
- Compliance checks
Real-world Example
Here’s a complete example of a production database setup:
---apiVersion: v1kind: PersistentVolumeClaimmetadata: name: postgres-dataspec: accessModes: - ReadWriteOnce storageClassName: fast-ssd resources: requests: storage: 100Gi---apiVersion: apps/v1kind: StatefulSetmetadata: name: postgresspec: serviceName: postgres replicas: 1 selector: matchLabels: app: postgres template: metadata: labels: app: postgres spec: containers: - name: postgres image: postgres:14 volumeMounts: - name: postgres-data mountPath: /var/lib/postgresql/data resources: requests: memory: "2Gi" cpu: "1" limits: memory: "4Gi" cpu: "2" volumes: - name: postgres-data persistentVolumeClaim: claimName: postgres-dataConclusion
Proper storage management in Kubernetes requires careful planning and ongoing maintenance. Key takeaways from my experience:
- Choose appropriate storage classes
- Implement proper backup strategies
- Monitor performance and capacity
- Plan for growth and scaling
- Test disaster recovery regularly
In the next part, we’ll explore configuration and secrets management, where I’ll share practical tips for managing application configurations securely.