# Kubernetes Storage: Persistenz, Volumes & CSI-Schnittstellen
TL;DR / Management Summary Ein Pod (Artikel 812) hat standardmäßig kein Gedächtnis. Um Daten über Neustarts und Host-Ausfälle hinweg zu retten, benötigt Kubernetes Persistent Volumes (PV). Wir nutzen das CSI (Container Storage Interface), um Proxmox-Speicher (ZFS/Ceph) oder externe NAS-Systeme (NFS) anzubinden. Ein Senior Admin nutzt StorageClasses, damit Applikationen ihren Speicherplatz vollautomatisch und “on-demand” anfordern können, ohne dass der Admin für jede VM manuell eingreifen muss.
# 1. Die drei Säulen des K8s Storage
Trennung von Bedarf und Angebot.
- Persistent Volume (PV): Das physische Angebot. (z.B. eine 100 GB LUN auf dem Ceph-Cluster).
- Persistent Volume Claim (PVC): Die Anforderung des Entwicklers. “Ich brauche 10 GB Speicher mit Read-Write-Zugriff”.
- StorageClass (SC): Der Vermittler. Definiert, welcher Treiber (Provisioner) genutzt wird, um das PV automatisch zu erstellen.
# 2. Access Modes: Wer darf schreiben?
Den Zugriff steuern.
Nicht jeder Speicher unterstützt jeden Zugriffstyp:
- ReadWriteOnce (RWO): Nur ein einziger Pod darf gleichzeitig lesen und schreiben. (Standard für Block-Storage wie iSCSI/Local-ZFS).
- ReadWriteMany (RWM): Viele Pods dürfen gleichzeitig schreiben. (Erfordert Netzwerk-Filesysteme wie NFS oder CephFS).
- ReadOnlyMany (ROM): Viele Pods dürfen gleichzeitig lesen.
# 3. Deep Dive: CSI (Container Storage Interface)
Die universelle Steckdose.
CSI ist der Standard, mit dem Kubernetes mit Storage-Herstellern spricht.
- Aktion: Installieren Sie den Proxmox CSI Driver in Ihrem Kubernetes-Cluster.
- Nutzen: Wenn ein User ein PVC erstellt, ruft Kubernetes die Proxmox-API (Artikel 712) auf, erstellt ein neues ZVOL im ZFS-Pool und mountet es in den Container.
# 4. Day-2 Operations: Backup von PVs
Sicherheit für die Claims.
Sichern Sie die Daten unterhalb von Kubernetes.
- Methode A: Nutzen Sie den Proxmox Backup Server (Artikel 693), um die zugrunde liegenden ZVOLs der VMs zu sichern.
- Methode B: Nutzen Sie Applikations-native Backups (z.B. Velero), die Snapshots via CSI-Schnittstelle triggern.
# 5. Troubleshooting & “War Stories”
Wenn der Mount-Point ‘hängt’.
# Top 3 Fehlerbilder
-
Symptom: Pod bleibt im Status
ContainerCreating.- Ursache: Das PVC kann nicht gemountet werden (“Multi-Attach Error”).
- Lösung: Prüfen Sie, ob ein alter Pod auf einem anderen Knoten das Volume noch sperrt. (Node-Drain Problem).
-
Symptom: “StorageClass not found”.
- Ursache: Tippfehler im YAML oder der Provisioner-Dienst ist abgestürzt.
-
Symptom: Datenverlust nach Pod-Neustart.
- Ursache: Die Applikation nutzt fälschlicherweise
emptyDir(flüchtig) statt eines PVCs.
- Ursache: Die Applikation nutzt fälschlicherweise
# “War Story”: Der “Stale” NFS-Mount
Ein Admin betrieb einen WordPress-Cluster auf Kubernetes und nutzte NFS für die Bilder. Das Ereignis: Das NAS (Artikel 657) startete nach einem Update neu. Das Ergebnis: Alle Kubernetes-Knoten verloren den Kontakt zum NFS. Da der Linux-Kernel standardmäßig bei NFS-Timeouts blockiert (“Stale File Handle”), hingen alle Pods fest. Ein einfacher Neustart der Pods half nicht, da die Mount-Points auf den Host-Systemen (den VMs) korrupt waren. Lehre: Nutzen Sie für Netzwerk-Storage in Kubernetes immer CSI-Treiber mit aktivem Monitoring, die Mount-Fehler erkennen und die betroffenen Knoten automatisch neu initialisieren.
# 6. Monitoring & Reporting
Füllstände im Cluster.
# Storage Dashboards
Überwachen Sie via Prometheus:
kubelet_volume_stats_available_bytes.- Alert: Wenn ein PVC > 90% gefüllt ist -> Automatische Ticket-Erstellung an den App-Besitzer.
# 7. Fazit & Empfehlung
Storage ist der komplizierteste Teil von Kubernetes.
- Empfehlung: Nutzen Sie Rancher Longhorn oder Ceph (Rook) als internes Storage-Backend für Ihren K8s-Cluster. Es ist robuster als externe NFS-Lösungen.
- Wichtig: Verwenden Sie für Datenbanken immer RWO (Local-SSD/NVMe) für maximale Performance. Filesharing (RWM) gehört in den Application-Layer (z.B. S3-kompatible Dienste).
# Anhang: Cheatsheet (kubectl storage)
| Aufgabe | Befehl |
|---|---|
| PVs auflisten | kubectl get pv |
| PVC Status | kubectl get pvc |
| StorageClasses | kubectl get sc |
| Volume Details | kubectl describe pv <name> |