PGO:Crunchy Data 製 Kubernetes 向け本番グレード PostgreSQL Operator

タグ PostgreSQLKubernetesPostgres Operator高可用性pgBouncerGitOpsバックアップSREcolumnコラムlinuxLinuxkubernetesGitHubオープンソースCrunchyDatapostgres-operator

PGO:Crunchy Data 製 Kubernetes 向け本番グレード PostgreSQL Operator

このソフトで何ができる?

PGO(The Postgres Operator from Crunchy Data)は、Kubernetes 上で PostgreSQL クラスターを自動管理するためのツールです。 YAML ファイル(設定ファイルの一種)を適用するだけで、高可用性・バックアップ・監視・暗号化が揃った本番向け Postgres 環境を数分で構築できます。 クラスターの障害対応やローリングアップデート(無停止での更新)は、Kubernetes の仕組みが自動で引き受けます。 GitOps(Git を使った設定管理手法)とも相性がよく、インフラの状態をコードで管理したいチームに向いています。 手作業でのフェイルオーバー(障害時の切り替え)やバックアップスクリプトの管理から解放され、運用負荷を大幅に下げられます。

こんな人におすすめ

  1. Kubernetes 上でデータベースを安定運用したい SRE・インフラエンジニア — Operator パターン(運用知識をコードに封じ込める設計)により、障害時の手動切り替え作業やバックアップ管理スクリプトの維持から解放されます。データベースの状態変化に Kubernetes が自動で追従します。

  2. マルチクラウド・マルチリージョンの災害復旧(DR)を検討しているチーム — AWS S3・Google Cloud Storage・Azure Blob Storage など主要なオブジェクトストレージへのバックアップと、クラスター間のスタンバイ構成をサポートしています。地理的に離れた拠点への冗長化を宣言的に管理できます。

  3. PostgreSQL を社内サービス(Database-as-a-Service)として提供したいプラットフォームチーム — Namespace(Kubernetes の仮想的な区画)単位でスコープを設定でき、接続プーリング機能(pgBouncer)も標準搭載されています。複数チームへのテナント分離も容易に実現できます。

インストール・使い方

PGO は Kustomize(Kubernetes の設定ファイル管理ツール)を使ったインストールが推奨されています。 あらかじめ Kubernetes クラスターと kubectl(ターミナル=文字で命令を送る画面から Kubernetes を操作するコマンド)が使える状態を用意してください。


Step 1: サンプルリポジトリをフォーク&クローンする

YOUR_GITHUB_UN="<あなたのGitHubユーザー名>"
git clone --depth 1 "[email protected]:${YOUR_GITHUB_UN}/postgres-operator-examples.git"
cd postgres-operator-examples

GitHub(ソースコードの置き場)上の公式サンプルリポジトリを自分のアカウントにフォーク(複製)し、手元にダウンロードします。 コピー&ペーストで実行できます。YOUR_GITHUB_UN の部分だけ自分のユーザー名に書き換えてください。


Step 2: Namespace と Operator 本体をデプロイする

kubectl apply -k kustomize/install/namespace
kubectl apply --server-side -k kustomize/install/default

まず Kubernetes 上に専用の区画(Namespace)を作り、続いて PGO 本体を展開します。 --server-side オプションはサーバー側で設定を適用するモードで、大きめのマニフェストを確実に反映するために指定します。


Step 3: PostgreSQL クラスターを作成する

以下の YAML ファイルを作成し、クラスターの構成を定義します。

# postgres.yaml
apiVersion: postgres-operator.crunchydata.com/v1beta1
kind: PostgresCluster
metadata:
  name: my-cluster
  namespace: postgres-operator
spec:
  postgresVersion: 15
  instances:
    - name: instance1
      replicas: 2
  backups:
    pgbackrest:
      repos:
        - name: repo1
          volume:
            volumeClaimSpec:
              storageClassName: standard
              accessModes: ["ReadWriteOnce"]
              resources:
                requests:
                  storage: 1Gi
kubectl apply -f postgres.yaml
kubectl get postgrescluster -n postgres-operator

YAML を適用すると、Kubernetes がレプリカ(複製インスタンス)2 台・バックアップ用ストレージ 1GB の PostgreSQL 15 クラスターを自動で構築します。 kubectl get postgrescluster で状態が Running になればクラスターの完成です。

