issue8294: inherit k8s default volumeSnapshotClass (#8721)
* inherit k8s default volumeSnapshotClass Signed-off-by: hu-keyu <hzldd999@gmail.com> * add doc change for issue8294 Signed-off-by: hu-keyu <hzldd999@gmail.com> --------- Signed-off-by: hu-keyu <hzldd999@gmail.com>pull/8848/head
parent
8934b2cb17
commit
5160f96c2e
|
@ -0,0 +1 @@
|
|||
Inherit k8s default volumeSnapshotClass.
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
Loading…
Reference in New Issue