Argo CD は、Git リポジトリ内のアプリケーションオーケストレーションの変更を監視し、アプリケーション構成をクラスター内の対応するアプリケーションのステータスと比較し、変更をクラスターに自動的にデプロイします。Argo CD では、クラスターへの変更を手動でデプロイすることもできます。マイクロサービスアプリケーションの新しいバージョンを起動する際にリスクと課題に直面し、スムーズな移行を行い、新しい機能を徐々に検証したい場合は、Argo CD を使用してアプリケーションサービスのエンドツーエンドカナリアリリースを実装できます。Argo CD は、洗練されたトラフィックスケジューリングとバージョン管理方法を使用して、古いバージョンと新しいバージョンの間のシームレスな移行を保証し、オンラインサービスへの影響を最小限に抑え、システムの安定性と信頼性を向上させます。
前提条件
Enterprise Edition または Ultimate Edition の Service Mesh(ASM)インスタンスが作成されており、インスタンスのバージョンが 1.20.6.27 以降であること。詳細については、「ASM インスタンスの作成」および「ASM インスタンスの更新」をご参照ください。
Container Service for Kubernetes(ACK)クラスターが ASM インスタンスに追加されていること。詳細については、「ASM インスタンスへのクラスターの追加」をご参照ください。
Argo CD がインストールされ、イングレスゲートウェイが作成されていること。詳細については、「ASM と Argo CD を統合して GitOps を実装する」のステップ 1 ~ 3 をご参照ください。
kubectl クライアントがクラスターに接続されていること。詳細については、「クラスターの kubeconfig ファイルを取得し、kubectl を使用してクラスターに接続する」をご参照ください。
背景情報
Argo CD を使用すると、GitOps アプローチを実装してアプリケーションサービスをデプロイおよび公開できます。開発者として、YAML ファイルを使用してアプリケーションとトラフィック管理リソースを定義し、定義を Git リポジトリに送信できます。アプリケーションリソースには、デプロイメントとサービスが含まれます。トラフィック管理リソースには、VirtualServices、Gateways、および DestinationRules が含まれます。Argo CD は、クラスター内のリソースのステータスを監視し、ステータスを Git リポジトリ内のリソースの予期されるオーケストレーションと比較します。Git リポジトリ内のリソースが変更されると、Argo CD はクラスター内のリソースへの変更を自動的に同期します。Argo CD では、クラスター内のリソースへの変更を手動で同期することもできます。
ASM を使用すると、トラフィックレーンを使用して、特定のバージョンのアプリケーションのサービス、または特定の特性を持つアプリケーションを独立したランタイム環境に分離できます。これは、アプリケーションのサービスのエンドツーエンドカナリアリリースを実装するのに役立ちます。 v1.20.6.27 以降の ASM インスタンスでは、ASMSwimLaneGroup および ASMSwimLane CustomResourceDefinitions(CRD)を使用してトラフィックレーンを定義できます。Argo CD を使用してこれら 2 つの CRD を管理し、エンドツーエンドカナリアリリースを実装できます。詳細については、「トラフィックレーンの概要」をご参照ください。
ステップ 1:Argo CD を使用してアプリケーションサービスとトラフィックレーンルールをデプロイする
モックアプリケーションを作成し、アプリケーションのエンドツーエンドキャリーリリースを実装します。
Argo CD UI で、[新しいアプリ] をクリックし、パラメーターを設定します。

パラメーター
説明
アプリケーション名
アプリケーション名。この例では、
mockと入力します。同期ポリシー
アプリケーションの同期ポリシー。この例では、
自動を選択します。これは、Git リポジトリ内のリソース定義が変更されたときに、Git リポジトリ内の最新のリソース定義が自動的に同期されることを意味します。リソースの削除を選択すると、リソースの定義が Git リポジトリに存在しなくなったときにリソースが削除されます。リポジトリ URL
リソース定義を同期する Git リポジトリの URL。この例では、
https://github.com/AliyunContainerService/asm-labs.gitと入力します。Git リポジトリをフォークし、フォークされた Git リポジトリの YAML コードを変更できます。リビジョン
リソース定義が同期される Git リポジトリの Git タグまたはブランチ名。この例では、
argocd-asmと入力します。パス
リソース定義が同期される Git リポジトリ内のコードパス。この例では、以下の例で使用されるリソースが配置されている
argo-cd/swimlaneパスを入力します。クラスター URL
リソース定義の同期先となるクラスターの Kubernetes API サーバーのエンドポイント。この例では、
https://kubernetes.default.svcと入力します。これは、Argo CD がインストールされているクラスターの Kubernetes API サーバーのエンドポイントです。
パラメーターを設定したら、ページ上部の [作成] をクリックします。
Argo CD UI の [アプリケーション] ページで、作成したばかりのモックアプリケーションのステータスを表示できます。

モックアプリケーションをクリックして、リソースの同期ステータスを表示します。