対応プラットフォームは Kubernetes / OpenShift / Rancher / GKE / EKS / AKS / VMware Tanzu と幅広く、クラウドベンダーを問わず利用できます。


動かしてみた

リポジトリのファイル構成を確認したところ、Go(プログラミング言語の一種)のモジュールファイル(go.mod / go.sum)と Makefile、そして Dockerfile が揃っており、ソースからビルドできる環境として完結していることが分かりました。

./go.mod
./go.sum
./Makefile
./Dockerfile
./hack/go-get.sh

hack/ ディレクトリには kubeconfig(Kubernetes への接続設定ファイル)生成スクリプトや API テンプレートなど、開発・検証環境の整備を助ける補助スクリプトが用意されています。 コンテナイメージ(アプリを動かす軽量な仮想環境の雛形)のビルドは components/ サブディレクトリに分離されており、PostgreSQL 本体や pgBackRest などコンポーネントごとに独立した Dockerfile で管理されています。 このような構成になっているため、特定のコンポーネントだけを差し替えてビルドするカスタマイズも行いやすくなっています。

インストール後に試せる:ローカル検証の手順

フルスケールの Kubernetes クラスターを用意しなくても、kind(Kubernetes in Docker:Docker の中に Kubernetes を作るツール)を使えばラップトップ上で PGO を検証できます。

# kind クラスター作成
kind create cluster --name pgo-lab

# kubectl コンテキスト(接続先)確認
kubectl cluster-info --context kind-pgo-lab

# PGO インストール(examples リポジトリ使用)
kubectl apply -k kustomize/install/namespace
kubectl apply --server-side -k kustomize/install/default

# Operator Pod の起動確認
kubectl get pods -n postgres-operator

kubectl get podspgo-* という名前の Pod(Kubernetes が管理するコンテナの単位)が Running 状態になれば、Operator の起動が完了です。 その後 PostgresCluster カスタムリソース(YAML で定義したクラスター設定)を apply するだけで、クラスターの自動構築が始まります。

デモについて

PGO は Kubernetes Operator として動作するため、実際に試すには Kubernetes クラスターが必要です。 minikube・kind・クラウドのマネージド Kubernetes(GKE・EKS・AKS など)のいずれかを用意してください。 ブラウザだけで完結するスタンドアロンデモは構造上提供されていません。 ローカルで手軽に試したい場合は、前セクションで紹介した kind を使った方法が最も簡単です。

実践のコツ:はじめの一歩をスムーズに

  • まず kind で動作確認する — クラウド費用をかけずにローカルで全機能を試せます。本番移行前の学習にも最適です。
  • YAML はサンプルを丸ごとコピーして始めるpostgres-operator-examples リポジトリには用途別のサンプルが豊富に揃っています。最初は編集せずそのまま適用してみましょう。
  • kubectl get postgrescluster -w で状態を見守る-w オプションを付けると変化をリアルタイムで追えます。クラスター構築の流れが視覚的に分かります。
  • バックアップ設定は最初に入れる — クラスター作成後に変更するより、最初の YAML に含めておくほうがトラブルを避けやすいです。
  • pgBouncer の有効化は1行追加で済むspecproxy: pgBouncer: {} を追記するだけで接続プーリングが有効になります。アプリの接続数が増えてきたら早めに設定しましょう。
  • ログは kubectl logs で確認 — Operator Pod のログには詳細な処理状況が出力されます。動作が想定と違う場合はまずここを確認してください。

