web-dev-qa-db-ja.com

Google CloudのKubernetesでPostgresデータベースをバックアップする方法

Google Cloud Container Engine で実行されているPostgresデータベースをバックアップするためのベストプラクティスは何ですか?

私の考えは、バックアップを Google Cloud Storage に保存することに取り組んでいますが、ディスク/ポッドをストレージバケットに接続する方法がわかりません。

次の構成を使用して、KubernetesクラスターでPostgresを実行しています。

apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  name: postgres-deployment
spec:
  replicas: 1
  template:
    metadata:
      labels:
        app: postgres
    spec:
      containers:
        - image: postgres:9.6.2-Alpine
          imagePullPolicy: IfNotPresent
          env:
            - name: PGDATA
              value: /var/lib/postgresql/data
            - name: POSTGRES_DB
              value: my-database-name
            - name: POSTGRES_PASSWORD
              value: my-password
            - name: POSTGRES_USER
              value: my-database-user
          name: postgres-container
          ports:
            - containerPort: 5432
          volumeMounts:
            - mountPath: /var/lib/postgresql
              name: my-postgres-volume
      volumes:
        - gcePersistentDisk:
            fsType: ext4
            pdName: my-postgres-disk
          name: my-postgres-volume

バックアップを実行するために ジョブ を作成しようとしました:

apiVersion: batch/v1
kind: Job
metadata:
  name: postgres-dump-job
spec:
  template:
    metadata:
      labels:
        app: postgres-dump
    spec:
      containers:
        - command:
            - pg_dump
            - my-database-name
          # `env` value matches `env` from previous configuration.
          image: postgres:9.6.2-Alpine
          imagePullPolicy: IfNotPresent
          name: my-postgres-dump-container
          volumeMounts:
            - mountPath: /var/lib/postgresql
              name: my-postgres-volume
              readOnly: true
      restartPolicy: Never
      volumes:
        - gcePersistentDisk:
            fsType: ext4
            pdName: my-postgres-disk
          name: my-postgres-volume

(私が理解している限り)これは pg_dump コマンドを実行し、バックアップデータをstdout(kubectl logsに表示されるはずです)に出力する必要があります。

余談ですが、(kubectl get podsを使用して)ポッドを検査すると、ポッドが「保留」状態から脱出しないことが示されます。これは、ジョブを開始するための十分なリソースがないために発生します。

このプロセスをジョブとして実行することは正しいですか?ジョブをGoogle Cloud Storageに接続するにはどうすればよいですか?それとも私は完全に違うことをするべきですか?

データベースコンテナーでpg_dumpを(kubectl execを使用して)パフォーマンスヒットのために実行するのは賢明ではないと思いますが、開発/ステージングサーバーではこれで問題ありませんか?

11
MattMS

Pg_dumpをジョブとして実行することは良い考えだと思いますが、DBの永続ディスクに直接接続することはできません。 pg_dumpをネットワーク経由でDBに接続してみてください。次に、pg_dumpコマンドがバックアップをダンプする2番目のディスクを作成できます。安全のために、この2番目のディスクの定期的なスナップショットを作成できます。

2
Marco Lamina

@Marco Laminaが言ったように、あなたはpostgresポッドでpg_dumpを実行することができます

DUMP
// pod-name         name of the postgres pod
// postgres-user    database user that is able to access the database
// database-name    name of the database
kubectl exec [pod-name] -- bash -c "pg_dump -U [postgres-user] [database-name]" > database.sql


RESTORE
// pod-name         name of the postgres pod
// postgres-user    database user that is able to access the database
// database-name    name of the database
cat database.sql | kubectl exec -i [pod-name] -- psql -U [postgres-user] -d [database-name]

このコマンドを実行し、これをAWSs3などのファイルストレージシステムにエクスポートするジョブポッドを作成できます。

Jobs PODがPending状態を維持する理由は、GCE永続ディスクの接続/マウントを永遠に試み、すでに別のPODに接続/マウントされているために失敗しているためです。

永続ディスクを複数のPODに接続することは、それらすべてがボリュームを読み取り専用モードで接続/マウントする場合にのみサポートされます。もちろん、これは実行可能な解決策ではありません。

GCEを使用したことはありませんが、GCE内からPDからスナップショットを簡単に作成できるはずです。これでは、「クラッシュした」状態のような、非常にクリーンなバックアップは得られません。途中で、しかし回復可能です」しかし、これはおそらくあなたのために許容可能です。

データベースPOD内でpg_dumpを実行することは実行可能なソリューションですが、すでに気付いたようにいくつかの欠点、特にパフォーマンスがあります。また、結果のバックアップを後でPODから移動する必要があります。 kubectl cpと別のexecを使用して、PODのバックアップをクリーンアップします。

1
Alexander Block