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

:ASM と Argo Rollouts を統合してカナリアリリースを実装する

最終更新日:Jan 14, 2025

Argo Rollouts は Kubernetes コントローラーであり、一連の CustomResourceDefinition(CRD)を含んでいます。 サービスメッシュ(ASM)と Argo Rollouts を統合して、カナリアリリースの機能を強化できます。 Kubernetes 環境でアプリケーションを更新し、新しいアプリケーションの更新に伴うリスクを軽減する場合、ASM と Argo Rollouts を統合してカナリアリリースを実装できます。 この方法では、アプリケーションの新しいバージョンをユーザーにバッチで段階的にプッシュし、これらのバージョンのパフォーマンスをリアルタイムで監視できます。 これにより、リスクを効果的に制御し、サービスの安定性とユーザーエクスペリエンスを保証し、ビジネスの継続性を確保しながらバージョンを正常に反復できます。

前提条件

準備

Argo Rollout のインストール

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. 次のコマンドを実行して、Argo Rollout kubectl プラグインをインストールします。

    Argo Rollouts kubectl プラグインは、kubectl ベースの管理を提供できます。

    brew install argoproj/tap/kubectl-argo-rollouts

Kubernetes API を使用して、データプレーン上の ASM インスタンスの Istio リソースへのアクセスを有効にする

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

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

  3. 有効化[データプレーン Kubeapi アクセスを有効にする] の右側にある 启用数据面KubeAPI访问 をクリックします。

  4. 表示されるメッセージで、[OK] をクリックします。

カナリアリリースを実装する

次の例では、安定バージョンとカナリアリリースバージョンを作成する方法、およびトラフィック比率に基づいてカナリアリリースを実装するために、安定バージョンからカナリアリリースバージョンにトラフィックを徐々に切り替える方法を示します。 カナリアリリースの詳細については、カナリアリリースを構成するをご参照ください。

ステップ 1:Rollout アプリケーションとサービスアプリケーションを作成する

  1. Rollout を作成します。

    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:blue
              ports:
              - name: http
                containerPort: 8080
                protocol: TCP
              resources:
                requests:
                  memory: 32Mi
                  cpu: 5m
        strategy:
          canary:
            canaryService: istio-rollout-canary
            stableService: istio-rollout-stable
            trafficRouting:
              istio:
                virtualService:
                  name: istio-rollout-vsvc
                  routes:
                  - primary
            steps:
            - setWeight: 10  // カナリアリリースバージョンにルーティングされるトラフィックの重みを設定します。
            - pause: {}         // Rollout を一時停止します。手動で Rollout を更新します。
            - setWeight: 20
            - pause: {duration: 20s} // Rollout を一時停止します。指定された時間が経過したら、Rollout を自動的に更新します。
            - 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 フィールドは、カナリアリリースポリシーを定義します。 strategy フィールドの setWeight パラメーターと pause パラメーターについては、以下で説明します。

      • setWeight: カナリアリリースバージョンにルーティングされるトラフィックの重み。

      • pause: Rollout を一時停止します。 一時停止ステップに duration が指定されていない場合、Rollout を手動で更新する必要があります。 一時停止ステップに duration が指定されている場合、指定された duration が経過すると、システムによって Rollout が自動的に更新されます。

    2. 次のコマンドを実行して、ASM インスタンスに追加されたクラスターに Rollout をデプロイします。

      kubectl apply -f rollout.yaml
  2. サービスを作成します。

    1. 次のコンテンツを含む service.yaml ファイルを作成します。

      apiVersion: v1
      kind: Service
      metadata:
        name: istio-rollout-canary
      spec:
        ports:
        - port: 80
          targetPort: http
          protocol: TCP
          name: http
        selector:
          app: istio-rollout
      
      ---
      apiVersion: v1
      kind: Service
      metadata:
        name: istio-rollout-stable
      spec:
        ports:
        - port: 80
          targetPort: http
          protocol: TCP
          name: http
        selector:
          app: istio-rollout
    2. 次のコマンドを実行して、ASM インスタンスに追加されたクラスターにサービスをデプロイします。

      kubectl apply -f service.yaml

