ry's Tech blog

Cloud Native技術などについて書いていきます。

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を確認します。

kubedb-instant-snapshot1

階層を掘っていくと

kubedb-instant-snapshot2

スナップショットデータは、次のディレクトリのバックエンドに保存されます。 {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にもしっかり保存されています。

kubedb-scheduled-snapshot

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)