データベース移行用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コンテナの動作

  1. ポッドが作成されると、Kubernetesはinitコンテナを順番に(1つずつ)実行
  2. 各initコンテナはコード0で終了してから次が開始
  3. initコンテナが失敗すると、ポッドのrestartPolicyに従って再起動
  4. すべてのinitコンテナが成功した後にのみメインコンテナが起動
  5. Initコンテナにはreadinessやlivenessプローブはありません

移行の安全性

複数レプリカで移行を実行する場合、一度に1つの移行のみ実行すべきです:

  • アドバイザリロック:移行ツールでデータベースレベルのアドバイザリロックを使用(例:Prisma、Flyway、Alembic)
  • リーダー選出:initコンテナの代わりにKubernetes Jobを使用
  • デプロイメント戦略maxSurge: 1maxUnavailable: 0を設定して、一度に1つのポッドのみがinit フェーズを通過するようにする

ユースケース

アプリケーションポッド起動前にデータベース移行、スキーマ更新、その他のセットアップタスクを自動実行する。デプロイされたコードバージョンとデータベーススキーマの同期を保証します。

試してみる — K8s Pod Spec Builder

フルツールを開く