Kubernetes /  OpenShift 全体バックアップ

Kubernetes(K8s) / OpenShift のバックアップ/リストアに [Verelo]( https://github.com/vmware-tanzu/velero/blob/main/site/content/docs/v1.5/contributions/minio.md ) を使うという選択肢があります。このVeleroを使って１つのネームスペースやプロジェクトをバックアップ/リストアする方法はよく見かけますが、クラスタ全体をバックアップ/リストアするといったことを記載している記事はそれほどありません。
ここでは、K8s/OpenShift 内にあるたくさんのネームスペースやプロジェクトの中から、任意の1つを誤って削除してしまった場合でも使える方法として、全体のバックアップ/リストアの方法を記載したいと思います。
ここでは Velero のバックアップ先としてS3互換のオブジェクトストレージを使う必要があります。OpenShift は多くのベンダー様に提供されていることもあり、どれか特定のベンダー様のストレージではなく今回はminIOを採用しました。

検証環境です。
私自身のPC：mac、
OpenShift の環境：Red Hat OpenShift　 on IBM Cloud (通称、ROKS)

１. Velero プロジェクトをGitクローン
   まずは mac に適切なディレクトリを作成し、移動。そこへ Git で Velero をクローンします。
```
$ mdir veleroTest
$ cd veleroTest
$ git clone https://github.com/vmware-tanzu/velero.git
```

２. Credential ファイル作成
ローカルディレクトリに以下の内容を記載した Credential ファイル（ credentials-velero ）を作成します。
```
[default]
aws_access_key_id = minio
aws_secret_access_key = minio123
```

３. CLI を使って OpenShift に接続。その後、oc コマンドで velero プロジェクトを作成と minIO インスタンス追加
```
$ cd velero
$ kubectl apply -f examples/minio/00-minio-deployment.yaml

namespace/velero created
deployment.apps/minio created
service/minio created
job.batch/minio-setup created
```

４．velero プロジェクトへvelero インストール
```
$ cd .. ( credentials-velero ファイルがあるディレクトリに移動 )
$ velero install \\
  --provider aws \\
  --plugins velero/velero-plugin-for-aws:v1.1.0 \\
  --bucket velero \\
  --secret-file ./credentials-velero \\
  --use-volume-snapshots=false \\
  --backup-location-config region
=minio,s3ForcePathStyle="true",s3Url=http://minio.velero.svc:9000

I0410 21:56:37.589860   30647 request.go:665] Waited for 1.176635822s due to client-side throttling, not priority and fairness, request: GET:https://c100-e.jp-tok.containers.cloud.ibm.com:32372/apis/submariner.io/v1?timeout=32s
CustomResourceDefinition/backups.velero.io: attempting to create resource
CustomResourceDefinition/backups.velero.io: attempting to create resource client
CustomResourceDefinition/backups.velero.io: already exists, proceeding
CustomResourceDefinition/backups.velero.io: created
CustomResourceDefinition/backupstoragelocations.velero.io: attempting to create resource
CustomResourceDefinition/backupstoragelocations.velero.io: attempting to create resource client
CustomResourceDefinition/backupstoragelocations.velero.io: already exists, proceeding
CustomResourceDefinition/backupstoragelocations.velero.io: created
CustomResourceDefinition/deletebackuprequests.velero.io: attempting to create resource
CustomResourceDefinition/deletebackuprequests.velero.io: attempting to create resource client
CustomResourceDefinition/deletebackuprequests.velero.io: already exists, proceeding
CustomResourceDefinition/deletebackuprequests.velero.io: created
CustomResourceDefinition/downloadrequests.velero.io: attempting to create resource
CustomResourceDefinition/downloadrequests.velero.io: attempting to create resource client
CustomResourceDefinition/downloadrequests.velero.io: already exists, proceeding
CustomResourceDefinition/downloadrequests.velero.io: created
CustomResourceDefinition/podvolumebackups.velero.io: attempting to create resource
CustomResourceDefinition/podvolumebackups.velero.io: attempting to create resource client
CustomResourceDefinition/podvolumebackups.velero.io: already exists, proceeding
CustomResourceDefinition/podvolumebackups.velero.io: created
CustomResourceDefinition/podvolumerestores.velero.io: attempting to create resource
CustomResourceDefinition/podvolumerestores.velero.io: attempting to create resource client
CustomResourceDefinition/podvolumerestores.velero.io: already exists, proceeding
CustomResourceDefinition/podvolumerestores.velero.io: created
CustomResourceDefinition/resticrepositories.velero.io: attempting to create resource
CustomResourceDefinition/resticrepositories.velero.io: attempting to create resource client
CustomResourceDefinition/resticrepositories.velero.io: already exists, proceeding
CustomResourceDefinition/resticrepositories.velero.io: created
CustomResourceDefinition/restores.velero.io: attempting to create resource
CustomResourceDefinition/restores.velero.io: attempting to create resource client
CustomResourceDefinition/restores.velero.io: already exists, proceeding
CustomResourceDefinition/restores.velero.io: created
CustomResourceDefinition/schedules.velero.io: attempting to create resource
CustomResourceDefinition/schedules.velero.io: attempting to create resource client
CustomResourceDefinition/schedules.velero.io: already exists, proceeding
CustomResourceDefinition/schedules.velero.io: created
CustomResourceDefinition/serverstatusrequests.velero.io: attempting to create resource
CustomResourceDefinition/serverstatusrequests.velero.io: attempting to create resource client
CustomResourceDefinition/serverstatusrequests.velero.io: already exists, proceeding
CustomResourceDefinition/serverstatusrequests.velero.io: created
CustomResourceDefinition/volumesnapshotlocations.velero.io: attempting to create resource
CustomResourceDefinition/volumesnapshotlocations.velero.io: attempting to create resource client
CustomResourceDefinition/volumesnapshotlocations.velero.io: already exists, proceeding
CustomResourceDefinition/volumesnapshotlocations.velero.io: created
Waiting for resources to be ready in cluster...
Namespace/openshift-adp: attempting to create resource
Namespace/openshift-adp: attempting to create resource client
Namespace/openshift-adp: created
ClusterRoleBinding/velero-openshift-adp: attempting to create resource
ClusterRoleBinding/velero-openshift-adp: attempting to create resource client
ClusterRoleBinding/velero-openshift-adp: already exists, proceeding
ClusterRoleBinding/velero-openshift-adp: created
ServiceAccount/velero: attempting to create resource
ServiceAccount/velero: attempting to create resource client
ServiceAccount/velero: created
Secret/cloud-credentials: attempting to create resource
Secret/cloud-credentials: attempting to create resource client
Secret/cloud-credentials: created
BackupStorageLocation/default: attempting to create resource
BackupStorageLocation/default: attempting to create resource client
BackupStorageLocation/default: created
Deployment/velero: attempting to create resource
Deployment/velero: attempting to create resource client
Deployment/velero: created
Velero is installed! ⛵ Use 'kubectl logs deployment/velero -n openshift-adp' to view the status.
```

５．テストプロジェクト作成
テストプロジェクトを作成します。
```
$ oc new-project backuptest
```
![スクリーンショット 2022-04-17 23.43.11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/682574/c8e4e23a-5338-6e17-0c70-ff2e4384afb0.png)


６．全体バックアップ
Velero コマンドを使って OpenShift 全体をバックアップ。
全体バックアップのミソは、これまでの記事では「--include-namespaces 〇〇〇」として特定プロジェクトをバックアップしていましたが、全体バックアップの時にはプロジェクトを指定しません。
```
$ oc project velero ( <- velero プロジェクトにカレントを移します。)
$ velero backup create backup-20220410

I0410 22:02:18.908406   30879 request.go:665] Waited for 1.179368271s due to client-side throttling, not priority and fairness, request: GET:https://c100-e.jp-tok.containers.cloud.ibm.com:32372/apis/rbac.authorization.k8s.io/v1beta1?timeout=32s
Backup request "backup-20220410" submitted successfully.
Run `velero backup describe backup-20220410` or `velero backup logs backup-20220410` for more details.
```

クラスタ全体をバックアップしますので、結構時間がかかります。
バックアップ完了はバックアップコマンドを実行した時に表示される``velero backup logs backup-20220410``で確認します。
まだ進行中の時の表示
```
I0410 22:02:59.407311   30917 request.go:665] Waited for 1.169058469s due to client-side throttling, not priority and fairness, request: GET:https://c100-e.jp-tok.containers.cloud.ibm.com:32372/apis/policy.open-cluster-management.io/v1?timeout=32s
Name:         backup-20220410
Namespace:    openshift-adp
Labels:       velero.io/storage-location=default
Annotations:  velero.io/source-cluster-k8s-gitversion=v1.21.8+ee73ea2
              velero.io/source-cluster-k8s-major-version=1
              velero.io/source-cluster-k8s-minor-version=21

Phase:  InProgress  <- ＊進行中

Errors:    0
Warnings:  0

Namespaces:
  Included:  *
  Excluded:  <none>

Resources:
  Included:        *
  Excluded:        <none>
  Cluster-scoped:  auto

Label selector:  <none>

Storage Location:  default

Velero-Native Snapshot PVs:  auto

TTL:  720h0m0s

Hooks:  <none>

Backup Format Version:  1.1.0

Started:    2022-04-10 22:02:22 +0900 JST
Completed:  <n/a>

Expiration:  2022-05-10 22:02:22 +0900 JST

Velero-Native Snapshots: <none included>
```
バックアップ完了時の表示
```
I0410 22:07:37.333144   31095 request.go:665] Waited for 1.171373663s due to client-side throttling, not priority and fairness, request: GET:https://c100-e.jp-tok.containers.cloud.ibm.com:32372/apis/console.openshift.io/v1?timeout=32s
Name:         backup-20220410
Namespace:    openshift-adp
Labels:       velero.io/storage-location=default
Annotations:  velero.io/source-cluster-k8s-gitversion=v1.21.8+ee73ea2
              velero.io/source-cluster-k8s-major-version=1
              velero.io/source-cluster-k8s-minor-version=21

Phase:  Completed　  <- *　完了

Errors:    0
Warnings:  0

Namespaces:
  Included:  *
  Excluded:  <none>

Resources:
  Included:        *
  Excluded:        <none>
  Cluster-scoped:  auto

Label selector:  <none>

Storage Location:  default

Velero-Native Snapshot PVs:  auto

TTL:  720h0m0s

Hooks:  <none>

Backup Format Version:  1.1.0

Started:    2022-04-10 22:02:22 +0900 JST
Completed:  2022-04-10 22:04:38 +0900 JST

Expiration:  2022-05-10 22:02:22 +0900 JST

Total items to be backed up:  9231
Items backed up:              9231

Velero-Native Snapshots: <none included>
```
このように「Phase」が「Complited」となっていれば、バックアップ完了です。

７．テストプロジェクト削除
では、#5で作成したテストプロジェクトを削除してみます。
```
$ oc delete project backuptest
```

Terminating中
![スクリーンショット 2022-04-17 23.55.00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/682574/50bb4463-46ae-6fe0-1ef3-f3f1cee32056.png)
削除完了
![スクリーンショット 2022-04-17 23.55.14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/682574/23ed4b48-50cf-2ee5-44d0-cffdd3f715ad.png)


８．全体リストア
Velero コマンドを使って OpenShift 全体をリストア。
```
$ velero restore create --from-backup backup-20220410

Restore request "backup-20220410-10-20220410221304" submitted successfully.
Run `velero restore describe backup-20220410-20220410221304` or `velero restore logs backup-20220410-20220410221304` for more details.
```

クラスタ全体をリストアしますので、バックアップ同様時間がかかります。
リストアプ完了もリストア実行時に表示される``velero restore describe backup-20220410-20220410221304``で確認します。
まだリストア進行中の時の表示
```
I0410 22:14:33.212729   31393 request.go:665] Waited for 1.167638461s due to client-side throttling, not priority and fairness, request: GET:https://c100-e.jp-tok.containers.cloud.ibm.com:32372/apis/addon.open-cluster-management.io/v1alpha1?timeout=32s
Name:         backup-20220410-20220410221304
Namespace:    openshift-adp
Labels:       <none>
Annotations:  <none>

Phase:                                 InProgress  <- *進行中
Estimated total items to be restored:  8506
Items restored so far:                 497

Started:    2022-04-10 22:13:09 +0900 JST
Completed:  <n/a>  

Backup:  backup-20220410

Namespaces:
  Included:  all namespaces found in the backup
  Excluded:  <none>

Resources:
  Included:        *
  Excluded:        nodes, events, events.events.k8s.io, backups.velero.io, restores.velero.io, resticrepositories.velero.io
  Cluster-scoped:  auto

Namespace mappings:  <none>

Label selector:  <none>

Restore PVs:  auto

Preserve Service NodePorts:  auto
```

リストア完了時の表示
```
I0418 00:06:54.699255    7006 request.go:665] Waited for 1.165774424s due to client-side throttling, not priority and fairness, request: GET:https://c100-e.jp-tok.containers.cloud.ibm.com:32372/apis/internal.open-cluster-management.io/v1beta1?timeout=32s
Name:         backup-20220417-20220417235725
Namespace:    openshift-adp
Labels:       <none>
Annotations:  <none>

Phase:                                 Completed <- *完了
Estimated total items to be restored:  8555
Items restored so far:                 4087

Started:    2022-04-17 23:57:25 +0900 JST
Completed:  <n/a>

Backup:  backup-20220417

Namespaces:
  Included:  all namespaces found in the backup
  Excluded:  <none>

Resources:
  Included:        *
  Excluded:        nodes, events, events.events.k8s.io, backups.velero.io, restores.velero.io, resticrepositories.velero.io
  Cluster-scoped:  auto

Namespace mappings:  <none>

Label selector:  <none>

Restore PVs:  auto

Preserve Service NodePorts:  auto

```

![スクリーンショット 2022-04-18 0.05.12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/682574/32586bb8-56b8-a657-2377-ac9e136fd29d.png)


９．結果
ご覧のように削除したテストプロジェクトを復活させることができました。


参考：Velero本家サイト( https://github.com/vmware-tanzu/velero/blob/main/site/content/docs/v1.5/contributions/minio.md )