すべてのプロダクト
Search
ドキュメントセンター

Alibaba Cloud Service Mesh:ASM と Argo Rollouts を統合したカナリアリリースの実装

最終更新日:Mar 11, 2026

Argo Rollouts は、プログレッシブデリバリーを実現するための Kubernetes コントローラーおよびカスタムリソース定義 (CRD) のセットです。Service Mesh (ASM) と Argo Rollouts を統合することで、設定可能な重み付けパーセンテージに基づいて、トラフィックを安定版から新しいバージョンに段階的に移行させるカナリアリリースが可能になります。

ネイティブの Kubernetes ローリングアップデートでは、トラフィック比率はレプリカ数に連動しており、カナリア版に 1% のトラフィックをルーティングするには 99 個の安定版レプリカが必要でした。ASM ベースのカナリアリリースでは、Istio の VirtualService ルールを使用することで、トラフィック分割を Pod 数から切り離します。これにより、オートスケーリングがトラフィック比率に影響を与えることなく、実行中のレプリカ数に関係なく詳細なパーセンテージ設定が機能します。

仕組み

ASM と Argo Rollouts を使用したカナリアリリースは、以下のライフサイクルに従います。

  1. カナリア戦略を定義する Rollout リソースをデプロイします。これには、トラフィックの重み付けステップ、一時停止期間、および Istio VirtualService へのリファレンスが含まれます。

  2. 2 つの Kubernetes サービス (安定版用とカナリア版用) と、それらの間でトラフィックをルーティングする Istio VirtualService を作成します。

  3. Rollout イメージを更新すると、Argo Rollouts コントローラーは定義されたステップに従って VirtualService の重みを自動的に調整します。

  4. 各ステップで、コントローラーは指定された期間一時停止するか、手動承認を待ってからカナリア版の重みを増やします。

  5. すべてのステップが完了すると、カナリア版が新しい安定版になります。

オプションで、Prometheus ベースの AnalysisTemplate をアタッチして、カナリア版の成功率をモニターできます。成功率がしきい値を下回った場合、コントローラーは自動的に安定版にロールバックします。

このガイドでは、ホストレベルのトラフィック分割を説明します。この方法では、2 つの個別のサービス (istio-rollout-stableistio-rollout-canary) がトラフィックのディストリビューションを処理します。Istio は、DestinationRule を使用したサブセットレベルのトラフィック分割もサポートしており、DNS の複雑さを回避できるため、East-West (クラスター内) トラフィックに適しています。詳細については、「Argo Rollouts Istio traffic management」をご参照ください。

前提条件

開始する前に、以下が準備できていることを確認してください。

Argo Rollouts のインストール

インストールの詳細については、「Argo Rollouts installation」をご参照ください。

  1. Argo Rollouts コントローラーをインストールします。

    kubectl create namespace argo-rollouts
    kubectl apply -n argo-rollouts -f https://github.com/argoproj/argo-rollouts/releases/latest/download/install.yaml
  2. CLI ベースの管理のために Argo Rollouts kubectl プラグインをインストールします。

    brew install argoproj/tap/kubectl-argo-rollouts

データプレーンの KubeAPI アクセスの有効化

KubeAPI アクセスを有効にして、データプレーンクラスターから kubectl を使用して Istio リソース (VirtualService、Gateway、DestinationRule) を直接管理します。

  1. ASM コンソールにログインします。左側のナビゲーションウィンドウで、[Service Mesh] > [メッシュ管理] を選択します。

  2. [メッシュ管理] ページで、ASM インスタンスの名前をクリックします。 左側のナビゲーションウィンドウで、[ASM インスタンス] > [基本情報] を選択します。

  3. [データプレーン KubeAPI アクセスの有効化] の右側にある [有効化] をクリックします。

    Enable Data-plane KubeAPI access

  4. 確認ダイアログボックスで、[OK] をクリックします。

カナリアリリースの実装

このセクションでは、安定版 (青) をデプロイし、その後トラフィックをカナリア版 (黄) に段階的に移行させる、完全なカナリアリリースの手順を説明します。

