永続ストレージ付きPostgreSQL StatefulSet

永続ボリュームクレーム、exec ベースのreadinessプローブ、データベース初期化用の環境変数を使用してPostgreSQLをKubernetes StatefulSetとしてデプロイします。

Databases

詳細な説明

KubernetesでのPostgreSQL

データベースには安定したネットワークIDと永続ストレージが必要です — まさにStatefulSetが提供するものです。Deploymentとは異なり、StatefulSetは各ポッドに安定したホスト名を与え、ポッドの再起動やリスケジュール後もボリュームが保持されます。

主要な設定

apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: postgres
  labels:
    app: "postgres"
spec:
  replicas: 1
  template:
    spec:
      containers:
        - name: postgres
          image: postgres:16-alpine
          ports:
            - name: postgres
              containerPort: 5432
          env:
            - name: POSTGRES_DB
              value: "mydb"
            - name: POSTGRES_USER
              value: "admin"
            - name: POSTGRES_PASSWORD
              value: "changeme"
          volumeMounts:
            - name: pgdata
              mountPath: /var/lib/postgresql/data
          readinessProbe:
            exec:
              command:
                - "pg_isready"
                - "-U"
                - "admin"
            initialDelaySeconds: 5
            periodSeconds: 10
      volumes:
        - name: pgdata
          persistentVolumeClaim:
            claimName: pgdata-pvc

なぜStatefulSetか?

  • 安定したネットワークID:ポッドは常にpostgres-0で、予測可能なDNSを実現
  • 永続ボリューム:PVCはポッドの再起動やリスケジュールを超えて存続
  • 順序付きデプロイ:ポッドは順番に作成・終了される(プライマリ/レプリカ構成に重要)

Readinessプローブ

execベースのreadinessプローブはコンテナ内でpg_isreadyを実行します。ポートが開いているだけでなく、PostgreSQLが実際に接続を受け入れていることを検証するため、TCPチェックよりも正確です。

本番環境の考慮事項

本番環境では以下を検討すべきです:

  • パスワードにはプレーンテキスト環境変数ではなくKubernetes Secretsを使用
  • ポイントインタイムリカバリ用のWALアーカイブの設定
  • 自動フェイルオーバー用のCloudNativePGなどのオペレーターの検討
  • スナップショットをサポートするストレージクラスでのより大きなPVC

ユースケース

ポッドの再起動後もデータが保持される開発・ステージング環境でのKubernetesへのPostgreSQLデータベースのデプロイ。本番環境ではデータベースオペレーターの使用を検討してください。

試してみる — K8s Pod Spec Builder

フルツールを開く