Kubernetes+Percona Operator for PostgreSQL
Perconaのoperatorではイメージにpgroongaがインストール出来ずZalando Postgres Operatorを使うことにしたので別記事にしました。
Percona Operatorのインストール
自動フェイルオーバーやバックアップ周りをやってくれるOperatorです。PgBouncerを使えばPgpoolを入れなくてもプーリングが可能です。
使用しようとしていたCrunchyPGOのPostgreSQLのイメージの権利周りがちょっと問題ありそうなのでfork版のPercona Oparator for PostgreSQLを使用します。
サーバー全体モードでPercona Operatorをデプロイします。
kubectl apply --server-side -f https://raw.githubusercontent.com/percona/percona-postgresql-operator/main/deploy/bundle.yaml
データーベースのコンテナを作成していきます。
cr.yaml
公式Githubのサンプルを参考に設定していきます。
PostgreSQLのDB本体のコンテナ作成です。バックアップ先はMiniOで作成したオブジェクトストレージに設定しています。
PVC(ストレージ)にはrook/cephの分散ストレージ(RBD)を使用しています
apiVersion: pgv2.percona.com/v2 kind: PerconaPGCluster metadata: name: my-postgres spec: crVersion: 2.3.0 users: - name: postgres - name: DBユーザー名 databases: - misskeydb # Postgres15を使用 image: perconalab/percona-postgresql-operator:main-ppg15-postgres imagePullPolicy: Always postgresVersion: 15 instances: - name: pg1 replicas: 3 #レプリカ数 priorityClassName: high-priority walVolumeClaimSpec: storageClassName: rook-ceph-block accessModes: - "ReadWriteOnce" resources: requests: storage: 1Gi dataVolumeClaimSpec: storageClassName: rook-ceph-block accessModes: - ReadWriteOnce resources: requests: storage: 2Gi #データーベースのサイズ # これを使うと自動でプーリングしてくれる proxy: pgBouncer: replicas: 3 image: perconalab/percona-postgresql-operator:main-ppg15-pgbouncer backups: pgbackrest: image: perconalab/percona-postgresql-operator:main-ppg15-pgbackrest configuration: - secret: name: pgbackrest-secrets jobs: priorityClassName: high-priority global: repo1-retention-full: "14" # フルバックの保持期間 repo1-s3-uri-style: path #MiniOの場合https://url/backetになるので設定 repoHost: priorityClassName: high-priority manual: repoName: repo1 options: - --type=full repos: # バックアップ(sqlダンプ+WAL)をストレージに取る場合 - name: repo1 schedules: full: "0 0 * * 6" # 1週間に一度フルバックアップ differential: "0 1 * * 1-6" # 差分は毎日1時 volume: volumeClaimSpec: accessModes: - ReadWriteOnce resources: requests: storage: 4Gi # バックアップをs3などのオブジェクトストレージに取る場合 - name: repo2 s3: bucket: "test" # S3バケット名 endpoint: "img.estampie.work" region: "us-east-1" # WebUIダッシュボード、使用するにはPMMサーバのインストールが必要 pmm: enabled: true image: percona/pmm-client:2.37.0 secret: my-postgres-pmm-secret serverHost: monitoring-service patroni: dynamicConfiguration: postgresql: parameters: max_parallel_workers: 2 max_worker_processes: 2 shared_buffers: 1GB work_mem: 2MB
ダッシュボードを使用する場合は別途PMMサーバーのインストールが必要です。Dockerなどでインストールします。必要なければコメントアウトします。
s3バックアップの保存先はオブジェクトストレージのMiniOにするので、アクセスキーとアクセストークンは先にMiniOで作成しておき、下記コマンドでK8sのSecretに保存しておきます。
s3のアクセスキーとトークンをbase64変換
$ cat <<EOF | base64 --wrap=0 [global] repo2-s3-key=<YOUR_AWS_S3_KEY> repo2-s3-key-secret=<YOUR_AWS_S3_KEY_SECRET> repo2-storage-verify-tls=y EOF
エンコードされた文字列を下記に入れてsecretファイルを作成
pgbackrest-secrets.yaml
オブジェクトストレージにアクセスするためのSecretです。
apiVersion: v1 kind: Secret metadata: name: pgbackrest-secrets type: Opaque data: s3.conf: <base64-encoded-configuration-contents>
kubectl apply -f pgbackrest-secrets.yaml
データーベース本体は下記でデプロイします。
kubectl apply -f cr.yaml
DBパスワードは自動生成されるので任意のパスワードで上書きします
kubectl patch secret my-postgres-pguser-DBユーザー名 -p '{"stringData":{"password":"DBパスワード"}}'
あとは付属のPgBouncerを使用する場合はアプリケーションからmy-postgres-pgbouncerを、Pgpoolを使用する場合Pgpoolのbackend_hostname0をmy-postgres-haに/backend_hostname1をmy-postgres-replicasに指定してあげると利用できます。