ステップ 1:Rollout とサービスの作成

Rollout の作成

  1. 次の内容で rollout.yaml ファイルを作成します。

    rollout.yaml の表示

    apiVersion: argoproj.io/v1alpha1
    kind: Rollout
    metadata:
      name: istio-rollout
    spec:
      revisionHistoryLimit: 2               # Number of old ReplicaSets to retain
      selector:
        matchLabels:
          app: istio-rollout
      template:
        metadata:
          annotations:
            sidecar.istio.io/inject: "true"  # Enable Istio sidecar injection
          labels:
            app: istio-rollout
        spec:
          containers:
          - name: istio-rollout
            image: argoproj/rollouts-demo:blue  # Initial stable version
            ports:
            - name: http
              containerPort: 8080
              protocol: TCP
            resources:
              requests:
                memory: 32Mi
                cpu: 5m
      strategy:
        canary:
          canaryService: istio-rollout-canary   # Service that targets canary pods
          stableService: istio-rollout-stable   # Service that targets stable pods
          trafficRouting:
            istio:
              virtualService:
                name: istio-rollout-vsvc        # VirtualService whose weights the controller updates
                routes:
                - primary                       # Route name inside the VirtualService
          steps:
          - setWeight: 10          # Route 10% of traffic to canary
          - pause: {}              # Wait for manual approval (kubectl argo rollouts promote)
          - setWeight: 20          # Route 20% of traffic to canary
          - pause: {duration: 20s} # Wait 20 seconds, then auto-advance
          - setWeight: 30
          - pause: {duration: 20s}
          - setWeight: 40
          - pause: {duration: 20s}
          - setWeight: 50
          - pause: {duration: 20s}
          - setWeight: 60
          - pause: {duration: 20s}
          - setWeight: 70
          - pause: {duration: 20s}
          - setWeight: 80
          - pause: {duration: 20s}
          - setWeight: 90
          - pause: {duration: 20s}

    strategy.canary の主要なフィールド:

    フィールド説明
    setWeightこのステップでカナリア版にルーティングされるトラフィックのパーセンテージ
    pause: {}kubectl argo rollouts promote
    pause: {duration: 20s}20 秒間一時停止し、その後自動的に次のステップに進みます
  2. ASM インスタンスに追加されたクラスターに Rollout をデプロイします。

    kubectl apply -f rollout.yaml

サービスの作成

  1. 次の内容で service.yaml ファイルを作成します。

    両方のサービスは同じセレクター (app: istio-rollout) を使用します。Argo Rollouts は、カナリアリリース中に各サービスがどの Pod をターゲットにするかを管理します。
    apiVersion: v1
    kind: Service
    metadata:
      name: istio-rollout-canary    # Canary Service -- Argo Rollouts maps this to canary pods
    spec:
      ports:
      - port: 80
        targetPort: http
        protocol: TCP
        name: http
      selector:
        app: istio-rollout
    
    ---
    apiVersion: v1
    kind: Service
    metadata:
      name: istio-rollout-stable    # Stable Service -- Argo Rollouts maps this to stable pods
    spec:
      ports:
      - port: 80
        targetPort: http
        protocol: TCP
        name: http
      selector:
        app: istio-rollout
  2. サービスをデプロイします。

    kubectl apply -f service.yaml

ステップ 2:Istio リソースの作成

データプレーンの KubeAPI アクセスが有効になっている場合、データプレーンクラスターから kubectl を使用して Istio リソースを直接作成できます。または、ASM コンソールまたはコントロールプレーンの kubeconfig を使用することもできます。

VirtualService の作成

  1. 次の内容で istio-rollout-vsvc.yaml ファイルを作成します。

    apiVersion: networking.istio.io/v1alpha3
    kind: VirtualService
    metadata:
      name: istio-rollout-vsvc
    spec:
      gateways:
        - istio-rollout-gateway
      hosts:
        - '*'
      http:
        - match:
            - uri:
                prefix: /
          name: primary                   # Must match the route name in the Rollout
          route:
            - destination:
                host: istio-rollout-stable # All traffic goes to stable initially
              weight: 100
            - destination:
                host: istio-rollout-canary # Canary destination -- weight starts at 0
  2. VirtualService をデプロイします。

    kubectl apply -f istio-rollout-vsvc.yaml

