- Authors

- Name
- Phillip Pham
- @ddppham
Kubernetes PVC Pending lösen: StorageClass und Provisioner debuggen
TL;DR
PVC bleibt Pending? Prüfen Sie in dieser Reihenfolge: Existiert die StorageClass? Läuft der Provisioner-Pod? Ist die Quota erreicht? In 90% der Fälle fehlt die StorageClass oder der Provisioner kann kein Volume erstellen. kubectl describe pvc zeigt die Ursache in den Events.
4 von 5 PVC-Pending-Problemen haben dieselbe Ursache
Eine fehlende oder falsche StorageClass. Der Rest verteilt sich auf Provisioner-Fehler, Quota-Limits und falsche AccessModes. Hier ist der systematische Weg zur Lösung.
Erster Schritt -- immer:
# PVC-Status und Events prüfen
kubectl describe pvc my-pvc -n my-namespace
# Verfügbare StorageClasses anzeigen
kubectl get storageclass
Die Events-Sektion am Ende von kubectl describe pvc verrät fast immer die Ursache.
Ursache 1: StorageClass existiert nicht
Symptom in den Events:
Events:
Warning ProvisioningFailed storageclass.storage.k8s.io "fast-ssd" not found
Das PVC referenziert eine StorageClass, die im Cluster nicht existiert.
# Alle StorageClasses auflisten
kubectl get sc
# Default StorageClass identifizieren (hat die Annotation "is-default-class: true")
kubectl get sc -o jsonpath='{range .items[*]}{.metadata.name}{"\t"}{.metadata.annotations.storageclass\.kubernetes\.io/is-default-class}{"\n"}{end}'
Lösung: Entweder die fehlende StorageClass anlegen oder das PVC auf eine vorhandene StorageClass ändern:
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: my-pvc
spec:
accessModes:
- ReadWriteOnce
storageClassName: standard # Auf vorhandene SC ändern
resources:
requests:
storage: 10Gi
Keine Default StorageClass gesetzt
Wenn das PVC keine storageClassName angibt und keine Default StorageClass existiert, bleibt es ewig Pending -- ohne hilfreiche Fehlermeldung.
# Default StorageClass setzen
kubectl patch storageclass standard \
-p '{"metadata": {"annotations":{"storageclass.kubernetes.io/is-default-class":"true"}}}'
Ursache 2: Provisioner läuft nicht
Die StorageClass existiert, aber der zugehörige Provisioner-Pod ist down oder fehlerhaft.
# Provisioner der StorageClass herausfinden
kubectl get sc standard -o jsonpath='{.provisioner}'
# Ausgabe z.B.: kubernetes.io/aws-ebs oder rancher.io/local-path
# Provisioner-Pods prüfen (Beispiel für verschiedene Provisioner)
kubectl get pods -n kube-system | grep -i provisioner
kubectl get pods -n kube-system | grep -i csi
| Provisioner | Typischer Pod-Name | Namespace |
|---|---|---|
| AWS EBS CSI | ebs-csi-controller-* | kube-system |
| Longhorn | longhorn-manager-* | longhorn-system |
| Rook/Ceph | rook-ceph-operator-* | rook-ceph |
| Local Path | local-path-provisioner-* | kube-system |
Wenn der Provisioner-Pod nicht läuft oder in CrashLoopBackOff ist, kann kein Volume erstellt werden. Prüfen Sie die Logs:
# Provisioner-Logs anschauen (Beispiel EBS CSI)
kubectl logs -n kube-system deployment/ebs-csi-controller --tail=50
Ursache 3: ResourceQuota oder LimitRange erreicht
In Namespaces mit ResourceQuota kann die Storage-Quota erschöpft sein.
# Quota im Namespace prüfen
kubectl get resourcequota -n my-namespace
kubectl describe resourcequota -n my-namespace
Typische Ausgabe bei erreichter Quota:
Name: storage-quota
Resource Used Hard
-------- ---- ----
requests.storage 95Gi 100Gi
persistentvolumeclaims 9 10
Hier sind 95 von 100 Gi verbraucht. Ein neues PVC mit 10Gi würde die Quota überschreiten.
Lösung: Quota erhöhen oder nicht mehr benötigte PVCs löschen.
Ursache 4: AccessMode passt nicht
Nicht jeder Storage-Typ unterstützt jeden AccessMode.
| AccessMode | Block Storage (EBS, Azure Disk) | File Storage (EFS, NFS) |
|---|---|---|
| ReadWriteOnce (RWO) | Ja | Ja |
| ReadWriteMany (RWX) | Nein | Ja |
| ReadOnlyMany (ROX) | Nein | Ja |
Wenn Sie ReadWriteMany mit einem Block-Storage-Provisioner anfordern, bleibt das PVC Pending.
# AccessMode des PVC prüfen
kubectl get pvc my-pvc -o jsonpath='{.spec.accessModes}'
Statisches Provisioning: PV manuell matchen
Wenn kein dynamischer Provisioner vorhanden ist, müssen Sie das PV manuell erstellen. Damit PVC und PV sich finden, müssen StorageClass, AccessMode und Capacity übereinstimmen:
# PersistentVolume erstellen
apiVersion: v1
kind: PersistentVolume
metadata:
name: my-pv
spec:
capacity:
storage: 10Gi
accessModes:
- ReadWriteOnce
storageClassName: manual
hostPath:
path: /data/my-pv
---
# PVC, das dieses PV matcht
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: my-pvc
spec:
accessModes:
- ReadWriteOnce
storageClassName: manual
resources:
requests:
storage: 10Gi
Debugging-Checkliste
Wenn nichts offensichtlich ist, gehen Sie diese Liste durch:
kubectl describe pvc-- Events lesenkubectl get sc-- Existiert die StorageClass?kubectl get pods -A | grep -i csi-- Läuft der Provisioner?kubectl get resourcequota -n <ns>-- Quota erreicht?kubectl get pv-- Gibt es ein passendes PV (bei statischem Provisioning)?- Cloud-Provider-Logs prüfen (IAM-Rechte, Disk-Limits)
FAQ
Warum bleibt mein PVC auch nach Stunden Pending ohne Event?
Wenn weder Events noch Fehler angezeigt werden, fehlt meistens die Default StorageClass. Ohne StorageClass und ohne explizite storageClassName im PVC passiert einfach nichts -- Kubernetes wartet stillschweigend.
Kann ich die StorageClass eines bestehenden PVC ändern?
Nein. Die StorageClass ist nach der Erstellung unveränderlich. Sie müssen das PVC löschen und neu erstellen. Sichern Sie vorher die Daten, falls das PVC bereits gebunden war.
Was bedeutet WaitForFirstConsumer bei der StorageClass?
Mit volumeBindingMode: WaitForFirstConsumer bleibt das PVC absichtlich in Pending, bis ein Pod es nutzt. Das ist kein Fehler, sondern gewollt -- es stellt sicher, dass das Volume in der richtigen Availability Zone erstellt wird.
Mein PVC ist Bound, aber der Pod kann es nicht mounten. Was nun?
Das ist ein anderes Problem. Prüfen Sie kubectl describe pod -- häufige Ursachen sind Multi-Attach-Fehler (Volume hängt noch an einem anderen Node) oder fehlende CSI-Node-Plugins.
Wenn Ihre Pods nach dem PVC-Fix im Status Pending bleiben, liegt es oft an Resource Limits. Unser Pod Pending Troubleshooting Guide zeigt Ihnen die nächsten Schritte.
Kubernetes-Beratung gesucht?
Wir helfen deutschen Unternehmen bei der Kubernetes-Implementierung, Migration und Optimierung. DSGVO-konform und praxiserprobt.
📖 Verwandte Artikel
Weitere interessante Beiträge zu ähnlichen Themen
Kubernetes Storage: CSI-Treiber und PV richtig nutzen
Persistent Volumes, StorageClasses und CSI-Treiber in Kubernetes konfigurieren: Von dynamischem Provisioning bis Volume Expansion mit Praxisbeispielen.
Kubernetes PVC Pending lösen: Storage-Troubleshooting
PVC bleibt auf Pending? Alle Ursachen und Lösungen: StorageClass, Zone Mismatch, Capacity, Volume Binding Mode und CSI Driver Probleme.
Kubernetes Storage: CSI Driver und PV einrichten
Kubernetes Persistent Volumes und CSI Driver DSGVO-konform einrichten. StorageClasses konfigurieren, Verschlüsselung aktivieren und dynamisches Provisioning nutzen.
Datenbanken auf Kubernetes: StatefulSets richtig nutzen
PostgreSQL mit StatefulSets auf Kubernetes betreiben: Stabile Netzwerk-Identitäten, PersistentVolumeClaims und automatisierte Backups per CronJob.
CoreDNS Debugging: Kubernetes-DNS Probleme lösen
DNS-Probleme in Kubernetes systematisch debuggen: CoreDNS-Logs, ndots-Konfiguration, NXDOMAIN-Fehler und Corefile-Optimierung für schnellere Auflösung.