活用例

  • ステージング環境の自動クローン — 本番クラスターのバックアップからクローンを作成し、ステージング DB を常に最新の本番データで維持する CI パイプラインを構築できます。テスト精度の向上に役立ちます。
  • pgBouncer による接続プーリング — アプリケーションの接続数が急増する局面でも、PGO が pgBouncer を自動管理するため PostgreSQL 本体への過負荷を防ぎつつ高スループットを維持できます。
  • pgMonitor + Prometheus + Grafana による監視基盤 — PGO は pgMonitor を標準統合しており、Prometheus(メトリクス収集ツール)のスクレイプ設定と Grafana(グラフ可視化ツール)ダッシュボードを追加設定なしで利用できます。クエリ遅延やレプリケーション遅延の可視化がすぐに始められます。
  • マルチリージョン DR 構成 — 複数の Kubernetes クラスターにまたがるスタンバイクラスター構成を宣言的に管理でき、地理的冗長性を持つ PostgreSQL 環境を実現できます。障害時のフェイルオーバーも自動化されます。
  • PostGIS を使った地理情報アプリ — 空間データ拡張(地図上の位置情報クエリに対応)を含むコンテナイメージが用意されており、地図系アプリのバックエンドとしてすぐに使えます。
  • TimescaleDB による時系列データ管理 — IoT センサーデータやアクセスログなど時系列データの保存・集計に最適化された拡張が Apache ライセンス版で利用できます。PGO 上でそのまま有効化できます。

用語とポイント解説

Kubernetes(クバネティス) コンテナ化されたアプリを自動で管理・スケーリングするプラットフォームです。かんたんに言うと、大量のコンテナを「育てる農場の管理人」のような役割を果たします。Google が開発を始め、現在はオープンソースとして多くの企業が利用しています。

Operator パターン Kubernetes の CRD(独自リソース定義)とコントローラー(監視・制御プログラム)を組み合わせ、特定ソフトの運用知識をコードに封じ込める設計手法です。かんたんに言うと、「熟練した担当者の判断ロジックをプログラムに置き換えたもの」です。PGO はこのパターンで PostgreSQL 運用を自動化しています。

PostgresCluster(カスタムリソース) PGO が定義した独自の Kubernetes リソース種別です。かんたんに言うと、「クラスターの設計図を Kubernetes に渡すための専用フォーマット」です。YAML に書いた内容通りの環境を Kubernetes が自動で組み上げます。

pgBackRest PostgreSQL 向けの高機能バックアップツールです。かんたんに言うと、「差分だけを賢くバックアップし、復元も素早くできる保険役」です。フル・増分・差分バックアップと Delta リストア(差分だけ戻す高速復元)に対応しています。

pgBouncer(接続プーリング) アプリからの大量接続を一度まとめて受け取り、PostgreSQL 本体への接続数を制御するミドルウェアです。かんたんに言うと、「受付窓口を増やして本体の窓口混雑を防ぐ仕組み」です。PGO が自動管理するため、設定1行で有効化できます。

Patroni(パトロニ) PostgreSQL クラスターの高可用性(HA)を制御し、プライマリ障害時のフェイルオーバーを自動化するツールです。かんたんに言うと、「リーダー不在になったら即座に次のリーダーを選ぶ選挙管理人」です。PGO の内部でこのツールが動作しています。

pgMonitor PostgreSQL のメトリクス(性能指標)を収集し、Prometheus 形式で公開するツールセットです。かんたんに言うと、「データベースの健康診断データを定期的に計測して記録係」です。PGO に標準統合されているため、Grafana との連携もすぐに始められます。

GitOps Git リポジトリ(ソースコードの置き場)をインフラ設定の唯一の正源とし、変更はすべて Git 経由で行う運用手法です。かんたんに言うと、「YAML ファイルを Git で管理し、マージするだけで環境が変わる仕組み」です。PGO は YAML で宣言的に管理できるため GitOps との相性が非常によいです。

kustomize(クァスタマイズ) Kubernetes の設定ファイルをテンプレートなしにカスタマイズできるツールです。かんたんに言うと、「元の YAML を上書きするパッチを重ねて、環境ごとの差分だけを管理できる設定管理ツール」です。PGO のインストールも kubectl apply -k という kustomize 経由のコマンドで行います。

Apache 2.0 ライセンス ソースコードの利用・改変・再配布を商用利用も含めて自由に認めるオープンソースライセンスです。かんたんに言うと、「無料で使えて、製品に組み込んでもよい寛容なルール」です。ただし Crunchy Data が提供するコンテナイメージには Developer Program 利用規約が別途適用されるため注意が必要です。


PostgreSQL の運用はバックアップ管理・フェイルオーバー・監視・接続管理と多岐にわたりますが、PGO を使えばこれらを YAML 一枚から始められます。 ぜひ kind を使ったローカル検証や、マルチリージョン DR 構成の自動化などに活用してみてはいかがでしょうか。