Kubernetes(K8s) / OpenShift のバックアップ/リストアに Verelo を使うという選択肢があります。このVeleroを使って1つのネームスペースやプロジェクトをバックアップ/リストアする方法はよく見かけますが、クラスタ全体をバックアップ/リストアするといったことを記載している記事はそれほどありません。
ここでは、K8s/OpenShift 内にあるたくさんのネームスペースやプロジェクトの中から、任意の1つを誤って削除してしまった場合でも使える方法として、全体のバックアップ/リストアの方法を記載したいと思います。
ここでは Velero のバックアップ先としてS3互換のオブジェクトストレージを使う必要があります。OpenShift は多くのベンダー様に提供されていることもあり、どれか特定のベンダー様のストレージではなく今回はminIOを採用しました。
検証環境です。
私自身のPC:mac、
OpenShift の環境:Red Hat OpenShift on IBM Cloud (通称、ROKS)
1. Velero プロジェクトをGitクローン
まずは mac に適切なディレクトリを作成し、移動。そこへ Git で Velero をクローンします。
$ mdir veleroTest
$ cd veleroTest
$ git clone https://github.com/vmware-tanzu/velero.git
2. Credential ファイル作成
ローカルディレクトリに以下の内容を記載した Credential ファイル( credentials-velero )を作成します。
[default]
aws_access_key_id = minio
aws_secret_access_key = minio123
3. 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
4.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.
5.テストプロジェクト作成
テストプロジェクトを作成します。
$ oc new-project backuptest
6.全体バックアップ
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」となっていれば、バックアップ完了です。
7.テストプロジェクト削除
では、#5で作成したテストプロジェクトを削除してみます。
$ oc delete project backuptest
8.全体リストア
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
9.結果
ご覧のように削除したテストプロジェクトを復活させることができました。
参考:Velero本家サイト( https://github.com/vmware-tanzu/velero/blob/main/site/content/docs/v1.5/contributions/minio.md )