Gateway の作成

  1. 次の内容で istio-rollout-gateway.yaml ファイルを作成します。

    apiVersion: networking.istio.io/v1beta1
    kind: Gateway
    metadata:
      name: istio-rollout-gateway
    spec:
      selector:
        istio: ingressgateway            # Binds to the ASM ingress gateway
      servers:
        - hosts:
            - '*'
          port:
            name: http
            number: 80                   # Accept HTTP traffic on port 80
            protocol: HTTP
  2. Gateway をデプロイします。

    kubectl apply -f istio-rollout-gateway.yaml

ステップ 3:イングレスゲートウェイのデプロイ

サービスアクセス用にポート 80 が有効になっている ASM イングレスゲートウェイを作成します。

  1. ASM コンソールにログインします。左側のナビゲーションウィンドウで、[Service Mesh][メッシュ管理] を選択します。

  2. [メッシュ管理] ページで、ASM インスタンスの名前をクリックします。左側のナビゲーションウィンドウで、[ASM ゲートウェイ] > [Ingress ゲートウェイ] を選択します。

  3. [Ingress ゲートウェイ]」ページで、[作成] をクリックし、以下のパラメーターを設定します。その他のパラメーターについては、「Ingress ゲートウェイの作成」をご参照ください。

    パラメーター
    名前ingressgateway
    ゲートウェイタイプNorth-South IngressGateway
    ポートマッピングプロトコル:HTTP、サービスポート:80
  4. [作成]」をクリックします。

ステップ 4:初期 Rollout ステータスの確認

次のコマンドを実行して、Rollout が正常であることを確認します。

kubectl argo rollouts get rollout istio-rollout --watch

期待される出力:

Name:            istio-rollout
Namespace:       default
Status:           Healthy
Strategy:        Canary
  Step:          18/18
  SetWeight:     100
  ActualWeight:  100
Images:          argoproj/rollouts-demo:blue (stable)
Replicas:
  Desired:       1
  Current:       1
  Updated:       1
  Ready:         1
  Available:     1

NAME                                       KIND        STATUS     AGE  INFO
⟳ istio-rollout                            Rollout      Healthy  52s
└──# revision:1
└──⧉ istio-rollout-7f96d86486           ReplicaSet   Healthy  52s  stable
   └──□ istio-rollout-7f96d86486-vpqvb  Pod         Running  52s  ready:2/2

ステータスが Healthy で、イメージが argoproj/rollouts-demo:blue (stable) であることは、初期デプロイメントが成功したことを示します。

ステップ 5:初期デプロイメントのテスト

  1. イングレスゲートウェイの IP アドレスを取得します。

    1. ASM コンソールにログインします。 左側のナビゲーションウィンドウで、[Service Mesh] > [メッシュ管理] を選択します。

    2. ASM インスタンス名をクリックします。左側のナビゲーションウィンドウで、ASM ゲートウェイIngress ゲートウェイ を選択します。

    3. イングレスゲートウェイの [サービスアドレス] をコピーします。

  2. ブラウザで http://<ingress-gateway-ip>/ を開きます。ページは /color を同時に呼び出し、返された色でグリッドを塗りつぶします。安定版は blue イメージを使用しており、カナリア版は実行されていないため、すべてのグリッドが青色で表示されます。

    Initial blue grid display

ステップ 6:カナリアリリースの実行

この例では、黄色がカナリア版を表します。リリースが進行するにつれて、グリッドは徐々に青から黄色に変わります。

Rollout イメージの更新

  1. 新しいイメージバージョンを設定します。

    kubectl argo rollouts set image istio-rollout "*=argoproj/istio-rollout:yellow"
  2. 両方の Pod バージョンが実行中であることを確認します。

    1. ACK コンソールにログオンし、左側のナビゲーションウィンドウで[クラスター]をクリックします。

    2. クラスター名をクリックし、[ワークロード][ポッド] を選択します。

    3. [Name]」列で、青(安定版)および黄色(カナリア版)の両方のバージョンの Pod が存在することを確認します。

    Both pod versions running

