kubedb ~ Backup and Restore with MinIO ~
はじめに
Kubedbのデプロイに関しては、前回の記事を参考にしていただければと思います。
Instant Snapshot
KubeDBオペレーターは、Kubernetes APIを使用してスナップショットオブジェクトを監視します。 スナップショットオブジェクトが作成されると、pg_dumpallコマンドを実行するジョブが起動され、出力SQLファイルがosmを使用してクラウドストレージにアップロードされます。
今回は単発でSnapShotをとる方法を見て行きます。
まず、MinIOを使うためのSecretを用意します。
$ echo -n 'minioadmin' > AWS_ACCESS_KEY_ID $ echo -n 'minioadmin' > AWS_SECRET_ACCESS_KEY $ kubectl create secret generic s3-secret \ --from-file=./AWS_ACCESS_KEY_ID \ --from-file=./AWS_SECRET_ACCESS_KEY secret "s3-secret" created
では、もうSnapShotを取って行きます。 manifestでさらっと取れるので感激です!!!
# vi snapshot.yaml apiVersion: kubedb.com/v1alpha1 kind: Snapshot metadata: name: snapshot-xyz labels: kubedb.com/kind: Postgres spec: databaseName: quick-postgres storageSecretName: s3-secret s3: endpoint: <URL of MinIO> bucket: test
確認して行きます。
# kubectl apply -f snapshot.yaml # kubectl get snap -n demo NAME DATABASENAME STATUS AGE snapshot-xyz quick-postgres Succeeded 3m1s
MinIOを確認します。
階層を掘っていくと
スナップショットデータは、次のディレクトリのバックエンドに保存されます。
{bucket}/{prefix}/kubedb/{namespace}/{PostgreSQL name}/{Snapshot name}/
Scheduled Snapshot
続いて、Scheduled Snapehotです。 こちらは、Clusterをデプロイ時に指定します。
先ほどと同様に、Secretを作成してください。
そうしたら、manifestを作成して行きます。
#vi pg-snap.yaml apiVersion: kubedb.com/v1alpha1 kind: Postgres metadata: name: scheduled-pg namespace: demo spec: version: "9.6-v2" replicas: 3 storage: storageClassName: "openebs-hostpath" accessModes: - ReadWriteOnce resources: requests: storage: 1Gi backupSchedule: cronExpression: "@every 2m" storageSecretName: s3-secret s3: endpoint: <URL of MinIO> bucket: schedule-test
Clusterが作成されたことを確認します。
# k get pods NAME READY STATUS RESTARTS AGE scheduled-pg-0 1/1 Running 0 63s scheduled-pg-1 1/1 Running 0 111s scheduled-pg-2 1/1 Running 0 106s
MinIOにもしっかり保存されています。
Restore
これからRestoreの検証をして行きます。
データの書き込み
簡単なデータを書き込んでいきます。
# kubectl exec -it -n postgres nginx-0 bash root@nginx-0:/# psql -U postgres -h quick-postgres.demo -p 5432 Password for user postgres: psql (11.7 (Debian 11.7-0+deb10u1), server 10.2) Type "help" for help. postgres=# postgres=# create database restoretest; postgres=# \c restoretest restoretest=# create table restoretest (a text); restoretest=# insert into restoretest values ('before snapshot'); restoretest=# select * from restoretest; a ---------------- before snapshot (1 row)
Snapshotの作成
Snapshotを作成して行きます。
# vi snapshot.yaml apiVersion: kubedb.com/v1alpha1 kind: Snapshot metadata: name: restore-test labels: kubedb.com/kind: Postgres spec: databaseName: quick-postgres storageSecretName: s3-secret s3: endpoint: <URL of MinIO> bucket: test
データの追加
再度、データを書き込んでいきます。
restoretest=# select * from restoretest; a ---------------- before snapshot (1 row) restoretest=# insert into restoretest values ('after snapshot'); restoretest=# select * from restoretest; a ---------------- before snapshot after snapshot (2 rows)
Restore
それでは、DataをRestoreして行きます。 こちらは、再度違うClusterを作成するという処理になります。
spec.databaseSecret.secretName
は、snapshotを作成したClusterのSecretを用います。
spec.init.snapshotSource.name
は、今回用いるSnapshotを書きます。
# kubedb get snap NAME DATABASENAME STATUS AGE restore-test quick-postgres Succeeded 149m # vi pg-recovered.yaml apiVersion: kubedb.com/v1alpha1 kind: Postgres metadata: name: recovered-postgres namespace: demo spec: version: "9.6-v4" databaseSecret: secretName: quick-postgres-auth storage: storageClassName: "openebs-hostpath" accessModes: - ReadWriteOnce resources: requests: storage: 1Gi init: snapshotSource: name: restore-test namespace: demo
それでは適用して行きます。
# kubectl apply -f pg-recovered.yaml
dataの確認
DBへアクセスする際は、snapshotを取ったClusterで用いたpasswordを使用します。
postgres=# \c restoretest restoretest=# select * from restoretest; a ----------------- before snapshot (1 row)
注意
0.12台ですが以下のことが稀に起こります。
- Cluster-A restoretest=# select * from restoretest; a ----------------- before snapshot before snapshot (2 rows) - Cluster B (Clsuter Aの後に同様の手順で再度作成したもの) restoretest=# select * from restoretest; a ----------------- before snapshot (1 row)