KubernetesでデータベースをStatefulSetで運用する|ヘッドレスサービス・PodDisruptionBudgetの実践

現場実践|Kubernetes StatefulSet設計
Kubernetesでデータベースを運用する|StatefulSet・ヘッドレスサービス・PodDisruptionBudgetの実践
「KubernetesでMySQLやRedisを動かしたい」「StatefulSetとDeploymentの違いは?」——KubernetesでステートフルなワークロードをStatefulSetで管理する方法と、マネージドDBとの使い分けを解説します。
💡 KubernetesでDBを動かすことは技術的には可能ですが、本番環境ではAWSのRDS・ElastiCacheなどマネージドサービスを使うことを強く推奨します。キャッシュ・開発用DBなど一部のユースケースではStatefulSetが有効です。
1. StatefulSetとDeploymentの違い
| Deployment | StatefulSet | |
|---|---|---|
| Podの名前 | ランダムなサフィックス(my-app-a1b2c) | 連番の固定サフィックス(mysql-0, mysql-1) |
| ボリューム | 共有PVCまたはemptyDir | Podごとに独立したPVC(volumeClaimTemplates) |
| 起動・削除順序 | 並列(順序なし) | 順序あり(0→1→2の順に起動、逆順で削除) |
| ネットワークID | 毎回変わる | 固定(mysql-0.mysql-headless) |
| ユースケース | ステートレスアプリ(Webサーバー等) | DB・Redis・Zookeeper等のステートフルアプリ |
2. StatefulSetの基本設定
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: redis
spec:
serviceName: redis-headless
replicas: 3
selector:
matchLabels:
app: redis
template:
metadata:
labels:
app: redis
spec:
containers:
- name: redis
image: redis:7-alpine
ports:
- containerPort: 6379
volumeMounts:
- name: data
mountPath: /data
volumeClaimTemplates:
- metadata:
name: data
spec:
accessModes: ["ReadWriteOnce"]
storageClassName: ebs-gp3
resources:
requests:
storage: 10Gi3. PodDisruptionBudgetで可用性を確保
# ノードのドレイン時にも最低1台のRedisを確保
apiVersion: policy/v1
kind: PodDisruptionBudget
metadata:
name: redis-pdb
spec:
minAvailable: 1
selector:
matchLabels:
app: redisPDBを設定することでKubernetesのノードドレイン(メンテナンス時)にも最低1台のPodが常に稼働している状態を保証できます。
📌 この記事のポイント
- StatefulSetはPodに固定名・固定PVC・順序付き起動・固定ネットワークIDを提供するDB等向けのWorkloadタイプ
- 本番のDB(MySQL/PostgreSQL)はRDS等のマネージドサービス推奨。StatefulSetはRedis・Kafka等で活用
- PodDisruptionBudgetでノードメンテナンス中も最低稼働Pod数を保証して可用性を確保する
キャリアの疑問、一緒に解決しませんか?
Infra Academyでは、インフラ系ITエンジニアを目指す方への個別サポートを行っています。2026年7月からフリーランス講師として本格始動予定です。
ABOUT ME