Deployments および Services リソースに加えて、Git リポジトリには VirtualServices、Gateways、ASMSwimLaneGroup、ASMSwimLane などのリソースも含まれていることがわかります。
ステップ 2:トラフィックレーンを使用してエンドツーエンドカナリアリリースを検証する
この例では、ASMSwimLaneGroup および ASMSwimLane CRD を使用して、v1 と v2 のサービスを分離します。仮想サービスを作成して、イングレスゲートウェイが 1:1 の比率で 2 つのバージョンのサービスにリクエストを転送できるようにします。イングレスゲートウェイに繰り返しアクセスして、エンドツーエンドカナリアリリースを検証できます。
ASM コンソール でイングレスゲートウェイのパブリック IP アドレスを取得します。詳細については、「KServe と ASM を統合してクラウドネイティブ AI モデルに基づく推論サービスを実装する」トピックの「ステップ 2:ASM イングレスゲートウェイの IP アドレスを取得する」セクションをご参照ください。
次のコマンドを実行して、環境変数を構成します。
xxx.xxx.xxx.xxxは、手順 1 で取得した IP アドレスです。export ASM_GATEWAY_IP=xxx.xxx.xxx.xxx // イングレスゲートウェイのIPアドレスを環境変数に設定します次のコマンドを実行して、イングレスゲートウェイに繰り返しアクセスします。
for i in {1..100}; do curl http://${ASM_GATEWAY_IP}/mock; echo ''; sleep 1; done; // イングレスゲートウェイに繰り返しアクセスします予期される出力:
-> mocka(version: v2, ip: 10.0.239.73)-> mockb(version: v2, ip: 10.0.239.136)-> mockc(version: v2, ip: 10.0.239.139) -> mocka(version: v1, ip: 10.0.239.75)-> mockb(version: v1, ip: 10.0.239.138)-> mockc(version: v1, ip: 10.0.239.137) -> mocka(version: v2, ip: 10.0.239.73)-> mockb(version: v2, ip: 10.0.239.136)-> mockc(version: v2, ip: 10.0.239.139) ... // v1とv2へのリクエストがほぼ1:1の比率で送信されていることを示す出力出力は、mock アプリケーションに mocka、mockb、mockc の 3 つのサービスが含まれていることを示しています。各サービスには、v1 と v2 の 2 つのバージョンがあります。3 つのサービスは、mocka > mockb > mockc の順序で呼び出されます。リクエストは、mock アプリケーションの v1 および v2 バージョンにほぼ 1:1 の比率で送信されます。さらに、サービスの v1 および v2 バージョンは個別に呼び出されます。エンドツーエンドカナリアリリースは期待どおりに実装されています。
関連操作
サービスの新しいバージョンの公開
次の図は、この例で使用されているサンプル Git リポジトリファイルの構造を示しています。

ファイル | 説明 |
mock-v1.yaml mock-v2.yaml | mocka、mockb、mockc サービスの v1 および v2 のデプロイを指定します。 |
swimlanegroup.yaml | レーン グループを指定します。レーン グループは、1 つ以上のレーンに関連付けられています。レーン グループは、複数のトラフィックレーン間で共有される情報を定義します。情報には、 |
swimlanes.yaml | レーンを指定します。2 つの ASMSwimLane CRD を使用して、v1 および v2 のサービス用に 2 つのレーンを定義します。 |
mock-route.yaml | イングレスゲートウェイに適用される Istio ゲートウェイと仮想サービスを指定します。これらのリソースは、イングレスゲートウェイがレーン内のサービスにリクエストを転送する方法を制御します。 |
サービスの新しいバージョンを公開するには、サンプル Git リポジトリ https://github.com/AliyunContainerService/asm-labs.git の argocd-asm ブランチをフォークし、argo-cd/swimlane パスにある上記の YAML リソースを変更してから、変更をリモート Git リポジトリに送信します。変更を送信すると、Argo CD は Git リポジトリの変更を自動的に同期します。ステップ 1 の リポジトリ URL フィールドに、フォークされた Git リポジトリの URL を入力する必要があります。
たとえば、mocka、mockb、mockc サービスの v3 バージョンを公開します。Git リポジトリの YAML リソースに次の変更を加える必要があります。
argo-cd/swimlane/mock-v3.yamlファイルを作成します。YAML ファイルは、mocka、mockb、mockc サービスの v3 バージョンのデプロイを定義します。
argo-cd/swimlane/swimlanes.yamlファイルの内容を、次のコードブロックの YAML コードに変更します。この例では、v3 という名前の ASMSwimLane CRD がファイルに追加されます。ASMSwimLane CRD は、mock という名前の ASMSwimLaneGroup CRD に関連付けられており、
version:v3ラベルが付いたポッドが v3 サービスを実行することを指定します。argo-cd/swimlane/mock-route.yamlファイルの内容を、次のコードブロックの YAML コードに変更します。この例では、ファイル内の mock という名前の仮想サービスが変更され、v3 バージョンの mocka サービスがルート先に追加されます。
subsetフィールドは、トラフィックレーンの名前を指定します。weightフィールドは仮想サービス内で変更されます。v1、v2、v3 のサービスのカナリアリリースの比率は 6:3:1 に変更されます。