OADPバックアップにおけるVolumeSnapshotClassのDeletionPolicyによる挙動の違い

# はじめに

本記事では、OpenShift上のアプリケーションをOpenShift API for Data Protection (OADP) によりバックアップする際、VolumeSnapshotClassのDeletionPolicyによる挙動の違いを確認します。

# 目次

1. [検証環境](#検証環境)
1. [前提条件](#前提条件)
1. [DeletionPolicyがRetainの場合の挙動](#deletionpolicyがretainの場合の挙動)
1. [DeletionPolicyがDeleteの場合の挙動](#deletionpolicyがdeleteの場合の挙動)
1. [まとめ](#まとめ)
1. [参考文献](#参考文献)

# 検証環境

以下のように、OpenShiftのアプリケーションを外部のオブジェクトストレージにバックアップできる環境に対して、OADPの機能検証を行います。
本検証では、クラスタを構成する全てのノードをIBM Powerサーバ (ppc64le) のLPARに構築しています。OpenShiftの永続ストレージはIBM Storage Scale、オブジェクトストレージはMinIOを使用しています。

![ocp-oadp-env.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1936643/eae1ddcc-45ee-e3d1-2caf-d4d62217d50f.png)

CNSAによりOpenShiftからIBM Storage Scaleを永続ストレージとして使用するための環境構築手順は[こちらの記事](https://qiita.com/shingonagai/items/0ca93c32715cd6d48429)、OADPによりアプリケーションをオブジェクトストレージにバックアップする環境構築手順は[こちらの記事](https://qiita.com/shingonagai/items/bceb2f99246c7b8d8ced)をご参照ください。

# 前提条件

以下の作業が完了していることを想定しています。

- OpenShiftクラスタが構築済み
- ストレージ側のScaleクラスタが構築済み
- ストレージ側のScaleクラスタにファイルシステムが作成済み
- ストレージ側のScaleクラスタ内のnsd nodeにScale GUIを構成済み
- OpenShiftクラスタにCNSAをインストール・構成済み
- OADPがインストール・構成済み

# DeletionPolicyがRetainの場合の挙動

まずは、DeletionPolicyがRetainの設定でバックアップを実行して、snapshotの状態を確認します。

bastion nodeへSSHログインします。
```shell-session
# ssh root@<BASTION_NODE>
```

VolumeSnapshotClassのDeletionPolicyを現状設定を確認します。(この例では、Retainが設定されている想定です)
```shell-session
# oc get vsclass
NAME                                DRIVER                      DELETIONPOLICY   AGE
ibm-spectrum-scale-snapshot-class   spectrumscale.csi.ibm.com   Retain           6d3h
```

動作確認用にプロジェクトを作成します。
```shell-session
# oc new-project test1
```

プロジェクト内にPVCを作成します。(この例では、data1を作成しています)
```shell-session
# oc apply -f pvc_data1.yaml
persistentvolumeclaim/data1 created
```

プロジェクト内に上記PVを使用するPodを作成します。
```shell-session
# oc apply -f app.yaml
deployment.apps/test1-app created
```

PVが正常に作成されたことを確認します。
```shell-session
# oc get pvc
NAME    STATUS   VOLUME                                     CAPACITY   ACCESS MODES   STORAGECLASS                AGE
data1   Bound    pvc-2293d977-d743-4082-83e4-0c0486dfd60d   100Gi      RWO            ibm-spectrum-scale-sample   104s
```

動作確認用に作成したtest1というnamespaceに対して、バックアップを取得します。
```shell-session
cat << EOF > backup_test1.yaml
apiVersion: velero.io/v1
kind: Backup
metadata:
  name: backup-retain-1
  namespace: openshift-adp
spec:
  storageLocation: default
  includedNamespaces:
  - test1
EOF
```

```shell-session
# oc apply -f backup_test1.yaml
backup.velero.io/backup-retain-1 created
```

VolumeSnapshotを確認すると、バックアップ取得後に、スナップショットが一旦現れますが、オブジェクトストレージへのバックアップが完了したタイミングで消えました。
```shell-session
# oc get volumesnapshot
NAME                 READYTOUSE   SOURCEPVC   SOURCESNAPSHOTCONTENT   RESTORESIZE   SNAPSHOTCLASS                       SNAPSHOTCONTENT                                    CREATIONTIME   AGE
velero-data1-nzl9h   true         data1                               100Gi         ibm-spectrum-scale-snapshot-class   snapcontent-52170727-eba9-48a8-8832-09847172e405   4s             5s
```

```shell-session
# oc get volumesnapshot
No resources found in test1 namespace.
-> バックアップ完了後に自動的に削除されました
```

MinIOのGUIからbucketの中身を確認すると、backup-retain-1がバックアップされていることが確認できました。
![minio-backup-retain-1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1936643/1c43de6c-2565-0328-e561-d3924fbe2407.png)

VolumeSnapshotContentsを確認すると、直前にバックアップしたものが見えました。(RESTORESIZEはPVと同じサイズでした)
```shell-session
# oc get volumesnapshotcontents
NAME                                               READYTOUSE   RESTORESIZE    DELETIONPOLICY   DRIVER                      VOLUMESNAPSHOTCLASS                 VOLUMESNAPSHOT       VOLUMESNAPSHOTNAMESPACE   AGE
snapcontent-52170727-eba9-48a8-8832-09847172e405   true         107374182400   Retain           spectrumscale.csi.ibm.com   ibm-spectrum-scale-snapshot-class   velero-data1-nzl9h   test1                     16s
```
# DeletionPolicyがDeleteの場合の挙動

次に、DeletionPolicyがDeleteの設定でバックアップを実行して、snapshotの状態を確認します。

VolumeSnapshotClassのDeletionPolicyをRetainからDeleteに変更します。
```shell-session
# cat << EOF > snapshot-class.yaml
apiVersion: snapshot.storage.k8s.io/v1
kind: VolumeSnapshotClass
metadata:
  name: ibm-spectrum-scale-snapshot-class
  labels:
    velero.io/csi-volumesnapshot-class: "true"
driver: spectrumscale.csi.ibm.com
deletionPolicy: Delete
EOF
```

```shell-session
# oc apply -f snapshot-class.yaml
volumesnapshotclass.snapshot.storage.k8s.io/ibm-spectrum-scale-snapshot-class configured
```

DeletionPolicyがDeleteになったことを確認します。
```shell-session
# oc get vsclass
NAME                                DRIVER                      DELETIONPOLICY   AGE
ibm-spectrum-scale-snapshot-class   spectrumscale.csi.ibm.com   Delete           18s
```

動作確認用に作成したtest1というnamespaceに対して、バックアップを取得します。
```shell-session
# cat << EOF > backup_test1.yaml
apiVersion: velero.io/v1
kind: Backup
metadata:
  name: backup-delete-1
  namespace: openshift-adp
spec:
  storageLocation: default
  includedNamespaces:
  - test1
EOF
```

```shell-session
# oc apply -f backup_test1.yaml
backup.velero.io/backup-delete-1 created
```

VolumeSnapshotを確認すると、バックアップ取得後に、スナップショットが一旦現れますが、オブジェクトストレージへのバックアップが完了したタイミングで消えました。(これは、DeletionPolicyがRetainの場合と同じ挙動でした)
```shell-session
# oc get volumesnapshot
NAME                 READYTOUSE   SOURCEPVC   SOURCESNAPSHOTCONTENT   RESTORESIZE   SNAPSHOTCLASS                       SNAPSHOTCONTENT                                    CREATIONTIME   AGE
velero-data1-65wch   true         data1                               100Gi         ibm-spectrum-scale-snapshot-class   snapcontent-6f255d31-8066-4790-84ec-1056ead47e94   5s             5s
```

```shell-session
# oc get volumesnapshot
No resources found in test1 namespace.
-> バックアップ完了後に自動的に削除されました
```

MinIOのGUIからbucketの中身を確認すると、backup-delete-1がバックアップされていることが確認できました。
![minio-backup-delete-1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1936643/6c119bc7-bc92-baf1-27c9-ef6da712d5a3.png)

VolumeSnapshotContentsを確認すると、snapshotは見えますが、Deleteで取得した方 (snapcontent-6f255d31-8066-4790-84ec-1056ead47e94) は、Retainで取得した方とは異なり、RESTORESIZEが0となっていて、namespaceはtest1ではなくなっていました。
```shell-session
# oc get volumesnapshotcontents
NAME                                               READYTOUSE   RESTORESIZE    DELETIONPOLICY   DRIVER                      VOLUMESNAPSHOTCLASS                 VOLUMESNAPSHOT                              VOLUMESNAPSHOTNAMESPACE                   AGE
snapcontent-52170727-eba9-48a8-8832-09847172e405   true         107374182400   Retain           spectrumscale.csi.ibm.com   ibm-spectrum-scale-snapshot-class   velero-data1-nzl9h                          test1                                     4m12s
snapcontent-6f255d31-8066-4790-84ec-1056ead47e94   true         0              Retain           spectrumscale.csi.ibm.com   ibm-spectrum-scale-snapshot-class   name-694ed118-611b-49e4-9341-c62fe7d78f4d   ns-694ed118-611b-49e4-9341-c62fe7d78f4d   29s
```

# まとめ

OpenShift上のアプリケーションをOADPによりバックアップする際に、VolumeSnapshotClassのDeletionPolicyによる挙動の違いを確認しました。DeletionPolicyに依らず、VolumeSnapshotはバックアップ完了とともに自動的に削除されましたが、VolumeSnapshotContentsは保持される・されないという違いが見られました。

# 参考文献
- [Volume Snapshot Class - DeletionPolicy](https://kubernetes.io/docs/concepts/storage/volume-snapshot-classes/)
- [Container Storage Interface Snapshot Support in Velero](https://velero.io/docs/main/csi/)