•7 min read

Kubernetesにおける高度なCI/CD: Blue-GreenデプロイメントとCanaryリリース

Kubernetesにおける高度なCI/CD: Blue-GreenデプロイメントとCanaryリリース

Kubernetesのデフォルトのデプロイ戦略であるRollingUpdateは、小規模なサービスには十分ですが、ミッションクリティカルな本番システムには危険です。

  1. 無制限の爆発半径(Unbounded Blast Radius): 新しいコンテナイメージに微妙なランタイムパニックやメモリリークが含まれている場合、RollingUpdateは健全なPodを徐々に100%置き換え、すべてのインスタンスが劣化してしまいます。
  2. メトリクス駆動のロールバックなし(No Metric-Driven Rollbacks): Kubernetesはコンテナの稼働状況/生存状況を示すHTTPプローブしかチェックしません。APIが空のJSONペイロードでHTTP 200を返したり、リクエストの3%で内部500エラーをスローしたりしても、KubernetesはPodを「健全」とみなし、ロールアウトを続行します。
  3. プレビュー検証なし(No Preview Validation): ライブユーザーのトラフィックをルーティングする前に、本番環境で新しいバージョンに対して健全性テストやスモークテストを実行することはできません。

これを解決するために、先進的なエンジニアリングチームはブルー/グリーンデプロイメントまたは自動メトリクス分析によるカナリアリリースを使用しています。


Audio Briefing
0:00 / 0:00

1. RollingUpdate vs Blue-Green vs Canary

ディメンションRollingUpdate (デフォルト)ブルー/グリーンデプロイメントカナリアリリース
トラフィックシフトPodの段階的な置き換え0%から100%への即時切り替え段階的 (例: 5% \to 20% \to 100%)
爆発半径時間をかけてユーザーの100%即座にユーザーの100%小規模なサンプルに限定 (例: 5%)
リソースオーバーヘッド最大25%のサージ容量+100% (2倍のフルクラスター/レプリカ)+10%~20%のカナリアPod
ロールバック速度遅い (RollingUpdateの逆)即時 (ルーターをBlueに瞬時に戻す)即時 (カナリアトラフィックを0%にドロップ)
メトリクスゲート基本的なLiveness/Readinessプローブ手動またはスクリプトによるスモークテスト自動化されたPrometheus/Datadogクエリ

Advertisement

2. ブルー/グリーンデプロイメント: 即時切り替えパターン

ブルー/グリーンでは、2つの同一の環境が同時に存在します。

  • Blue (アクティブ): 本番トラフィックの100%を処理します。
  • Green (プレビュー): 新しいバージョンをデプロイします。社内開発者はpreview.example.comに対してスモークテストを実行します。
                       User Ingress / Load Balancer
                                     │
                      [ Active Service Selector ]
                                     │
                     ┌───────────────┴───────────────┐
                     ▼ (100% traffic)                ▼ (0% traffic)
              [ Blue Pods v1.2 ]              [ Green Pods v1.3 ]

テストが成功すると、サービスセレクターはversion: v1.2からversion: v1.3に切り替わります。切り替え後に壊滅的な障害が発生した場合は、サービスセレクターをBlueに瞬時に戻します。

ブルー/グリーンの黄金律: データベースの拡張/縮小

切り替え期間中、BlueとGreenが同時に稼働するため、データベースは両方のバージョンを同時にサポートする必要があります。

Step 1 (Expand): Add nullable column or new table. Deploy DB migration.
Step 2 (Deploy): Green version uses new column, Blue version ignores it.
Step 3 (Cutover): Route traffic to Green.
Step 4 (Contract): Drop old deprecated columns after Blue is destroyed.

3. Argo Rolloutsによるカナリアリリース: 段階的なトラフィックシフト

Argo Rolloutsは、標準のKubernetes DeploymentオブジェクトをRolloutカスタムリソースに置き換え、自動化されたカナリアステップとPrometheusメトリクス分析を提供します。

Incoming Traffic ───► Ingress / Service Mesh (Istio / NGINX / ALB)
                            │
            ┌───────────────┴───────────────┐
            ▼ (95% Live Traffic)            ▼ (5% Canary Traffic)
     [ Stable Service ]              [ Canary Service ]
            │                               │
     [ Stable Pods v1 ]              [ Canary Pods v2 ]
                                            │
                                            ▼
                                [ Prometheus Query Engine ]
                           (Error rate < 0.5%, p99 latency < 200ms)
                                     │              │
                              [ PASS: +20% ]   [ FAIL: Abort & Rollback ]

