kubernetesでシステム構築する際に、意外に難しいのがデータベースの構築やバックアップ&リストアです。
DBインスタンスのコンテナを立てることじたいは簡単なのですが、論理バックアップでデータを移行するためにはバックアップファイルをpsqlコマンド/mysqlコマンドに投入する必要があります。
ローカル環境のdockerであればvolumeを用いてホスト上のファイルをコンテナから取り扱えますが、kubernetesのクラスタではホストとpodの対応を特定するのは手順として無理があります。
kubernetesのDBオペレーションについては、port-forward機能を利用する方が便利です。詳細は、 kubernetes上のDBMS バックアップ&リストアを参照してください。
ここでは、dockerにも応用できる手順としてイメージファイルにバンドルする手順を紹介します。なお、この手法はバックアップ時には使えないことにあらかじめ注意してください。
PostgreSQL on k8sへの論理リストア
dockerやkubernetesで、使い捨てのコンテナイメージにバックアップファイルをバンドルする手順は、おおざっぱに言うと、以下のような流れとなります。
- 稼働中のDBサーバー・コンテナとは別にpsqlクライアント・コンテナを作成する
- pg_dumpで取得したファイルをクライアント・コンテナにバンドルする
- kuberunetesのservice経由でクライアント→サーバーに接続し、インポートする
バックアップファイルをバンドルしたコンテナイメージを作成
psqlクライアントについては、Docker HubのPostgres公式イメージをそのまま利用できます。以下のようなDockerfileでsql/ディレクトリにあるダンプファイルをコンテナ・イメージに同梱できます。
FROM postgres
Add sql/ /root/sql/
作成したイメージを 通常のkubernetes、GKEの手順に沿ってプライベートリポジトリにpushしておきます。
PostgreSQLクライアントpodを起動
作成したイメージを用いてkubectl create
コマンドでpodを起動します。以下はpod構成のYAMLファイルの例です。とくに気をつけるべき点はありません。使い捨てのコンテナなので、Replication Containerである必要もなく、シンプルなpodで問題なく動作します。
apiVersion: v1
kind: Pod
metadata:
name: pg-client
labels:
name: pg-client
spec:
containers:
- resources:
limits:
cpu: 200m
image: gcr.io/some-project-id/pg-client
name: pg-client
ports:
- containerPort: 5432
name: pg-client
バックアップファイルからのインポート
podが起動したら、kubectl exec -it pg-client bash
でクライアント・コンテナのシェルにログインします。
( kubectl execの使い方で詳細に解説しています)
あとは、通常のpsqlを用いたインポート手順と同様です。接続先サーバのネットワーク環境変数(PostgreSQLサーバーコンテナのserviceで設定したもの)は、set
コマンドで確認できます。
# cd /root/sql
# psql -Upostgres -h $PG_SERVICE_HOST some-database > some-backup.sql
psqlコマンドは通常のDBクライアントと使い方に違いはありません。必要に応じてDBにログインしてcreate database;
も可能です。
インポートが完了したら、podからexitし、kubectl delete -f pg-client.yaml
でpodを削除しておきます。
Chuma Takahiro