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.