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 – Github

サーバー全体モードで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に指定してあげると利用できます。

PostgreSQL,Kubernetes,PerconaOperator