Kubernetes Storage¶
Overview¶
This guide covers storage concepts in Kubernetes, including volumes, persistent volumes, storage classes, and best practices for managing application data.
Prerequisites¶
- Basic understanding of Kubernetes concepts
- Knowledge of storage systems
- Familiarity with cloud storage
- Understanding of persistence concepts
Learning Objectives¶
- Understand Kubernetes storage concepts
- Learn volume management
- Master persistent volumes
- Implement storage classes
- Configure dynamic provisioning
Table of Contents¶
Volumes¶
EmptyDir Volume¶
apiVersion: v1
kind: Pod
metadata:
name: test-pod
spec:
containers:
- name: test-container
image: nginx
volumeMounts:
- mountPath: /cache
name: cache-volume
volumes:
- name: cache-volume
emptyDir: {}
HostPath Volume¶
apiVersion: v1
kind: Pod
metadata:
name: test-pod
spec:
containers:
- name: test-container
image: nginx
volumeMounts:
- mountPath: /test-pd
name: test-volume
volumes:
- name: test-volume
hostPath:
path: /data
type: Directory
Persistent Volumes¶
PersistentVolume¶
apiVersion: v1
kind: PersistentVolume
metadata:
name: pv-volume
spec:
capacity:
storage: 10Gi
accessModes:
- ReadWriteOnce
persistentVolumeReclaimPolicy: Retain
storageClassName: standard
nfs:
path: /tmp
server: 172.17.0.2
PersistentVolumeClaim¶
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: pv-claim
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 5Gi
storageClassName: standard
Using PVC in Pod¶
apiVersion: v1
kind: Pod
metadata:
name: pv-pod
spec:
containers:
- name: test-container
image: nginx
volumeMounts:
- mountPath: "/var/www/html"
name: pv-storage
volumes:
- name: pv-storage
persistentVolumeClaim:
claimName: pv-claim
Storage Classes¶
Basic StorageClass¶
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: standard
provisioner: kubernetes.io/aws-ebs
parameters:
type: gp2
reclaimPolicy: Retain
allowVolumeExpansion: true
Dynamic Provisioning¶
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: fast
provisioner: kubernetes.io/aws-ebs
parameters:
type: io1
iopsPerGB: "10"
fsType: ext4
Volume Snapshots¶
VolumeSnapshotClass¶
apiVersion: snapshot.storage.k8s.io/v1
kind: VolumeSnapshotClass
metadata:
name: csi-hostpath-snapclass
driver: hostpath.csi.k8s.io
deletionPolicy: Delete
VolumeSnapshot¶
apiVersion: snapshot.storage.k8s.io/v1
kind: VolumeSnapshot
metadata:
name: new-snapshot
spec:
volumeSnapshotClassName: csi-hostpath-snapclass
source:
persistentVolumeClaimName: pv-claim
Restore from Snapshot¶
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: restore-pvc
spec:
dataSource:
name: new-snapshot
kind: VolumeSnapshot
apiGroup: snapshot.storage.k8s.io
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 10Gi
Storage Best Practices¶
Volume Security Context¶
apiVersion: v1
kind: Pod
metadata:
name: security-context-pod
spec:
securityContext:
fsGroup: 2000
containers:
- name: sec-ctx-container
image: nginx
volumeMounts:
- name: sec-ctx-vol
mountPath: /data/demo
volumes:
- name: sec-ctx-vol
persistentVolumeClaim:
claimName: pv-claim
Resource Quotas¶
apiVersion: v1
kind: ResourceQuota
metadata:
name: storage-quota
spec:
hard:
persistentvolumeclaims: "10"
requests.storage: "500Gi"
Best Practices¶
- Use appropriate storage types
- Implement proper backup strategies
- Configure storage classes correctly
- Monitor storage usage
- Implement proper access controls
- Use volume snapshots
- Plan for scalability
Common Pitfalls¶
- Incorrect storage class selection
- Poor capacity planning
- Missing backup strategy
- Inadequate monitoring
- Performance issues
- Security misconfigurations
Implementation Examples¶
Complete Storage Configuration¶
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: fast-storage
provisioner: kubernetes.io/aws-ebs
parameters:
type: io1
iopsPerGB: "10"
fsType: ext4
reclaimPolicy: Retain
allowVolumeExpansion: true
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: app-data
spec:
accessModes:
- ReadWriteOnce
storageClassName: fast-storage
resources:
requests:
storage: 100Gi
---
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: web
spec:
serviceName: "nginx"
replicas: 3
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx
ports:
- containerPort: 80
name: web
volumeMounts:
- name: www
mountPath: /usr/share/nginx/html
volumeClaimTemplates:
- metadata:
name: www
spec:
accessModes: [ "ReadWriteOnce" ]
storageClassName: fast-storage
resources:
requests:
storage: 1Gi
Backup Configuration¶
apiVersion: snapshot.storage.k8s.io/v1
kind: VolumeSnapshotClass
metadata:
name: csi-aws-snapclass
driver: ebs.csi.aws.com
deletionPolicy: Retain
parameters:
description: "Daily backup snapshot"
---
apiVersion: snapshot.storage.k8s.io/v1
kind: VolumeSnapshot
metadata:
name: volume-snap-1
spec:
volumeSnapshotClassName: csi-aws-snapclass
source:
persistentVolumeClaimName: app-data
Resources for Further Learning¶
Practice Exercises¶
- Create and use PersistentVolumes
- Implement StorageClasses
- Configure volume snapshots
- Set up dynamic provisioning
- Implement backup strategies