永続ストレージ付き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データベースのデプロイ。本番環境ではデータベースオペレーターの使用を検討してください。