OADPで特定のPVを対象から除外してバックアップ

# はじめに

本記事では、OpenShift上のアプリケーションをOpenShift API for Data Protection (OADP) によりバックアップする際、特定のPVを除外してバックアップする機能を検証します。

# 目次

1. [検証環境](#検証環境)
1. [前提条件](#前提条件)
1. [OADPで特定のPVをexcludeしてバックアップ](#oadpで特定のpvをexcludeしてバックアップ)
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がインストール・構成済み

# OADPで特定のPVをexcludeしてバックアップ

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

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

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

```shell-session
# oc apply -f pvc_data2.yaml
persistentvolumeclaim/data2 created
```

```shell-session
# oc apply -f pvc_data3.yaml
persistentvolumeclaim/data3 created
```

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

3つのPVが正常に作成されたことを確認します。
```shell-session
# oc get pvc
NAME       STATUS   VOLUME                                     CAPACITY   ACCESS MODES   STORAGECLASS                     AGE
data1      Bound    pvc-09d20fad-2b3b-4b4d-9148-0bed3c5d9972   100Gi      RWO            ibm-spectrum-scale-csi-fileset   5d21h
data2      Bound    pvc-f41d4ca9-efe8-42fc-81d5-1fcfe50284f0   200Gi      RWO            ibm-spectrum-scale-csi-fileset   6d17h
data3      Bound    pvc-28fcadb2-f01a-4492-89c6-ad3f4feab96c   300Gi      RWO            ibm-spectrum-scale-csi-fileset   6d17h
```

3つのPVのうち、data2とdata3をバック対象から除外するように、exclude-from-backupラベルをPVCとPVに設定します。
```shell-session
# oc -n test1 label pvc/data2 velero.io/exclude-from-backup=true
persistentvolumeclaim/data2 labeled
```

```shell-session
# oc -n test1 label pv/pvc-f41d4ca9-efe8-42fc-81d5-1fcfe50284f0 velero.io/exclude-from-backup=true
persistentvolume/pvc-f41d4ca9-efe8-42fc-81d5-1fcfe50284f0 labeled
```

```shell-session
# oc -n test1 label pvc/data3 velero.io/exclude-from-backup=true
persistentvolumeclaim/data3 labeled
```

```shell-session
# oc -n test1 label pv/pvc-28fcadb2-f01a-4492-89c6-ad3f4feab96c  velero.io/exclude-from-backup=true
persistentvolume/pvc-28fcadb2-f01a-4492-89c6-ad3f4feab96c labeled
```

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

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

取得したsnapshotを確認します。
```shell-session
# oc get volumesnapshotcontents
NAME                                               READYTOUSE   RESTORESIZE    DELETIONPOLICY   DRIVER                      VOLUMESNAPSHOTCLASS                     VOLUMESNAPSHOT                              VOLUMESNAPSHOTNAMESPACE                   AGE
snapcontent-0fa20379-7bb4-443a-81ac-cf3b452c5c35   true         107374182400   Retain           spectrumscale.csi.ibm.com   ibm-spectrum-scale-snapshot-class       velero-database-gzgwn                       test1                                 6d16h
```

Scaleクラスタのnsd nodeからsnapshotを確認します。 (Storage Scaleのmmlssnapshotコマンドの出力の中に、作成した3つのPVCが含まれるかを調べます)
```shell-session
# ssh <NSD_NDOE> "/usr/lpp/mmfs/bin/mmlssnapshot fs1 | grep -e pvc-09d20fad-2b3b-4b4d-9148-0bed3c5d9972 -e pvc-f41d4ca9-efe8-42fc-81d5-1fcfe50284f0 -e pvc-28fcadb2-f01a-4492-89c6-ad3f4feab96c"
snapshot-0fa20379-7bb4-443a-81ac-cf3b452c5c35 9         Valid   Mon Jul 22 19:31:22 2024  Mon Jul 22 19:31:22 2024 pvc-09d20fad-2b3b-4b4d-9148-0bed3c5d9972 
```

3つのPVのうち、2つのPVがバックアップ対象から除外され、data1 (pvc-09d20fad-2b3b-4b4d-9148-0bed3c5d9972) のみsnapshotが取得されています。

# まとめ

OpenShift上のアプリケーションをOADPによりバックアップする際に、exclude-from-backupラベルを特定のPVC及びPVに設定することにより、バックアップ対象から除外されることを確認できました。

# 参考文献
- [Veloro Backup Reference](https://velero.io/docs/main/backup-reference/)