Argo Rollouts は Kubernetes コントローラーであり、一連の CustomResourceDefinition(CRD)を含んでいます。 サービスメッシュ(ASM)と Argo Rollouts を統合して、カナリアリリースの機能を強化できます。 Kubernetes 環境でアプリケーションを更新し、新しいアプリケーションの更新に伴うリスクを軽減する場合、ASM と Argo Rollouts を統合してカナリアリリースを実装できます。 この方法では、アプリケーションの新しいバージョンをユーザーにバッチで段階的にプッシュし、これらのバージョンのパフォーマンスをリアルタイムで監視できます。 これにより、リスクを効果的に制御し、サービスの安定性とユーザーエクスペリエンスを保証し、ビジネスの継続性を確保しながらバージョンを正常に反復できます。
前提条件
バージョン 1.12.4.50 以降の ASM インスタンスが作成されていること。 詳細については、ASM インスタンスの作成をご参照ください。
クラスターが ASM インスタンスに追加されていること。 詳細については、ASM インスタンスへのクラスターの追加をご参照ください。
kubectl を使用して ASM インスタンスに接続されていること。 詳細については、コントロールプレーンで kubectl を使用して Istio リソースにアクセスするをご参照ください。
準備
Argo Rollout のインストール
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.yaml
次のコマンドを実行して、Argo Rollout kubectl プラグインをインストールします。
Argo Rollouts kubectl プラグインは、kubectl ベースの管理を提供できます。
brew install argoproj/tap/kubectl-argo-rollouts
Kubernetes API を使用して、データプレーン上の ASM インスタンスの Istio リソースへのアクセスを有効にする
ASM コンソール にログインします。 左側のナビゲーションペインで、 を選択します。
[メッシュ管理] ページで、ASM インスタンスの名前をクリックします。 左側のナビゲーションペインで、 を選択します。
有効化[データプレーン Kubeapi アクセスを有効にする] の右側にある
をクリックします。
表示されるメッセージで、[OK] をクリックします。
カナリアリリースを実装する
次の例では、安定バージョンとカナリアリリースバージョンを作成する方法、およびトラフィック比率に基づいてカナリアリリースを実装するために、安定バージョンからカナリアリリースバージョンにトラフィックを徐々に切り替える方法を示します。 カナリアリリースの詳細については、カナリアリリースを構成するをご参照ください。
ステップ 1:Rollout アプリケーションとサービスアプリケーションを作成する
Rollout を作成します。
次のコンテンツを含む rollout.yaml ファイルを作成します。
strategy
フィールドは、カナリアリリースポリシーを定義します。 strategy フィールドの setWeight パラメーターと pause パラメーターについては、以下で説明します。setWeight
: カナリアリリースバージョンにルーティングされるトラフィックの重み。pause
: Rollout を一時停止します。 一時停止ステップにduration
が指定されていない場合、Rollout を手動で更新する必要があります。 一時停止ステップにduration
が指定されている場合、指定されたduration
が経過すると、システムによって Rollout が自動的に更新されます。
次のコマンドを実行して、ASM インスタンスに追加されたクラスターに Rollout をデプロイします。
kubectl apply -f rollout.yaml
サービスを作成します。
次のコンテンツを含む 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
次のコマンドを実行して、ASM インスタンスに追加されたクラスターにサービスをデプロイします。
kubectl apply -f service.yaml
ステップ 2:関連する Istio リソースを作成する
istio-rollout-vsvc という名前の仮想サービスを作成します。
データプレーン上の ASM インスタンスの Istio リソースへのアクセスを Kubernetes API を使用して有効にしています。 したがって、データプレーン上の kubeconfig ファイルを使用して、仮想サービス、Istio ゲートウェイ、宛先ルールなどの Istio リソースにアクセスできます。 または、ASM コンソール または kubeconfig ファイルを使用して、Istio リソースを作成することもできます。
次のコンテンツを含む 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
次のコマンドを実行して、istio-rollout-vsvc をデプロイします。
kubectl apply -f istio-rollout-vsvc.yaml
istio-rollout-gateway という名前の Istio ゲートウェイを作成します。
次のコンテンツを含む 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
次のコマンドを実行して、istio-rollout-gateway をデプロイします。
kubectl apply -f istio-rollout-gateway.yaml
ステップ 3:イングレスゲートウェイをデプロイする
サービスアクセステスト用にポート 80 が有効になっているイングレスゲートウェイを作成します。
ASM コンソール にログインします。 左側のナビゲーションペインで、 を選択します。
[メッシュ管理] ページで、ASM インスタンスの名前をクリックします。 左側のナビゲーションペインで、 を選択します。
[イングレスゲートウェイ] ページで、[作成] をクリックします。 イングレスゲートウェイのパラメーターを設定し、[作成] をクリックします。
次の表では、イングレスゲートウェイの一部の 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 の初期ステータスをテストする
イングレスゲートウェイの IP アドレスを取得します。
ASM コンソール にログインします。 左側のナビゲーションペインで、 を選択します。
[メッシュ管理] ページで、ASM インスタンスの名前をクリックします。 左側のナビゲーションペインで、 を選択します。
イングレスゲートウェイの [サービスアドレス] を取得します。
ブラウザーを使用して、http://{イングレスゲートウェイの IP アドレス}/ にアクセスします。
次の図は、アクセス結果を示しています。 このページでは、http://{イングレスゲートウェイの IP アドレス}/color への同時呼び出しが呼び出され、取得した色でグリッドが塗りつぶされます。 Rollout istio-rollout で指定されている色は
blue
で、カナリアリリースは開始されていません。 したがって、青色が表示されます。
ステップ 6:Rollout を更新する
この例では、黄色を使用してカナリアリリースバージョンを示します。 http://{イングレスゲートウェイの IP アドレス}/ ページのグリッドの色が青から黄色に変わると、カナリアリリースが実装されます。
Rollout のコンテナーのイメージバージョンを更新します。
次のコマンドを実行して、イメージバージョンを更新します。
kubectl argo rollouts set image istio-rollout "*=argoproj/istio-rollout:yellow"
対応するコンテナーのイメージバージョンを表示します。
ACK コンソール にログインします。 左側のナビゲーションペインで、[クラスター] をクリックします。
[クラスター] ページで、管理するクラスターを見つけ、その名前をクリックします。 左側のペインで、
を選択します。[名前] 列で、対応するコンテナーのイメージバージョンを表示します。
黄色バージョン(カナリアリリースバージョン)が実行されている Pod が作成されますが、青バージョン(安定バージョン)が実行されている Pod も存在します(次の図を参照)。
ブラウザーを使用して、http://{イングレスゲートウェイの IP アドレス}/ にアクセスします。
結果として、青いグリッドの 10% が黄色に変更されます(次の図を参照)。
これは、構成された仮想サービストラフィックの重みが変化するためです。 具体的には、安定バージョン(青バージョン)のトラフィックの重みが 100 から 90 に変化するのに対し、カナリアリリースバージョン(黄色バージョン)のトラフィックの重みが 0 から 10 に変化します。 Rollout は、仮想サービストラフィックの重みを制御します。 最初の手順でカナリアリリースバージョンに指定したトラフィックの重みは、Rollout の作成時に
10
に設定されます。 したがって、Rollout が開始されると、Argo Rollouts コントローラーは、Rollout で構成された仮想サービストラフィックの重みをそれに応じて変更します。 また、pause
パラメーターは空のままです。 これは、Rollout を手動で確認して次のステージに進む必要があることを意味します。カナリアリリースを続行します。
次のコマンドを実行して、カナリアリリースを続行します。
kubectl argo rollouts promote istio-rollout
ブラウザーを使用して、http://{イングレスゲートウェイの IP アドレス}/ にアクセスします。
次の図は、結果を示しています。 仮想サービストラフィックの重みは、Rollout の構成に基づいて引き続き調整されます。 このステージでは、
pause
の時間が指定されています。 詳細については、ステップ 1 をご参照ください。 したがって、指定された一時停止時間が経過すると、システムによって仮想サービストラフィックの重みが自動的に調整されます。
カナリアリリースが成功したかどうかを確認します。
しばらく待ってから、ブラウザーを使用して http://{イングレスゲートウェイの IP アドレス}/ にアクセスします。
すべての青いグリッドが黄色に変更されます(次の図を参照)。
次のコマンドを実行して、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 としてマークされます。
ASM で Prometheus を有効にします。 詳細については、Managed Service for Prometheus を統合して ASM インスタンスを監視する または セルフマネージド Prometheus インスタンスを使用して ASM インスタンスを監視する をご参照ください。
Argo AnalysisTemplate を構成します。
次のコンテンツを含む 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]) )
次のコマンドを実行して、Argo AnalysisTemplate をデプロイします。
kubectl apply -f istio-success-rate.yaml
分析を Rollout に関連付けます。
次のコンテンツを含む rollout.yaml ファイルを作成します。
strategy
の下にanalysis
パラメーターを設定して、2 番目のステップから監視と自動ロールバックに分析を使用できるようにします。 Rollout のコンテナーの初期イメージバージョンは yellow です。次のコマンドを実行して、Rollout を更新します。
kubectl apply -f rollout.yaml
次のコマンドを実行して、イメージバージョンを更新します。
kubectl argo rollouts set image istio-rollout "*=argoproj/rollouts-demo:orange"
ブラウザーを使用して、http://{イングレスゲートウェイの IP アドレス}/ にアクセスします。 次の図は、結果を示しています。
Rollout の更新を手動で確認します。
次のコマンドを実行して、カナリアリリースを続行します。
コマンドを実行すると、自動カナリアリリースが開始されます。 また、2 番目のステップから Prometheus 監視が有効になります。 この場合、カナリアリリースバージョンのエラー率が 90% を超えると、ロールバックがトリガーされます。
kubectl argo rollouts promote istio-rollout
次のコマンドを実行して、Rollout のステータスを表示します。
kubectl argo rollouts get rollout istio-rollout --watch
予想される出力:
エラー率を構成します。
後続の段階的リリースでは、カナリアリリースバージョンのエラー率を手動で調整できます。 エラープログレスバーが 100% に達すると、すべてのオレンジ色のグリッド(カナリアリリースバージョン)が赤色の枠で囲まれてエラーを示します。 しばらくすると、すべてのカナリアリリースバージョンが安定バージョン(黄色のグリッド)に自動的にロールバックされます。
図 1. 次の図は、カナリアリリースが実装されていることを示しています。
図 2. 次の図は、すべてのカナリアリリースバージョンが安定バージョンに自動的にロールバックされたことを示しています。