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に指定してあげると利用できます。