ステップ 2:関連する Istio リソースを作成する

  1. istio-rollout-vsvc という名前の仮想サービスを作成します。

    データプレーン上の ASM インスタンスの Istio リソースへのアクセスを Kubernetes API を使用して有効にしています。 したがって、データプレーン上の kubeconfig ファイルを使用して、仮想サービス、Istio ゲートウェイ、宛先ルールなどの Istio リソースにアクセスできます。 または、ASM コンソール または kubeconfig ファイルを使用して、Istio リソースを作成することもできます。

    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
            route:
              - destination:
                  host: istio-rollout-stable
                weight: 100
              - destination:
                  host: istio-rollout-canary
    2. 次のコマンドを実行して、istio-rollout-vsvc をデプロイします。

      kubectl apply -f istio-rollout-vsvc.yaml
  2. istio-rollout-gateway という名前の Istio ゲートウェイを作成します。

    1. 次のコンテンツを含む istio-rollout-gateway.yaml ファイルを作成します。

      apiVersion: networking.istio.io/v1beta1
      kind: Gateway
      metadata:
        name: istio-rollout-gateway
      spec:
        selector:
          istio: ingressgateway
        servers:
          - hosts:
              - '*'
            port:
              name: http
              number: 80
              protocol: HTTP
                                      
    2. 次のコマンドを実行して、istio-rollout-gateway をデプロイします。

      kubectl apply -f istio-rollout-gateway.yaml

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

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

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

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

  3. [イングレスゲートウェイ] ページで、[作成] をクリックします。 イングレスゲートウェイのパラメーターを設定し、[作成] をクリックします。

    次の表では、イングレスゲートウェイの一部の paramètres のみを説明しています。 イングレスゲートウェイの他のパラメーターの詳細については、イングレスゲートウェイを作成するをご参照ください。

    パラメーター

    説明

    名前

    イングレスゲートウェイの名前。 この例では、パラメーターを ingressgateway に設定します。

    ゲートウェイタイプ

    イングレスゲートウェイのタイプ。 この例では、パラメーターを [南北イングレスゲートウェイ] に設定します。

    ポートマッピング

    イングレスゲートウェイのポートマッピング。 [ポートを追加] をクリックします。 表示される行で、[プロトコル] パラメーターを [HTTP] に設定し、[サービスポート] パラメーターを [80] に設定します。

ステップ 4:Rollout のステータスを表示する

次のコマンドを実行して、Rollout のステータスを表示します。

kubectl argo rollouts get rollout istio-rollout

予想される出力:

kubectl argo rollouts get rollout istio-rollout
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

ステップ 5:Rollout の初期ステータスをテストする

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

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

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

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

  2. ブラウザーを使用して、http://{イングレスゲートウェイの IP アドレス}/ にアクセスします。

    次の図は、アクセス結果を示しています。 このページでは、http://{イングレスゲートウェイの IP アドレス}/color への同時呼び出しが呼び出され、取得した色でグリッドが塗りつぶされます。 Rollout istio-rollout で指定されている色は blue で、カナリアリリースは開始されていません。 したがって、青色が表示されます。蓝色效果

ステップ 6:Rollout を更新する

この例では、黄色を使用してカナリアリリースバージョンを示します。 http://{イングレスゲートウェイの IP アドレス}/ ページのグリッドの色が青から黄色に変わると、カナリアリリースが実装されます。

  1. Rollout のコンテナーのイメージバージョンを更新します。

    1. 次のコマンドを実行して、イメージバージョンを更新します。

      kubectl argo rollouts set image istio-rollout "*=argoproj/istio-rollout:yellow"
    2. 対応するコンテナーのイメージバージョンを表示します。

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

      2. [クラスター] ページで、管理するクラスターを見つけ、その名前をクリックします。 左側のペインで、[ワークロード] > [pod] を選択します。

      3. [名前] 列で、対応するコンテナーのイメージバージョンを表示します。

        黄色バージョン(カナリアリリースバージョン)が実行されている Pod が作成されますが、青バージョン(安定バージョン)が実行されている Pod も存在します(次の図を参照)。

        镜像版本

  2. ブラウザーを使用して、http://{イングレスゲートウェイの IP アドレス}/ にアクセスします。

    結果として、青いグリッドの 10% が黄色に変更されます(次の図を参照)。 黄色与蓝色效果これは、構成された仮想サービストラフィックの重みが変化するためです。 具体的には、安定バージョン(青バージョン)のトラフィックの重みが 100 から 90 に変化するのに対し、カナリアリリースバージョン(黄色バージョン)のトラフィックの重みが 0 から 10 に変化します。 Rollout は、仮想サービストラフィックの重みを制御します。 最初の手順でカナリアリリースバージョンに指定したトラフィックの重みは、Rollout の作成時に 10 に設定されます。 したがって、Rollout が開始されると、Argo Rollouts コントローラーは、Rollout で構成された仮想サービストラフィックの重みをそれに応じて変更します。 また、pause パラメーターは空のままです。 これは、Rollout を手動で確認して次のステージに進む必要があることを意味します。

  3. カナリアリリースを続行します。

    1. 次のコマンドを実行して、カナリアリリースを続行します。

      kubectl argo rollouts promote istio-rollout
    2. ブラウザーを使用して、http://{イングレスゲートウェイの IP アドレス}/ にアクセスします。

      次の図は、結果を示しています。 仮想サービストラフィックの重みは、Rollout の構成に基づいて引き続き調整されます。 このステージでは、pause の時間が指定されています。 詳細については、ステップ 1 をご参照ください。 したがって、指定された一時停止時間が経過すると、システムによって仮想サービストラフィックの重みが自動的に調整されます。继续发布

  4. カナリアリリースが成功したかどうかを確認します。

    1. しばらく待ってから、ブラウザーを使用して http://{イングレスゲートウェイの IP アドレス}/ にアクセスします。

      すべての青いグリッドが黄色に変更されます(次の図を参照)。黄色效果

    2. 次のコマンドを実行して、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: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

      出力は、Rollout のコンテナーのイメージバージョンが yellow に更新されたことを示しています。

