Velero Restore mit WaitForFirstConsumer StorageClasses
Velero Restores können fehlschlagen oder dauerhaft im Status InProgress verbleiben, wenn die verwendete StorageClass den Volume Binding Mode WaitForFirstConsumer verwendet und Volume Data Movement aktiviert ist.
Problem
Bei StorageClasses mit folgendem Binding Mode wird die Zuordnung eines Persistent Volumes erst durchgeführt, nachdem ein Pod auf einen Node geplant wurde.
volumeBindingMode: WaitForFirstConsumer
Während eines Velero Restores benötigt der Data Mover jedoch bereits ein gebundenes PVC, bevor ein Workload gestartet werden kann. Dadurch entsteht ein Deadlock:
-
PVC bleibt im Status
Pending -
Volume kann nicht bereitgestellt werden
-
Data-Mover-Pod wartet auf das PVC
-
Restore bleibt hängen oder schlägt fehl
Weitere Informationen:
Lösung
Velero unterstützt die Wiederherstellung von PVCs mit verzögerter Bindung durch eine spezielle Node-Agent-Konfiguration.
Hierfür muss:
-
der Node Agent aktiviert werden
-
eine ConfigMap für den Node Agent erstellt werden
-
der Node Agent auf diese ConfigMap verweisen
Node-Agent ConfigMap erstellen
apiVersion: v1
kind: ConfigMap
metadata:
name: velero-node-agent-config
namespace: velero
data:
config.json: |
{
"restorePVC": {
"ignoreDelayBinding": true
}
}
Der Parameter ignoreDelayBinding: true weist Velero an, PVC-Restores nicht durch StorageClasses mit WaitForFirstConsumer zu blockieren.
Helm-Konfiguration
Folgende Werte müssen für die Velero-Installation gesetzt werden:
deployNodeAgent: true
nodeAgent:
extraArgs:
- --node-agent-configmap=velero-node-agent-config
Dadurch wird der Node Agent als DaemonSet bereitgestellt und verwendet die zuvor angelegte ConfigMap.
Verifikation
Prüfen, ob der Node Agent läuft:
kubectl -n velero get daemonset node-agent
Prüfen, ob die ConfigMap vorhanden ist:
kubectl -n velero get configmap velero-node-agent-config
Prüfen, ob der Parameter übernommen wurde:
kubectl -n velero describe daemonset node-agent
Die Container-Argumente sollten folgendes enthalten:
--node-agent-configmap=velero-node-agent-config
Restore testen
Restore starten:
velero restore create \
--from-backup <backup-name>
Restore-Status prüfen:
velero restore get
Details anzeigen:
velero restore describe <restore-name> --details
Fehleranalyse
PVCs prüfen:
kubectl get pvc -A
Events prüfen:
kubectl get events -A --sort-by=.lastTimestamp
Typische Hinweise auf das Problem:
waiting for first consumer to be created before binding
oder
pod has unbound immediate PersistentVolumeClaims
Ergebnis
Durch die Aktivierung des Velero Node Agents und die Konfiguration von ignoreDelayBinding können PVCs auf StorageClasses mit WaitForFirstConsumer erfolgreich per Volume Data Movement wiederhergestellt werden.
Der Restore kann dadurch abgeschlossen werden, ohne die bestehende StorageClass-Konfiguration anzupassen.