Chuyển đến nội dung chính

レッスン 25: 導入戦略 — ブルー/グリーン、カナリア、ローリング

導入戦略を比較します: ローリング アップデート、ブルー/グリーン、カナリア、A/B テスト。 Kubernetes の導入戦略。段階的な配信のための Argo ロールアウト。 LaunchDarkly/Unleash の機能フラグ。ロールバック戦略。

🏗️ 建築 — レッスン 25 レッスン 25: 導入戦略 — ブルー/グリーン、カナリア&ローリング

マイクロサービスとマイクロ フロントエンドのシステム設計 — 基本から運用まで

パート 8: CI/CD および導入戦略

xdev.asia

はじめに

マイクロサービスを本番環境にデプロイするのは最もリスクが高い時期です。バグが発生した場合の爆発範囲は展開戦略によって決まります。影響を受けるのはユーザーの 100% ですか、それとも 5% だけですか?この記事では、戦略を比較し、適切な戦略を選択するためのガイダンスを提供します。

Deployment Strategies — Blue-Green, Canary, Rolling


1. ローリングアップデート

Kubernetes mặc định:

Pod v1 ●●●●●  (5 replicas)

Deploy v2:
Step 1: ●●●●● + ○     (1 new pod v2 starting)
Step 2: ●●●● + ○○      (2 v2 ready, 1 v1 terminated)
Step 3: ●●● + ○○○      (3 v2 ready)
Step 4: ●● + ○○○○
Step 5: ○○○○○           (all v2)

● = v1, ○ = v2

利点: ダウンタイムゼロ、段階的、K8s ネイティブ 欠点: ロールアウト中にバージョンが混在し、ロールバックが遅い ユースケース: 低リスクの変更、ステートレスなサービス


2. ブルー/グリーン展開

Blue (current, live):  ●●●●●  ← traffic
Green (new, staging):  ○○○○○  ← no traffic

Test Green thoroughly, then switch:

Blue:  ●●●●●  ← no traffic (standby)
Green: ○○○○○  ← ALL traffic switched instantly

利点: 即時ロールバック (青色に戻る)、本番前の完全なテスト 欠点: 2 倍のリソースが必要、データベースの移行には下位互換性が必要 使用例: 即時ロールバックが必要な場合の重要なサービス


3. カナリア展開 ⭐

Step 1: ●●●●● (100% v1)
Step 2: ●●●●○ (90% v1, 10% v2) ← canary
Step 3: Monitor metrics (error rate, latency, CPU)
Step 4a: Metrics OK → ●●●○○ → ●●○○○ → ○○○○○ (promote)
Step 4b: Metrics BAD → ●●●●● (rollback, remove canary)

利点: 最小の爆発範囲、データ主導型プロモーション 欠点: セットアップが複雑で、適切なモニタリングが必要 使用例: ほとんどの実稼働環境 - 推奨されるデフォルト


4. Argo のロールアウト (プログレッシブ配信)

# rollout.yaml
apiVersion: argoproj.io/v1alpha1
kind: Rollout
metadata:
  name: product-service
spec:
  replicas: 5
  strategy:
    canary:
      canaryService: product-service-canary
      stableService: product-service-stable
      steps:
        - setWeight: 5
        - pause: { duration: 5m }
        - setWeight: 20
        - pause: { duration: 10m }
        - setWeight: 50
        - pause: { duration: 15m }
        - setWeight: 100
      analysis:
        templates:
          - templateName: success-rate
        startingStep: 2
        args:
          - name: service-name
            value: product-service

---
apiVersion: argoproj.io/v1alpha1
kind: AnalysisTemplate
metadata:
  name: success-rate
spec:
  metrics:
    - name: success-rate
      interval: 1m
      successCondition: result[0] >= 0.99
      provider:
        prometheus:
          address: http://prometheus:9090
          query: |
            sum(rate(http_requests_total{service="{{args.service-name}}",code=~"2.."}[5m]))
            /
            sum(rate(http_requests_total{service="{{args.service-name}}"}[5m]))

5. 機能フラグ

ユーザーに対して 有効化せずにコードを実稼働環境にデプロイします。

// Feature flag check
const unleash = require('unleash-client');

app.get('/api/products', (req, res) => {
  const products = getProducts();
  
  if (unleash.isEnabled('new-recommendation-engine', {
    userId: req.user.id
  })) {
    // New feature, enabled for specific users
    products.forEach(p => {
      p.recommendations = newEngine.getRecommendations(p.id);
    });
  }
  
  res.json(products);
});

機能フラグ + カナリア

1. Deploy v2 with feature flag OFF → 100% users get old behavior
2. Enable flag for 5% users → monitor
3. Gradually increase → 20% → 50% → 100%
4. Remove flag from code after full rollout

6. 意思決定マトリックス

戦略リスクスピードコストロールバック最適な用途
ローリング中遅い低い遅い低リスクの変更
ブルー/グリーン低い速い高 (2x)インスタント重要なサービス
カナリア非常に低い中低い速いデフォルトの選択肢
機能フラグ非常に低いインスタント低いインスタントUX の変更

推奨

E-Commerce Platform:
├── Backend services: Canary (Argo Rollouts) + Auto analysis
├── Micro Frontends: Canary via CDN traffic splitting 
├── Database changes: Blue/Green (backward compatible)
└── UI features: Feature flags (Unleash)

7. ロールバック戦略

コンポーネントロールバック方法
K8s の展開kubectl rollout undo
アルゴのロールアウト失敗した分析時の自動ロールバック
CDN の MFE前のバージョンを指す
データベース順方向移行 (スキーマをロールバックしない)
機能フラグフラグを即座に無効にする

概要

  • ローリング アップデート: K8 のデフォルト、シンプル、低リスクに適しています
  • 青/緑: 即時ロールバック、コスト 2 倍
  • カナリア: 最小爆発半径 — 推奨デフォルト
  • Argo Rollouts: 分析による自動化されたプログレッシブ配信
  • 機能フラグ: デプロイ ≠ リリース、インスタント有効化/無効化

次の記事: レッスン 26: フルスタックの可観測性 — ログ、メトリクス、トレース