Loading source
Pulling the file list, source metadata, and syntax-aware rendering for this listing.
Source from repo
Deploy and manage Kubernetes workloads: manifests, RBAC, Helm charts, service mesh, GitOps, and troubleshooting.
Files
Skill
Size
Entrypoint
Format
Open file
Syntax-highlighted preview of this file as included in the skill package.
references/storage.md
1# Kubernetes Storage23## StorageClass Definitions45### AWS EBS (gp3)67```yaml8apiVersion: storage.k8s.io/v19kind: StorageClass10metadata:11name: fast-ssd12annotations:13storageclass.kubernetes.io/is-default-class: "true"14provisioner: ebs.csi.aws.com15parameters:16type: gp317iops: "3000"18throughput: "125"19encrypted: "true"20kmsKeyId: "arn:aws:kms:us-east-1:123456789012:key/..."21volumeBindingMode: WaitForFirstConsumer22allowVolumeExpansion: true23reclaimPolicy: Delete24```2526### GCE Persistent Disk (SSD)2728```yaml29apiVersion: storage.k8s.io/v130kind: StorageClass31metadata:32name: fast-ssd-gce33provisioner: pd.csi.storage.gke.io34parameters:35type: pd-ssd36replication-type: regional-pd37volumeBindingMode: WaitForFirstConsumer38allowVolumeExpansion: true39reclaimPolicy: Delete40```4142### Azure Disk (Premium SSD)4344```yaml45apiVersion: storage.k8s.io/v146kind: StorageClass47metadata:48name: fast-ssd-azure49provisioner: disk.csi.azure.com50parameters:51storageaccounttype: Premium_LRS52kind: Managed53volumeBindingMode: WaitForFirstConsumer54allowVolumeExpansion: true55reclaimPolicy: Delete56```5758### NFS Storage5960```yaml61apiVersion: storage.k8s.io/v162kind: StorageClass63metadata:64name: nfs-storage65provisioner: nfs.csi.k8s.io66parameters:67server: nfs-server.example.com68share: /exports/kubernetes69volumeBindingMode: Immediate70reclaimPolicy: Retain71```7273## PersistentVolume (Static Provisioning)7475```yaml76apiVersion: v177kind: PersistentVolume78metadata:79name: legacy-database-pv80labels:81type: local82app: legacy-db83spec:84capacity:85storage: 100Gi86volumeMode: Filesystem87accessModes:88- ReadWriteOnce89persistentVolumeReclaimPolicy: Retain90storageClassName: manual91hostPath:92path: /mnt/data/legacy-db93nodeAffinity:94required:95nodeSelectorTerms:96- matchExpressions:97- key: kubernetes.io/hostname98operator: In99values:100- node-01101```102103## PersistentVolumeClaim Patterns104105### Basic PVC (Dynamic Provisioning)106107```yaml108apiVersion: v1109kind: PersistentVolumeClaim110metadata:111name: database-pvc112namespace: production113labels:114app: postgres115spec:116accessModes:117- ReadWriteOnce118storageClassName: fast-ssd119resources:120requests:121storage: 50Gi122```123124### Shared Storage (ReadWriteMany)125126```yaml127apiVersion: v1128kind: PersistentVolumeClaim129metadata:130name: shared-assets131namespace: production132spec:133accessModes:134- ReadWriteMany135storageClassName: nfs-storage136resources:137requests:138storage: 100Gi139```140141### Block Volume142143```yaml144apiVersion: v1145kind: PersistentVolumeClaim146metadata:147name: block-storage148namespace: production149spec:150accessModes:151- ReadWriteOnce152volumeMode: Block153storageClassName: fast-ssd154resources:155requests:156storage: 10Gi157```158159## Using PVCs in Pods160161### Single PVC Mount162163```yaml164apiVersion: v1165kind: Pod166metadata:167name: database-pod168spec:169containers:170- name: postgres171image: postgres:15172volumeMounts:173- name: data174mountPath: /var/lib/postgresql/data175volumes:176- name: data177persistentVolumeClaim:178claimName: database-pvc179```180181### Multiple PVCs182183```yaml184apiVersion: v1185kind: Pod186metadata:187name: app-pod188spec:189containers:190- name: app191image: myapp:latest192volumeMounts:193- name: data194mountPath: /data195- name: logs196mountPath: /var/log/app197- name: shared198mountPath: /shared199volumes:200- name: data201persistentVolumeClaim:202claimName: app-data-pvc203- name: logs204persistentVolumeClaim:205claimName: app-logs-pvc206- name: shared207persistentVolumeClaim:208claimName: shared-assets209```210211## StatefulSet with VolumeClaimTemplates212213```yaml214apiVersion: apps/v1215kind: StatefulSet216metadata:217name: postgres-cluster218namespace: database219spec:220serviceName: postgres221replicas: 3222selector:223matchLabels:224app: postgres225template:226metadata:227labels:228app: postgres229spec:230containers:231- name: postgres232image: postgres:15-alpine233ports:234- containerPort: 5432235volumeMounts:236- name: data237mountPath: /var/lib/postgresql/data238- name: config239mountPath: /etc/postgresql240volumes:241- name: config242configMap:243name: postgres-config244volumeClaimTemplates:245- metadata:246name: data247labels:248app: postgres249spec:250accessModes: ["ReadWriteOnce"]251storageClassName: fast-ssd252resources:253requests:254storage: 50Gi255```256257## Volume Snapshots258259### VolumeSnapshotClass260261```yaml262apiVersion: snapshot.storage.k8s.io/v1263kind: VolumeSnapshotClass264metadata:265name: csi-snapclass266driver: ebs.csi.aws.com267deletionPolicy: Delete268parameters:269encrypted: "true"270```271272### VolumeSnapshot273274```yaml275apiVersion: snapshot.storage.k8s.io/v1276kind: VolumeSnapshot277metadata:278name: database-snapshot-20231214279namespace: production280spec:281volumeSnapshotClassName: csi-snapclass282source:283persistentVolumeClaimName: database-pvc284```285286### Restore from Snapshot287288```yaml289apiVersion: v1290kind: PersistentVolumeClaim291metadata:292name: database-restored293namespace: production294spec:295accessModes:296- ReadWriteOnce297storageClassName: fast-ssd298dataSource:299name: database-snapshot-20231214300kind: VolumeSnapshot301apiGroup: snapshot.storage.k8s.io302resources:303requests:304storage: 50Gi305```306307## Volume Expansion308309```yaml310# 1. Ensure StorageClass allows expansion311apiVersion: storage.k8s.io/v1312kind: StorageClass313metadata:314name: fast-ssd315allowVolumeExpansion: true316# ... rest of config317318---319# 2. Expand PVC by updating size320apiVersion: v1321kind: PersistentVolumeClaim322metadata:323name: database-pvc324spec:325accessModes:326- ReadWriteOnce327storageClassName: fast-ssd328resources:329requests:330storage: 100Gi # Increased from 50Gi331```332333## EmptyDir Volumes334335### Memory-Backed EmptyDir336337```yaml338apiVersion: v1339kind: Pod340metadata:341name: cache-pod342spec:343containers:344- name: app345image: myapp:latest346volumeMounts:347- name: cache348mountPath: /cache349volumes:350- name: cache351emptyDir:352medium: Memory353sizeLimit: 1Gi354```355356### Disk-Backed EmptyDir357358```yaml359apiVersion: v1360kind: Pod361metadata:362name: worker-pod363spec:364containers:365- name: worker366image: worker:latest367volumeMounts:368- name: scratch369mountPath: /tmp/scratch370volumes:371- name: scratch372emptyDir:373sizeLimit: 10Gi374```375376## ConfigMap and Secret Volumes377378```yaml379apiVersion: v1380kind: Pod381metadata:382name: app-pod383spec:384containers:385- name: app386image: myapp:latest387volumeMounts:388- name: config389mountPath: /etc/config390readOnly: true391- name: secrets392mountPath: /etc/secrets393readOnly: true394volumes:395- name: config396configMap:397name: app-config398items:399- key: app.yaml400path: config.yaml401mode: 0644402- name: secrets403secret:404secretName: app-secrets405defaultMode: 0400406items:407- key: db-password408path: database/password409```410411## Projected Volumes412413```yaml414apiVersion: v1415kind: Pod416metadata:417name: projected-pod418spec:419containers:420- name: app421image: myapp:latest422volumeMounts:423- name: combined424mountPath: /combined425readOnly: true426volumes:427- name: combined428projected:429sources:430- secret:431name: app-secrets432items:433- key: password434path: secrets/password435- configMap:436name: app-config437items:438- key: config.yaml439path: config/app.yaml440- downwardAPI:441items:442- path: pod/labels443fieldRef:444fieldPath: metadata.labels445- path: pod/annotations446fieldRef:447fieldPath: metadata.annotations448```449450## CSI Driver Examples451452### AWS EBS CSI Driver453454```yaml455apiVersion: v1456kind: Pod457metadata:458name: app-pod459spec:460containers:461- name: app462image: myapp:latest463volumeMounts:464- name: data465mountPath: /data466volumes:467- name: data468csi:469driver: ebs.csi.aws.com470volumeAttributes:471type: gp3472iops: "3000"473encrypted: "true"474```475476### Secrets Store CSI Driver477478```yaml479apiVersion: v1480kind: Pod481metadata:482name: secrets-pod483spec:484serviceAccountName: app-sa485containers:486- name: app487image: myapp:latest488volumeMounts:489- name: secrets-store490mountPath: /mnt/secrets491readOnly: true492volumes:493- name: secrets-store494csi:495driver: secrets-store.csi.k8s.io496readOnly: true497volumeAttributes:498secretProviderClass: aws-secrets499```500501## HostPath Volumes (Use with Caution)502503```yaml504apiVersion: v1505kind: Pod506metadata:507name: privileged-pod508spec:509containers:510- name: app511image: myapp:latest512volumeMounts:513- name: host-data514mountPath: /host-data515securityContext:516privileged: true517volumes:518- name: host-data519hostPath:520path: /data521type: DirectoryOrCreate522```523524## Best Practices5255261. **Dynamic Provisioning**: Prefer dynamic provisioning with StorageClasses5272. **Access Modes**: Use correct access mode (RWO for single node, RWX for multi-node)5283. **Reclaim Policy**: Use Retain for critical data, Delete for temporary5294. **Backup**: Regular snapshots and offsite backups5305. **Monitoring**: Monitor disk usage and performance metrics5316. **Expansion**: Enable volume expansion in StorageClass5327. **Performance**: Choose appropriate storage type for workload5338. **Security**: Encrypt volumes at rest and in transit5349. **Limits**: Set size limits on emptyDir volumes53510. **Labels**: Label PVCs for organization and backup policies536