Prometheus を使用して自動ロールバックを実装する

カナリアリリース中に、kubectl argo rollouts abort istio-rollout コマンドを実行して、安定バージョンにロールバックできます。 また、Prometheus システムを使用して、カナリアリリースに含まれるアプリケーションの正常性状態を監視することもできます。 メトリック異常が発生した場合、カナリアリリースバージョンは安定バージョンに自動的にロールバックされ、Degraded としてマークされます。

  1. ASM で Prometheus を有効にします。 詳細については、Managed Service for Prometheus を統合して ASM インスタンスを監視する または セルフマネージド Prometheus インスタンスを使用して ASM インスタンスを監視する をご参照ください。

  2. Argo AnalysisTemplate を構成します。

    1. 次のコンテンツを含む istio-success-rate.yaml ファイルを作成します。

      AnalysisTemplate の address パラメーターを、ASM に接続されている Prometheus インスタンスのエンドポイントに設定します。

      apiVersion: argoproj.io/v1alpha1
      kind: AnalysisTemplate
      metadata:
        name: istio-success-rate
      spec:
        args:
        - name: service
        - name: namespace
        metrics:
        - name: success-rate
          initialDelay: 60s  // 初期遅延時間。メトリックの最初の評価までの待機時間。
          interval: 20s     // 評価間隔。
          successCondition: result[0] > 0.90 // 成功条件。メトリッククエリからの結果に基づいてステップが成功したかどうかを判断するために使用される式。
          provider:
            prometheus:
              address: http://xxx.aliyuncs.com:9090/api/v1/prometheus/ // Prometheus インスタンスのエンドポイント。
              query: >+        // Prometheus クエリ。
                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. 次のコマンドを実行して、Argo AnalysisTemplate をデプロイします。

      kubectl apply -f istio-success-rate.yaml
  3. 分析を Rollout に関連付けます。

    1. 次のコンテンツを含む rollout.yaml ファイルを作成します。

      strategy の下に analysis パラメーターを設定して、2 番目のステップから監視と自動ロールバックに分析を使用できるようにします。 Rollout のコンテナーの初期イメージバージョンは yellow です。

      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
              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  // 分析を開始するステップ。
              templates:
              - templateName: istio-success-rate // 使用する AnalysisTemplate の名前。
              args:
              - name: service
                value: canary
              - name: namespace
                valueFrom:
                  fieldRef:
                    fieldPath: metadata.namespace
            trafficRouting:
              istio:
                virtualService:
                  name: istio-rollout-vsvc
                  routes:
                  - primary
            steps:
            - setWeight: 10
            - pause: {}         // Rollout を一時停止します。手動で Rollout を更新します。
            - 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. 次のコマンドを実行して、イメージバージョンを更新します。

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

    ブラウザーを使用して、http://{イングレスゲートウェイの IP アドレス}/ にアクセスします。 次の図は、結果を示しています。橙色效果

  5. Rollout の更新を手動で確認します。

    1. 次のコマンドを実行して、カナリアリリースを続行します。

      コマンドを実行すると、自動カナリアリリースが開始されます。 また、2 番目のステップから Prometheus 監視が有効になります。 この場合、カナリアリリースバージョンのエラー率が 90% を超えると、ロールバックがトリガーされます。

      kubectl argo rollouts promote istio-rollout
    2. 次のコマンドを実行して、Rollout のステータスを表示します。

      kubectl argo rollouts get rollout istio-rollout --watch

      予想される出力:监控服务状态

  6. エラー率を構成します。

    後続の段階的リリースでは、カナリアリリースバージョンのエラー率を手動で調整できます。 エラープログレスバーが 100% に達すると、すべてのオレンジ色のグリッド(カナリアリリースバージョン)が赤色の枠で囲まれてエラーを示します。 しばらくすると、すべてのカナリアリリースバージョンが安定バージョン(黄色のグリッド)に自動的にロールバックされます。

    図 1. 次の図は、カナリアリリースが実装されていることを示しています。金丝雀中

    図 2. 次の図は、すべてのカナリアリリースバージョンが安定バージョンに自動的にロールバックされたことを示しています。自动回滚到稳定版