diff --git a/changelogs/unreleased/8719-hu-keyu b/changelogs/unreleased/8719-hu-keyu new file mode 100644 index 000000000..eb6925ff2 --- /dev/null +++ b/changelogs/unreleased/8719-hu-keyu @@ -0,0 +1 @@ +Inherit k8s default volumeSnapshotClass. \ No newline at end of file diff --git a/pkg/apis/velero/v1/labels_annotations.go b/pkg/apis/velero/v1/labels_annotations.go index c86b4e91b..78d231ba9 100644 --- a/pkg/apis/velero/v1/labels_annotations.go +++ b/pkg/apis/velero/v1/labels_annotations.go @@ -127,6 +127,9 @@ const ( VolumeSnapshotClassDriverBackupAnnotationPrefix = "velero.io/csi-volumesnapshot-class" VolumeSnapshotClassDriverPVCAnnotation = "velero.io/csi-volumesnapshot-class" + // https://kubernetes.io/zh-cn/docs/concepts/storage/volume-snapshot-classes/ + VolumeSnapshotClassKubernetesAnnotation = "snapshot.storage.kubernetes.io/is-default-class" + // There is no release w/ these constants exported. Using the strings for now. // CSI Annotation volumesnapshotclass // https://github.com/kubernetes-csi/external-snapshotter/blob/master/pkg/utils/util.go#L59-L60 diff --git a/pkg/util/csi/volume_snapshot.go b/pkg/util/csi/volume_snapshot.go index 4e4103efa..f3d1f1a8b 100644 --- a/pkg/util/csi/volume_snapshot.go +++ b/pkg/util/csi/volume_snapshot.go @@ -432,13 +432,23 @@ func GetVolumeSnapshotClassForStorageClass( } } } + // not found by label, pick by annotation + for _, sc := range snapshotClasses.Items { + _, hasDefaultAnnotation := sc.Annotations[velerov1api.VolumeSnapshotClassKubernetesAnnotation] + if sc.Driver == provisioner { + vsClass = sc + if hasDefaultAnnotation { + return &sc, nil + } + } + } // If there's only one volumesnapshotclass for the driver, return it. if n == 1 { return &vsClass, nil } return nil, fmt.Errorf( - "failed to get VolumeSnapshotClass for provisioner %s, ensure that the desired VolumeSnapshot class has the %s label", - provisioner, velerov1api.VolumeSnapshotClassSelectorLabel) + "failed to get VolumeSnapshotClass for provisioner %s, ensure that the desired VolumeSnapshot class has the %s label or %s annotation", + provisioner, velerov1api.VolumeSnapshotClassSelectorLabel, velerov1api.VolumeSnapshotClassKubernetesAnnotation) } // IsVolumeSnapshotClassHasListerSecret returns whether a volumesnapshotclass has a snapshotlister secret diff --git a/site/content/docs/main/csi.md b/site/content/docs/main/csi.md index 89f697f2d..53843841d 100644 --- a/site/content/docs/main/csi.md +++ b/site/content/docs/main/csi.md @@ -45,13 +45,26 @@ This section documents some of the choices made during implementing the CSI snap 1. VolumeSnapshots created by the Velero CSI plugins are retained only for the lifetime of the backup even if the `DeletionPolicy` on the VolumeSnapshotClass is set to `Retain`. To accomplish this, during deletion of the backup the prior to deleting the VolumeSnapshot, VolumeSnapshotContent object is patched to set its `DeletionPolicy` to `Delete`. Deleting the VolumeSnapshot object will result in cascade delete of the VolumeSnapshotContent and the snapshot in the storage provider. 2. VolumeSnapshotContent objects created during a `velero backup` that are dangling, unbound to a VolumeSnapshot object, will be discovered, using labels, and deleted on backup deletion. 3. The Velero CSI plugins, to backup CSI backed PVCs, will choose the VolumeSnapshotClass in the cluster based on the following logic: - 1. **Default Behavior:** + 1. **Default Behavior Based On Annotation:** + You can specify a default VolumeSnapshotClass for VolumeSnapshots that don't request any particular class to bind to by adding the snapshot.storage.kubernetes.io/is-default-class: "true" annotation. + For example, if you want to create a VolumeSnapshotClass for the CSI driver `disk.csi.cloud.com` for taking snapshots of disks created with `disk.csi.cloud.com` based storage classes, you can create a VolumeSnapshotClass like this: + ```yaml + apiVersion: snapshot.storage.k8s.io/v1 + kind: VolumeSnapshotClass + metadata: + name: test-snapclass-by-annotation + annotations: + snapshot.storage.kubernetes.io/is-default-class: "true" + driver: disk.csi.cloud.com + ``` + Note: If multiple CSI drivers exist, a default VolumeSnapshotClass can be specified for each of them. + 2. **Default Behavior Based On Label:** You can simply create a VolumeSnapshotClass for a particular driver and put a label on it to indicate that it is the default VolumeSnapshotClass for that driver. For example, if you want to create a VolumeSnapshotClass for the CSI driver `disk.csi.cloud.com` for taking snapshots of disks created with `disk.csi.cloud.com` based storage classes, you can create a VolumeSnapshotClass like this: ```yaml apiVersion: snapshot.storage.k8s.io/v1 kind: VolumeSnapshotClass metadata: - name: test-snapclass + name: test-snapclass-by-label labels: velero.io/csi-volumesnapshot-class: "true" driver: disk.csi.cloud.com