Argo Rollouts は、プログレッシブデリバリーを実現するための Kubernetes コントローラーおよびカスタムリソース定義 (CRD) のセットです。Service Mesh (ASM) と Argo Rollouts を統合することで、設定可能な重み付けパーセンテージに基づいて、トラフィックを安定版から新しいバージョンに段階的に移行させるカナリアリリースが可能になります。
ネイティブの Kubernetes ローリングアップデートでは、トラフィック比率はレプリカ数に連動しており、カナリア版に 1% のトラフィックをルーティングするには 99 個の安定版レプリカが必要でした。ASM ベースのカナリアリリースでは、Istio の VirtualService ルールを使用することで、トラフィック分割を Pod 数から切り離します。これにより、オートスケーリングがトラフィック比率に影響を与えることなく、実行中のレプリカ数に関係なく詳細なパーセンテージ設定が機能します。
仕組み
ASM と Argo Rollouts を使用したカナリアリリースは、以下のライフサイクルに従います。
カナリア戦略を定義する Rollout リソースをデプロイします。これには、トラフィックの重み付けステップ、一時停止期間、および Istio VirtualService へのリファレンスが含まれます。
2 つの Kubernetes サービス (安定版用とカナリア版用) と、それらの間でトラフィックをルーティングする Istio VirtualService を作成します。
Rollout イメージを更新すると、Argo Rollouts コントローラーは定義されたステップに従って VirtualService の重みを自動的に調整します。
各ステップで、コントローラーは指定された期間一時停止するか、手動承認を待ってからカナリア版の重みを増やします。
すべてのステップが完了すると、カナリア版が新しい安定版になります。
オプションで、Prometheus ベースの AnalysisTemplate をアタッチして、カナリア版の成功率をモニターできます。成功率がしきい値を下回った場合、コントローラーは自動的に安定版にロールバックします。
このガイドでは、ホストレベルのトラフィック分割を説明します。この方法では、2 つの個別のサービス (istio-rollout-stableとistio-rollout-canary) がトラフィックのディストリビューションを処理します。Istio は、DestinationRule を使用したサブセットレベルのトラフィック分割もサポートしており、DNS の複雑さを回避できるため、East-West (クラスター内) トラフィックに適しています。詳細については、「Argo Rollouts Istio traffic management」をご参照ください。
前提条件
開始する前に、以下が準備できていることを確認してください。
バージョン 1.12.4.50 以降の ASM インスタンス。詳細については、「ASM インスタンスの作成」をご参照ください。
ASM インスタンスに追加されたクラスター。詳細については、「ASM インスタンスにクラスターを追加する」をご参照ください。
ASM インスタンスに接続された kubectl。詳細については、「コントロールプレーンで kubectl を使用した Istio リソースへのアクセス」をご参照ください。
Argo Rollouts のインストール
インストールの詳細については、「Argo Rollouts installation」をご参照ください。
Argo Rollouts コントローラーをインストールします。
kubectl create namespace argo-rollouts kubectl apply -n argo-rollouts -f https://github.com/argoproj/argo-rollouts/releases/latest/download/install.yamlCLI ベースの管理のために Argo Rollouts kubectl プラグインをインストールします。
brew install argoproj/tap/kubectl-argo-rollouts
データプレーンの KubeAPI アクセスの有効化
KubeAPI アクセスを有効にして、データプレーンクラスターから kubectl を使用して Istio リソース (VirtualService、Gateway、DestinationRule) を直接管理します。
ASM コンソールにログインします。左側のナビゲーションウィンドウで、[Service Mesh] > [メッシュ管理] を選択します。
[メッシュ管理] ページで、ASM インスタンスの名前をクリックします。 左側のナビゲーションウィンドウで、[ASM インスタンス] > [基本情報] を選択します。
[データプレーン KubeAPI アクセスの有効化] の右側にある [有効化] をクリックします。

