kubernetesへのDBファイル・インポート手順

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