最初のトラフィックシフトの観測

ブラウザで http://<ingress-gateway-ip>/ を開きます。グリッドの約 10% が黄色で表示されるようになります。Argo Rollouts コントローラーは VirtualService の重みを更新し、安定版 (青) は 100 から 90 に、カナリア版 (黄) は 0 から 10 に変更されました。

10% canary traffic

最初のステップでは持続時間なしの pause: {} が指定されているため、Rollout は次に進む前に手動承認を待ちます。

リリースの続行

  1. Rollout を承認して、手動一時停止を解除します。

    kubectl argo rollouts promote istio-rollout
  2. ブラウザで http://<ingress-gateway-ip>/ を開きます。VirtualService の重みは、残りのステップ (20%、30%、... 90%) を通じて自動的に調整され、各ステップ間で 20 秒間一時停止します。

    Progressive traffic shift

完了したリリースの確認

  1. すべてのステップが完了したら、ブラウザで http://<ingress-gateway-ip>/ を開きます。すべてのグリッドが黄色で表示され、カナリア版が安定版を完全に置き換えたことを確認します。

    All yellow -- canary release complete

  2. Rollout のステータスを確認します。期待される出力:イメージが argoproj/rollouts-demo:yellow (stable) と表示され、カナリア版が昇格したことを確認します。

    kubectl argo rollouts get rollout istio-rollout --watch
    Name:            istio-rollout
    Namespace:       default
    Status:           Healthy
    Strategy:        Canary
      Step:          18/18
      SetWeight:     100
      ActualWeight:  100
    Images:          argoproj/rollouts-demo:yellow (stable)
    Replicas:
      Desired:       1
      Current:       1
      Updated:       1
      Ready:         1
      Available:     1
    
    NAME                                       KIND        STATUS        AGE  INFO
    ⟳ istio-rollout                            Rollout      Healthy     48m
    ├──# revision:4
    │  └──⧉ istio-rollout-5fcf5864c4           ReplicaSet   Healthy     27m  stable
    │     └──□ istio-rollout-5fcf5864c4-vw6kh  Pod          Running     26m  ready:2/2
    ├──# revision:3
    │  └──⧉ istio-rollout-897cb5b6d            ReplicaSet  ScaledDown  27m
    └──# revision:1
       └──⧉ istio-rollout-7f96d86486           ReplicaSet  ScaledDown  48m

Prometheus による自動ロールバックの設定

手動での観測に頼る代わりに、Prometheus ベースの分析を設定して、成功率がしきい値を下回った場合にカナリアリリースを自動的にロールバックします。

カナリアリリース中にいつでも手動でロールバックするには、次のコマンドを実行します。
kubectl argo rollouts abort istio-rollout

ステップ 1:ASM で Prometheus を有効化

ASM インスタンスの Prometheus モニタリングを有効にします。詳細については、以下をご参照ください。

ステップ 2:AnalysisTemplate の作成

AnalysisTemplate は、カナリア版のリクエスト成功率を計算する Prometheus クエリを定義します。成功率が 0.90 以下に低下した場合 (つまり、リクエストの 10% 以上が 5xx エラーを返す場合)、Rollout は Degraded とマークされ、自動的にロールバックされます。

  1. 次の内容で istio-success-rate.yaml ファイルを作成します。<your-prometheus-endpoint> を、ASM に接続されている Prometheus インスタンスの実際のエンドポイントに置き換えてください。

    apiVersion: argoproj.io/v1alpha1
    kind: AnalysisTemplate
    metadata:
      name: istio-success-rate
    spec:
      args:
      - name: service                       # Service name, passed from the Rollout
      - name: namespace                     # Namespace, auto-resolved from the Rollout
      metrics:
      - name: success-rate
        initialDelay: 60s                   # Wait 60s for traffic to flow before first check
        interval: 20s                       # Re-evaluate every 20 seconds
        successCondition: result[0] > 0.90  # Pass if success rate > 90%; fail otherwise
        provider:
          prometheus:
            address: http://<your-prometheus-endpoint>:9090/api/v1/prometheus/
            query: >+
              sum(irate(istio_requests_total{
                reporter="source",
                destination_service=~"{{args.service}}.{{args.namespace}}.svc.cluster.local",
                response_code!~"5.*"}[40s])
              )
              /
              sum(irate(istio_requests_total{
                reporter="source",
                destination_service=~"{{args.service}}.{{args.namespace}}.svc.cluster.local"}[40s])
              )
  2. AnalysisTemplate をデプロイします。

    kubectl apply -f istio-success-rate.yaml