完全な本番環境のRolloutマニフェスト

apiVersion: argoproj.io/v1alpha1
kind: Rollout
metadata:
  name: payments-api
  namespace: production
spec:
  replicas: 10
  revisionHistoryLimit: 5
  selector:
    matchLabels:
      app: payments-api
  template:
    metadata:
      labels:
        app: payments-api
    spec:
      containers:
        - name: payments-api
          image: ghcr.io/my-org/payments-api:v2.4.0
          ports:
            - containerPort: 8080
          resources:
            requests:
              cpu: 500m
              memory: 512Mi
  strategy:
    canary:
      canaryService: payments-api-canary
      stableService: payments-api-stable
      trafficRouting:
        nginx:
          stableIngress: payments-api-ingress
      steps:
        # Step 1: Route 5% traffic to canary and pause 10 minutes
        - setWeight: 5
        - pause: { duration: 10m }
        # Step 2: Run automated Prometheus analysis
        - analysis:
            templates:
              - templateName: http-error-rate-check
        # Step 3: Increase traffic to 20%
        - setWeight: 20
        - pause: { duration: 30m }
        # Step 4: Increase traffic to 50%
        - setWeight: 50
        - pause: { duration: 15m }

4. Prometheusによる自動メトリクス分析

デプロイ中にオンコールエンジニアがGrafanaダッシュボードを監視する代わりに、サービスレベル目標(SLO)を自動的に評価するようにAnalysisTemplateを設定します。

apiVersion: argoproj.io/v1alpha1
kind: AnalysisTemplate
metadata:
  name: http-error-rate-check
  namespace: production
spec:
  metrics:
    - name: success-rate
      interval: 1m
      successCondition: result[0] >= 0.995 # Must maintain 99.5% success rate
      failureLimit: 3                      # Abort after 3 consecutive failed probes
      provider:
        prometheus:
          address: http://prometheus-k8s.monitoring:9090
          query: |
            sum(rate(http_requests_total{app="payments-api", status=~"2..|3.."}[2m]))
            /
            sum(rate(http_requests_total{app="payments-api"}[2m]))

    - name: p99-latency
      interval: 1m
      successCondition: result[0] <= 0.250 # Latency must stay under 250ms
      failureLimit: 2
      provider:
        prometheus:
          address: http://prometheus-k8s.monitoring:9090
          query: |
            histogram_quantile(0.99, sum(rate(http_request_duration_seconds_bucket{app="payments-api"}[2m])) by (le))

カナリアが失敗した場合どうなるか?

新しいイメージが5%のカナリアスライスで500エラーをスローした場合:

  1. Prometheusクエリはsuccess-rate < 0.995を返します。
  2. Argo Rolloutsは3回連続のメトリクス障害を検出します。
  3. 即時自動ロールバック: カナリアサービス上のトラフィックウェイトは直ちに0%にリセットされます。
  4. カナリアPodは終了されます。
  5. ロールアウトステータスはDegradedに移行し、エンジニアリングチャネルにSlackアラートが発報されます。
  6. ユーザーの95%は欠陥を経験しませんでした。

Advertisement

5. 実装チェックリストの要約

  1. 拡張/縮小データベース移行を採用し、スキーマクラッシュなしで古いコードバージョンと新しいコードバージョンの両方が同時に実行されるようにします。
  2. カナリア分析ルールを作成する前に、SLOを定量的に定義します(p99レイテンシ < X ms、5xxエラー率 < Y%)。
  3. 保守的なカナリアウェイトから開始します: 5%を10分間 \to 20%を30分間 \to 100%。
  4. 既存のサービスメッシュ(Istio/Linkerd)またはIngress(NGINX/Traefik)と連携して、動的なヘッダーベースおよびウェイトベースのルーティングのためにArgo RolloutsまたはFlaggerを使用します。

こちらもおすすめ

Share this article:

Stay Updated

Get the latest posts delivered straight to your inbox.

Free Developer Utilities

Free In-Browser Developer Tools

Clean AI CLI logs, build cron expressions, decode JWTs, and calculate chmod permissions offline.

Explore Tools
Advertisement