確認ダイアログボックスで、[OK] をクリックします。
カナリアリリースの実装
このセクションでは、安定版 (青) をデプロイし、その後トラフィックをカナリア版 (黄) に段階的に移行させる、完全なカナリアリリースの手順を説明します。
ステップ 1:Rollout とサービスの作成
Rollout の作成
次の内容で
rollout.yamlファイルを作成します。strategy.canaryの主要なフィールド:フィールド 説明 setWeightこのステップでカナリア版にルーティングされるトラフィックのパーセンテージ pause: {}kubectl argo rollouts promotepause: {duration: 20s}20 秒間一時停止し、その後自動的に次のステップに進みます ASM インスタンスに追加されたクラスターに Rollout をデプロイします。
kubectl apply -f rollout.yaml
サービスの作成
次の内容で
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サービスをデプロイします。
kubectl apply -f service.yaml
ステップ 2:Istio リソースの作成
データプレーンの KubeAPI アクセスが有効になっている場合、データプレーンクラスターから kubectl を使用して Istio リソースを直接作成できます。または、ASM コンソールまたはコントロールプレーンの kubeconfig を使用することもできます。
VirtualService の作成
次の内容で
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 0VirtualService をデプロイします。
kubectl apply -f istio-rollout-vsvc.yaml
Gateway の作成
次の内容で
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: HTTPGateway をデプロイします。
kubectl apply -f istio-rollout-gateway.yaml
ステップ 3:イングレスゲートウェイのデプロイ
サービスアクセス用にポート 80 が有効になっている ASM イングレスゲートウェイを作成します。
ASM コンソールにログインします。左側のナビゲーションウィンドウで、[Service Mesh] > [メッシュ管理] を選択します。
[メッシュ管理] ページで、ASM インスタンスの名前をクリックします。左側のナビゲーションウィンドウで、[ASM ゲートウェイ] > [Ingress ゲートウェイ] を選択します。
「[Ingress ゲートウェイ]」ページで、[作成] をクリックし、以下のパラメーターを設定します。その他のパラメーターについては、「Ingress ゲートウェイの作成」をご参照ください。
パラメーター 値 名前 ingressgatewayゲートウェイタイプ North-South IngressGateway ポートマッピング プロトコル:HTTP、サービスポート:80 「[作成]」をクリックします。
ステップ 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:初期デプロイメントのテスト
イングレスゲートウェイの IP アドレスを取得します。
ASM コンソールにログインします。 左側のナビゲーションウィンドウで、[Service Mesh] > [メッシュ管理] を選択します。
ASM インスタンス名をクリックします。左側のナビゲーションウィンドウで、ASM ゲートウェイ > Ingress ゲートウェイ を選択します。
イングレスゲートウェイの [サービスアドレス] をコピーします。
ブラウザで
http://<ingress-gateway-ip>/を開きます。ページは/colorを同時に呼び出し、返された色でグリッドを塗りつぶします。安定版はblueイメージを使用しており、カナリア版は実行されていないため、すべてのグリッドが青色で表示されます。
ステップ 6:カナリアリリースの実行
この例では、黄色がカナリア版を表します。リリースが進行するにつれて、グリッドは徐々に青から黄色に変わります。
Rollout イメージの更新
新しいイメージバージョンを設定します。
kubectl argo rollouts set image istio-rollout "*=argoproj/istio-rollout:yellow"両方の Pod バージョンが実行中であることを確認します。
ACK コンソールにログオンし、左側のナビゲーションウィンドウで[クラスター]をクリックします。
クラスター名をクリックし、[ワークロード] > [ポッド] を選択します。
「[Name]」列で、青(安定版)および黄色(カナリア版)の両方のバージョンの Pod が存在することを確認します。

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

最初のステップでは持続時間なしの pause: {} が指定されているため、Rollout は次に進む前に手動承認を待ちます。
リリースの続行
Rollout を承認して、手動一時停止を解除します。
kubectl argo rollouts promote istio-rolloutブラウザで
http://<ingress-gateway-ip>/を開きます。VirtualService の重みは、残りのステップ (20%、30%、... 90%) を通じて自動的に調整され、各ステップ間で 20 秒間一時停止します。
完了したリリースの確認
すべてのステップが完了したら、ブラウザで
http://<ingress-gateway-ip>/を開きます。すべてのグリッドが黄色で表示され、カナリア版が安定版を完全に置き換えたことを確認します。
Rollout のステータスを確認します。期待される出力:イメージが
argoproj/rollouts-demo:yellow (stable)と表示され、カナリア版が昇格したことを確認します。kubectl argo rollouts get rollout istio-rollout --watchName: 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 とマークされ、自動的にロールバックされます。
次の内容で
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]) )AnalysisTemplate をデプロイします。
kubectl apply -f istio-success-rate.yaml
ステップ 3:AnalysisTemplate と Rollout の関連付け
Rollout を更新して、AnalysisTemplate を参照する analysis セクションを含めます。分析は 2 番目のステップ (startingStep: 1) から開始され、メトリックが評価される前にカナリア版がトラフィックを受信する時間を確保します。
次の内容で新しい
rollout.yamlファイルを作成します。Rollout を更新します。
kubectl apply -f rollout.yaml
ステップ 4:分析付きカナリアリリースのトリガー
イメージを更新して、新しいカナリアリリースを開始します。ブラウザで
http://<ingress-gateway-ip>/を開きます。カナリアトラフィックが流れると、オレンジ色のグリッドが表示され始めます。kubectl argo rollouts set image istio-rollout "*=argoproj/rollouts-demo:orange"
Rollout を承認して、Prometheus モニタリングによる自動カナリア進行を開始します。
kubectl argo rollouts promote istio-rolloutRollout のステータスを監視します。
kubectl argo rollouts get rollout istio-rollout --watch
ステップ 5:自動ロールバックのテスト
ロールバックの動作をテストするには、デモアプリケーションページのエラー率スライダーを使用して、カナリア版のエラー率を上げます。エラー率が 10% を超える (成功率が 0.90 を下回る) と、AnalysisTemplate は Rollout を Degraded とマークし、コントローラーは自動的に安定版 (黄) にロールバックします。

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

次のステップ
カナリアリリースの設定 -- カナリアリリースの概念と追加の構成オプションについて学びます。
Argo Rollouts Istio traffic management -- サブセットレベルのトラフィック分割やマルチクラスター設定などの高度なオプションを探索します。