ステップ 3:AnalysisTemplate と Rollout の関連付け

Rollout を更新して、AnalysisTemplate を参照する analysis セクションを含めます。分析は 2 番目のステップ (startingStep: 1) から開始され、メトリックが評価される前にカナリア版がトラフィックを受信する時間を確保します。

  1. 次の内容で新しい rollout.yaml ファイルを作成します。

    rollout.yaml の表示

    apiVersion: argoproj.io/v1alpha1
    kind: Rollout
    metadata:
      name: istio-rollout
    spec:
      revisionHistoryLimit: 2
      selector:
        matchLabels:
          app: istio-rollout
      template:
        metadata:
          annotations:
            sidecar.istio.io/inject: "true"
          labels:
            app: istio-rollout
        spec:
          containers:
          - name: istio-rollout
            image: argoproj/rollouts-demo:yellow   # Current stable version
            ports:
            - name: http
              containerPort: 8080
              protocol: TCP
            resources:
              requests:
                memory: 32Mi
                cpu: 5m
      strategy:
        canary:
          canaryService: istio-rollout-canary
          stableService: istio-rollout-stable
          analysis:
            startingStep: 1                        # Start analysis from the second step
            templates:
            - templateName: istio-success-rate     # Reference the AnalysisTemplate
            args:
            - name: service
              value: canary
            - name: namespace
              valueFrom:
                fieldRef:
                  fieldPath: metadata.namespace    # Auto-resolve namespace
          trafficRouting:
            istio:
              virtualService:
                name: istio-rollout-vsvc
                routes:
                - primary
          steps:
          - setWeight: 10
          - pause: {}              # Wait for manual approval
          - setWeight: 20
          - pause: {duration: 20s}
          - setWeight: 30
          - pause: {duration: 20s}
          - setWeight: 40
          - pause: {duration: 20s}
          - setWeight: 50
          - pause: {duration: 20s}
          - setWeight: 60
          - pause: {duration: 20s}
          - setWeight: 70
          - pause: {duration: 20s}
          - setWeight: 80
          - pause: {duration: 20s}
          - setWeight: 90
          - pause: {duration: 20s}
  2. Rollout を更新します。

    kubectl apply -f rollout.yaml

ステップ 4:分析付きカナリアリリースのトリガー

  1. イメージを更新して、新しいカナリアリリースを開始します。ブラウザで http://<ingress-gateway-ip>/ を開きます。カナリアトラフィックが流れると、オレンジ色のグリッドが表示され始めます。

    kubectl argo rollouts set image istio-rollout "*=argoproj/rollouts-demo:orange"

    Orange canary traffic

  2. Rollout を承認して、Prometheus モニタリングによる自動カナリア進行を開始します。

    kubectl argo rollouts promote istio-rollout
  3. Rollout のステータスを監視します。

    kubectl argo rollouts get rollout istio-rollout --watch

    Rollout status with analysis

ステップ 5:自動ロールバックのテスト

ロールバックの動作をテストするには、デモアプリケーションページのエラー率スライダーを使用して、カナリア版のエラー率を上げます。エラー率が 10% を超える (成功率が 0.90 を下回る) と、AnalysisTemplate は Rollout を Degraded とマークし、コントローラーは自動的に安定版 (黄) にロールバックします。

Canary release in progress with errors

短い遅延の後、すべてのトラフィックが安定版に戻ります。

Automatic rollback to stable version

次のステップ