OpenShift API for Data Protection (OADP) によるアプリケーションのバックアップ環境の構築

# はじめに

本記事では、OpenShift API for Data Protection (OADP) を使用して、OpenShift上のアプリケーションをオブジェクトストレージにバックアップする環境を構築する手順を示します。

# 目次

1. [検証環境](#検証環境)
1. [前提条件](#前提条件)
1. [オブジェクトストレージの準備](#オブジェクトストレージの準備)
1. [OADP Operatorのインストール](#oadp-operatorのインストール)
1. [OADP設定の事前作業](#oadp設定の事前作業)
1. [OADPの設定](#oadpの設定)
1. [OADPの動作確認](#oadpの動作確認)
1. [まとめ](#まとめ)
1. [参考文献](#参考文献)

# 検証環境

以下のように、master node 3ノード、worker node 2ノードで構成されるOpenShiftクラスタ (左)、及びストレージ側のNSD node 2ノードで構成されるScaleクラスタ (右)、がそれぞれ構築済みで、かつOpenShiftクラスタからリモートのStorage Scaleを永続ストレージとして使用できる環境に対して、アプリケーションを外部のオブジェクトストレージにバックアップできるように構成します。
オブジェクトストレージは簡易的にbastion node上にMinIOを稼働させ、これを使用することとします。bastion nodeへのMinIOの導入・設定、及びOADPによるバックアップ環境の構築は本記事内で実施します。
なお、本検証ではクラスタを構成する全てのノードをIBM Powerサーバ (ppc64le) のLPARに構築しています。

![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)をご参照下さい。

# 前提条件

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

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

# オブジェクトストレージの準備

今回は簡易検証のため、専用のオブジェクトストレージは準備せず、bastion nodeにMinIOを稼働させ、OADPの動作を確認することにします。

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

MinIOのコンテナイメージを取得・実行します。(bastion nodeでは9000番ポートはOpenShiftで使用済みのため、代わりに19000番ポートを使用しています)
```shell-session
podman run -d -p 19000:9000 -p 9001:9001 quay.io/minio/minio server /data --console-address ":9001"
```

前ステップで指定したポートに対するアクセスを許可します。
```shell-session
# firewall-cmd --add-port=19000/tcp --zone=public --permanent
success
```

```shell-session
# firewall-cmd --add-port=9001/tcp --zone=public --permanent
success
```

firewallの設定をリロードします。
```shell-session
# firewall-cmd --reload
success
```

ブラウザから9001番ポートにアクセスして、以下のようなログイン画面が出てくれば、MinIOは正常に稼働しています。(初期設定では、minioadmin/minioadminでログインできます)

<img width="500" alt="minio_login.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1936643/f33fb644-cbda-a26a-3b95-d742f8be7599.png">

ログインできたら、バックアップ用のbucketを作成しておきます。

<img width="500" alt="minio_bucket.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1936643/b8cc21d0-3d4f-5909-0e81-292cf196ed55.png">

# OADP Operatorのインストール

OpenShift Webコンソールにログインして、左のメニューからOperatorHubを選択後、"oadp"で検索するとOADP Operatorが見つかりますので、default設定でインストールします。

<img width="500" alt="oadp-install.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1936643/76c2e966-d8f7-d45b-a5ce-586f637a0ccc.png">

# OADP設定の事前作業

OpenShiftクラスタへログインします。
```shell-session
# oc login https://<URL>:6443 -u kubeadmin
```

VolumeSnapshotClassを作成します。
```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: Retain
EOF
```

```shell-session
# oc apply -f snapshot-class.yaml
```

VolumeSnapshotClassが作成されたことを確認します。
```shell-session
# oc get vsclass 
NAME                                    DRIVER                      DELETIONPOLICY   AGE 
ibm-spectrum-scale-snapshot-class       spectrumscale.csi.ibm.com   Retain           12s 
```

試しに、volume snapshotを作成してみます。(ibm-spectrum-scale-pvc-1というPVCが作成済み想定です。PVC名は環境に合わせて変更してください)
```shell-session
# cat << EOF > snapshot_test.yaml 
apiVersion: snapshot.storage.k8s.io/v1
kind: VolumeSnapshot
metadata:
  name: ibm-spectrum-scale-vol-snapshot
spec:
  volumeSnapshotClassName: ibm-spectrum-scale-snapshot-class
  source:
    persistentVolumeClaimName: ibm-spectrum-scale-pvc-1
EOF
```

```shell-session
# oc apply -f snapshot_test.yaml
```

volume snapshotが作成されたことを確認します。
```shell-session
# oc get volumesnapshot
NAME                              READYTOUSE   SOURCEPVC                  SOURCESNAPSHOTCONTENT   RESTORESIZE   SNAPSHOTCLASS                           SNAPSHOTCONTENT                                    CREATIONTIME   AGE 
ibm-spectrum-scale-vol-snapshot   true         ibm-spectrum-scale-pvc-1                           1Gi           ibm-spectrum-scale-csi-snapshot-class   snapcontent-2b4e0718-24d8-432c-98a3-75a9ba0bc33b   6s             7s 
```

StorageClassのdefaultを設定します。
```shell-session
# oc patch storageclass ibm-spectrum-scale-csi-fileset -p '{"metadata":{"annotations":{"storageclass.kubernetes.io/is-default-class":"true"}}}' 
storageclass.storage.k8s.io/ibm-spectrum-scale-csi-fileset patched 
```

default設定されたことを確認します。
```shell-session
# oc get storageclass 
NAME                                       PROVISIONER                    RECLAIMPOLICY   VOLUMEBINDINGMODE      ALLOWVOLUMEEXPANSION   AGE 
ibm-spectrum-scale-csi-fileset (default)   spectrumscale.csi.ibm.com      Delete          Immediate              false                  4d12h 
ibm-spectrum-scale-internal                kubernetes.io/no-provisioner   Delete          WaitForFirstConsumer   false                  4d15h 
ibm-spectrum-scale-sample                  spectrumscale.csi.ibm.com      Delete          Immediate              true                   4d13h 
```

veleroでCSI snapshotを取得できるようラベルをセットします。
```shell-session
# oc patch vsclass ibm-spectrum-scale-csi-snapshot-class -p '{"metadata":{"labels":{"velero.io/csi-volumesnapshot-class":"true"}}}' --type=merge 
volumesnapshotclass.snapshot.storage.k8s.io/ibm-spectrum-scale-csi-snapshot-class patched 
```

ラベルがセットされたことを確認します。
```shell-session
# oc get vsclass ibm-spectrum-scale-csi-snapshot-class -o yaml | grep csi-volumesnapshot-class
    velero.io/csi-volumesnapshot-class: "true" 
```
# OADPの設定

MinIOのcredentialを設定します。(環境に合わせて、aws_access_key_id と aws_secret_access_key を変更してください)
```shell-session
# cat << EOF > credentials-veloro
[backupStorage]
aws_access_key_id=minioadmin
aws_secret_access_key=minioadmin
EOF
```

```shell-session
# oc create secret generic cloud-credentials -n openshift-adp --from-file cloud=credentials-velero 
secret/cloud-credentials created 
```

DataProtectionApplicationを設定します。(環境に合わせて、s3Urlなどの設定項目を変更してください。)
```shell-session
# cat << EOF > dataprotectionapplication.yaml
apiVersion: oadp.openshift.io/v1alpha1
kind: DataProtectionApplication
metadata:
  name: oadp-minio
  namespace: openshift-adp
spec:
  configuration:
    velero:
      defaultPlugins:
        - csi
apiVersion: velero.io/v1
        - openshift
        - aws
    featureFlags:
    - EnableCSI
    restic:
      enable: true
  backupLocations:
    - name: default
      velero:
        provider: aws
        default: true
        objectStorage:
          bucket: scale-backup
          prefix: velero
        config:
          region: minio
          s3Url: http://192.168.0.1:19000
          s3ForcePathStyle: "true"
          insecureSkipTLSVerify: "true"
          profile: "backupStorage"
        credential:
          key: cloud
          name: cloud-credentials
EOF
```

```shell-session
# oc apply -f dataprotectionapplication.yaml 
dataprotectionapplication.oadp.openshift.io/oadp-minio created 
```

# OADPの動作確認

動作確認用にプロジェクトを作成します。
```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
```

動作確認用に作成した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
```

アプリケーションに変更を加えた後、取得したバックアップでリストアを試してみます。
```shell-session
# cat << EOF > restore_test1.yaml
apiVersion: velero.io/v1
kind: Restore
metadata:
  name: restore-test-1
  namespace: openshift-adp
spec:
  backupName: backup-test-1
  includedNamespaces:
  - test1
  restorePVs: true
EOF
```

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

バックアップやリストアの状態は、OpenShift Dashboardから、インストール済みのOperatorのメニューでOADP Operatorを選択して、確認することができます。

<img width="500" alt="oadp-backup.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1936643/a425a928-70f0-a064-b298-0bf1931a4df3.png">
<img width="500" alt="oadp-restore.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1936643/9933746f-f03f-a810-fba6-0f0802cbb097.png">

# まとめ

OpenShiftにOADPを導入して、アプリケーションを外部のオブジェクトストレージにバックアップする環境が構築できました。
別の記事では、OADPの機能を試してみたいと思います。

# 参考文献
- [OADP アプリケーションのバックアップと復元](https://docs.redhat.com/ja/documentation/openshift_container_platform/4.14/html/backup_and_restore/oadp-application-backup-and-restore)
- [MinIO Documentation](https://min.io/docs/minio/container/index.html)
- [MinIO github](https://github.com/minio/minio)