データベース移行用Initコンテナ
メインアプリケーション起動前にデータベース移行を実行するKubernetes Initコンテナを使用し、新しいポッド作成時にスキーマが常に最新であることを保証します。
Patterns
詳細な説明
移行のためのInitコンテナ
Initコンテナはメインアプリケーションコンテナの前に実行され、ポッド起動前に正常に完了する必要があります。データベース移行、スキーマ更新、その他の一回限りのセットアップタスクの実行に最適です。
主要な設定
apiVersion: apps/v1
kind: Deployment
metadata:
name: web-with-migration
labels:
app: "web"
spec:
replicas: 3
template:
spec:
initContainers:
- name: migrate
image: my-app:latest
command: ["npm", "run", "migrate"]
env:
- name: DATABASE_URL
value: "postgres://admin:changeme@postgres:5432/mydb"
containers:
- name: web
image: my-app:latest
ports:
- name: http
containerPort: 3000
Initコンテナの動作
- ポッドが作成されると、Kubernetesはinitコンテナを順番に(1つずつ)実行
- 各initコンテナはコード0で終了してから次が開始
- initコンテナが失敗すると、ポッドの
restartPolicyに従って再起動 - すべてのinitコンテナが成功した後にのみメインコンテナが起動
- Initコンテナにはreadinessやlivenessプローブはありません
移行の安全性
複数レプリカで移行を実行する場合、一度に1つの移行のみ実行すべきです:
- アドバイザリロック:移行ツールでデータベースレベルのアドバイザリロックを使用(例:Prisma、Flyway、Alembic)
- リーダー選出:initコンテナの代わりにKubernetes Jobを使用
- デプロイメント戦略:
maxSurge: 1とmaxUnavailable: 0を設定して、一度に1つのポッドのみがinit フェーズを通過するようにする
ユースケース
アプリケーションポッド起動前にデータベース移行、スキーマ更新、その他のセットアップタスクを自動実行する。デプロイされたコードバージョンとデータベーススキーマの同期を保証します。