diff --git a/changelogs/unreleased/4497-dkeven b/changelogs/unreleased/4497-dkeven new file mode 100644 index 000000000..63d246e42 --- /dev/null +++ b/changelogs/unreleased/4497-dkeven @@ -0,0 +1 @@ +Skip not mounted volumes when backing up diff --git a/pkg/restic/backupper.go b/pkg/restic/backupper.go index cb8e8569a..4e411c62d 100644 --- a/pkg/restic/backupper.go +++ b/pkg/restic/backupper.go @@ -25,6 +25,7 @@ import ( "github.com/sirupsen/logrus" corev1api "k8s.io/api/core/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "k8s.io/apimachinery/pkg/util/sets" corev1client "k8s.io/client-go/kubernetes/typed/core/v1" "k8s.io/client-go/tools/cache" @@ -118,9 +119,10 @@ func (b *backupper) BackupPodVolumes(backup *velerov1api.Backup, pod *corev1api. b.resultsLock.Unlock() var ( - errs []error - podVolumeBackups []*velerov1api.PodVolumeBackup - podVolumes = make(map[string]corev1api.Volume) + errs []error + podVolumeBackups []*velerov1api.PodVolumeBackup + podVolumes = make(map[string]corev1api.Volume) + mountedPodVolumes = sets.String{} ) // put the pod's volumes in a map for efficient lookup below @@ -128,6 +130,12 @@ func (b *backupper) BackupPodVolumes(backup *velerov1api.Backup, pod *corev1api. podVolumes[podVolume.Name] = podVolume } + for _, container := range pod.Spec.Containers { + for _, volumeMount := range container.VolumeMounts { + mountedPodVolumes.Insert(volumeMount.Name) + } + } + var numVolumeSnapshots int for _, volumeName := range volumesToBackup { volume, ok := podVolumes[volumeName] @@ -162,6 +170,13 @@ func (b *backupper) BackupPodVolumes(backup *velerov1api.Backup, pod *corev1api. continue } + // volumes that are not mounted by any container should not be backed up, because + // its directory is not created + if !mountedPodVolumes.Has(volumeName) { + log.Warnf("Volume %s is declared in pod %s/%s but not mounted by any container, skipping", volumeName, pod.Namespace, pod.Name) + continue + } + volumeBackup := newPodVolumeBackup(backup, pod, volume, repo.Spec.ResticIdentifier, pvc) if volumeBackup, err = b.repoManager.veleroClient.VeleroV1().PodVolumeBackups(volumeBackup.Namespace).Create(context.TODO(), volumeBackup, metav1.CreateOptions{}); err != nil { errs = append(errs, err)