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

Microservices Engine:MSE Ingress ゲートウェイに基づくエンドツーエンドカナリアリリースの実装

最終更新日:Nov 09, 2025

Microservices Engine (MSE) を使用すると、MSE Ingress ゲートウェイに基づいてエンドツーエンドカナリアリリースを実装できます。これにより、ビジネスコードを変更することなく、エンドツーエンドのトラフィックスロットリングを実装できます。このトピックでは、MSE Ingress ゲートウェイを使用してエンドツーエンドカナリアリリースを実装する方法について説明します。

前提条件

制限事項

エンドツーエンドカナリアリリース機能は、タグベースルーティング機能と統合されています。Microservices Governance を使用してアプリケーションのエンドツーエンドカナariaリリース機能を実装する場合、アプリケーションにカナリアリリースルールとタグベースルーティングルールを設定しないことを推奨します。

エンドツーエンドカナリアリリースでサポートされている Java のバージョンとフレームワークの詳細については、「Microservices Governance でサポートされている Java フレームワーク」をご参照ください。

背景情報

Spring Cloud アプリケーションまたは Dubbo アプリケーションをデプロイしており、これらのアプリケーションに新しいバージョンが利用可能になったマイクロサービスのシナリオでは、使用中のバージョンに関係なく、トラフィックはランダムにアプリケーションにルーティングされます。この場合、特定の特性を持つトラフィックが、目的のバージョンのアプリケーションにルーティングされない可能性があります。この問題を解決するには、エンドツーエンドカナリアリリース機能を使用して、アプリケーションの特定のバージョンを他のバージョンから分離し、特定のルールに一致するリクエストトラフィックを目的のバージンのアプリケーションにルーティングします。独立したランタイム環境に相当するレーンを作成してアプリケーションのバージョンを分離し、MSE Ingress ゲートウェイのルーティングルールを設定してトラフィックをルーティングできます。

エンドツーエンドカナリアリリースのシナリオ

このトピックでは、e コマース業界の注文シナリオで、MSE Ingress ゲートウェイからマイクロサービスアプリケーションへのエンドツーエンドカナリアリリースを実装する方法の例を示します。この例では、アプリケーションアーキテクチャは MSE Ingress ゲートウェイとバックエンドマイクロサービスフレームワーク (Spring Cloud) で構成されています。バックエンドの呼び出しプロセスには、トランザクションセンター (アプリケーション A)、商品センター (アプリケーション B)、在庫センター (アプリケーション C) のバックエンドアプリケーションが関与します。クライアントまたは HTML ページを使用して、Nacos インスタンスに登録されているこれらのバックエンドアプリケーションにアクセスできます。

顧客が注文すると、トラフィックは MSE Ingress ゲートウェイに流れ込み、トランザクションセンター (アプリケーション A)、商品センター (アプリケーション B)、在庫センター (アプリケーション C) に順番にルーティングされます。次の呼び出しプロセスが使用されます: 顧客 -> MSE Ingress ゲートウェイ -> アプリケーション A -> アプリケーション B -> アプリケーション C。

アプリケーションのバージョンの特徴は、ビジネスの反復とともに更新されます。アプリケーション A とアプリケーション C の新しいバージョンが正式にリリースされる前に、カナリアリリースを使用して両方のアプリケーションでバージョンをテストする必要があります。バージョンが安定していることが証明された後、アプリケーションのバージョンをリリースできます。バージョンの新機能をリリースするには、アプリケーション A とアプリケーション C の両方でバージョンをリリースする必要があります。エンドツーENDカナリアリリース機能は、MSE Ingress ゲートウェイと Microservices Governance に基づいて提供されます。MSE Ingress ゲートウェイから複数のバックエンドアプリケーションへのエンドツーエンドカナリアリリースを実装できます。これにより、特定の特性を持つカナリアトラフィックを常にアプリケーションのカナリアバージョンにルーティングできます。これは、カナリアリリースを使用して複数のアプリケーションでバージョンをテストするのに役立ちます。アプリケーションにカナリアバージョンがない場合、トラフィックは自動的にアプリケーションのベース環境にルーティングされます。

全链路灰度场景

用語

  • レーン

    同じバージョンのアプリケーションに対して定義された分離環境。特定のトラフィックコントロールルールに一致するトラフィックのみが、レーン内でマークされたアプリケーションにルーティングできます。1 つのアプリケーションは複数のレーンに属することができ、1 つのレーンには複数のアプリケーションを含めることができます。アプリケーションとレーンは多対多の関係にあります。

  • レーングループ

    レーンのコレクション。レーングループは、異なるチームやシナリオを区別するために使用されます。

  • MSE Ingress ゲートウェイ

    MSE Ingress ゲートウェイを使用すると、MSE クラウドネイティブゲートウェイに基づいて Ingress トラフィックを管理できます。MSE Ingress ゲートウェイは NGINX Ingress ゲートウェイと互換性があり、NGINX Ingress ゲートウェイの 50 を超えるアノテーションをサポートしています。MSE Ingress ゲートウェイは、複数のサービスバージョンのカナリアリリースを同時にサポートします。MSE Ingress ゲートウェイは、柔軟なサービスガバナンス機能と包括的なセキュリティ保護を提供します。MSE Ingress ゲートウェイは、多くのクラウドネイティブ分散アプリケーションが利用可能なシナリオでのトラフィックガバナンスに適しています。

準備

アプリケーションの Microservices Governance の有効化

  1. MSE Microservices Governance Professional Edition を有効化します。

    詳細については、「Microservices Governance の有効化」をご参照ください。

  2. アプリケーションの Microservices Governance を有効化します。

    1. MSE コンソールにログインします。

    2. 左側のナビゲーションウィンドウで、[Microservices Governance] > [O&M センター] > [K8s クラスターリスト] を選択します。管理するクラスターを見つけ、[操作] 列の [管理] をクリックします。

    3. [クラスター詳細] ページで、管理する名前空間を見つけ、[操作] 列の [Microservices Governance の有効化] をクリックします。表示されるメッセージで、[OK] をクリックします。

デモアプリケーションのデプロイ

  1. ACK コンソールにログインします。

  2. 左側のナビゲーションウィンドウで、[クラスター] をクリックします。

  3. [クラスター] ページで、管理するクラスターを見つけ、クラスターの名前をクリックするか、[操作] 列の [詳細] をクリックします。クラスターの詳細ページが表示されます。

  4. 詳細ページの左側のナビゲーションウィンドウで、[ワークロード] > [デプロイメント] を選択します。

  5. [ステートレス] ページで、[名前空間] を選択し、[YAML から作成] をクリックします。

  6. パラメーターを設定し、[作成] をクリックします。

    この例では、Nacos Server アプリケーションをデプロイしてサービスディスカバリを実装します。アプリケーション A、B、C がデプロイされます。アプリケーション A と C にはベースバージョンとカナリアバージョンがデプロイされ、アプリケーション B にはベースバージョンがデプロイされます。

    nacos-server アプリケーションをデプロイします。

    YAML コードの表示

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: nacos-server
    spec:
      replicas: 1
      selector:
        matchLabels:
          app: nacos-server
      template:
        metadata:
          labels:
            app: nacos-server
        spec:
          containers:
          - env:
            - name: MODE
              value: standalone
            image: registry.cn-hangzhou.aliyuncs.com/mse-governance-demo/nacos-server:v2.1.2
            imagePullPolicy: Always
            name: nacos-server
          dnsPolicy: ClusterFirst
          restartPolicy: Always
    
    # nacos-server サービスの構成。
    ---
    apiVersion: v1
    kind: Service
    metadata:
      name: nacos-server
    spec:
      ports:
      - port: 8848
        protocol: TCP
        targetPort: 8848
      selector:
        app: nacos-server
      type: ClusterIP
    • アプリケーション A をデプロイします。

      • ベースバージョンの YAML コード

        ベースバージョンの YAML コードを表示

        apiVersion: apps/v1
        kind: Deployment
        metadata:
          name: spring-cloud-a
        spec:
          replicas: 2
          selector:
            matchLabels:
              app: spring-cloud-a
          template:
            metadata:
              labels:
                app: spring-cloud-a
                msePilotAutoEnable: 'on'
                msePilotCreateAppName: spring-cloud-a
            spec:
              containers:
              - env:
                - name: JAVA_HOME
                  value: /usr/lib/jvm/java-1.8-openjdk/jre
                image: registry.cn-hangzhou.aliyuncs.com/mse-governance-demo/spring-cloud-a:3.0.1
                imagePullPolicy: Always
                name: spring-cloud-a
                ports:
                - containerPort: 20001
                livenessProbe:
                  tcpSocket:
                    port: 20001
                  initialDelaySeconds: 10
                  periodSeconds: 30
      • カナリアバージョンの YAML コード

        カナリアバージョンの YAML コードを表示

        apiVersion: apps/v1
        kind: Deployment
        metadata:
          name: spring-cloud-a-gray
        spec:
          replicas: 2
          selector:
            matchLabels:
              app: spring-cloud-a-gray
          strategy:
          template:
            metadata:
              labels:
                app: spring-cloud-a-gray
                msePilotAutoEnable: 'on'
                alicloud.service.tag: gray
                msePilotCreateAppName: spring-cloud-a
            spec:
              containers:
              - env:
                - name: JAVA_HOME
                  value: /usr/lib/jvm/java-1.8-openjdk/jre
                image: registry.cn-hangzhou.aliyuncs.com/mse-governance-demo/spring-cloud-a:3.0.1
                imagePullPolicy: Always
                name: spring-cloud-a-gray
                ports:
                - containerPort: 20001
                livenessProbe:
                  tcpSocket:
                    port: 20001
                  initialDelaySeconds: 10
                  periodSeconds: 30
    • アプリケーション B をデプロイします。

      • ベースバージョンの YAML コード

        ベースバージョンの YAML コードを表示

        apiVersion: apps/v1
        kind: Deployment
        metadata:
          name: spring-cloud-b
        spec:
          replicas: 2
          selector:
            matchLabels:
              app: spring-cloud-b
          strategy:
          template:
            metadata:
              labels:
                app: spring-cloud-b
                msePilotAutoEnable: 'on'
                msePilotCreateAppName: spring-cloud-b
            spec:
              containers:
              - env:
                - name: JAVA_HOME
                  value: /usr/lib/jvm/java-1.8-openjdk/jre
                image: registry.cn-hangzhou.aliyuncs.com/mse-governance-demo/spring-cloud-b:3.0.1
                imagePullPolicy: Always
                name: spring-cloud-b
                ports:
                - containerPort: 8080
                livenessProbe:
                  tcpSocket:
                    port: 20002
                  initialDelaySeconds: 10
                  periodSeconds: 30
    • アプリケーション C をデプロイします。

      • ベースバージョンの YAML コード

        ベースバージョンの YAML コードを表示

        apiVersion: apps/v1
        kind: Deployment
        metadata:
          name: spring-cloud-c
        spec:
          replicas: 2
          selector:
            matchLabels:
              app: spring-cloud-c
          template:
            metadata:
              labels:
                app: spring-cloud-c
                msePilotAutoEnable: 'on'
                msePilotCreateAppName: spring-cloud-c
            spec:
              containers:
              - env:
                - name: JAVA_HOME
                  value: /usr/lib/jvm/java-1.8-openjdk/jre
                image: registry.cn-hangzhou.aliyuncs.com/mse-governance-demo/spring-cloud-c:3.0.1
                imagePullPolicy: Always
                name: spring-cloud-c
                ports:
                - containerPort: 8080
                livenessProbe:
                  tcpSocket:
                    port: 20003
                  initialDelaySeconds: 10
                  periodSeconds: 30
      • カナリアバージョンの YAML コード

        カナリアバージョンの YAML コードを表示

        apiVersion: apps/v1
        kind: Deployment
        metadata:
          name: spring-cloud-c-gray
        spec:
          replicas: 2
          selector:
            matchLabels:
              app: spring-cloud-c-gray
          template:
            metadata:
              labels:
                app: spring-cloud-c-gray
                msePilotAutoEnable: 'on'
                alicloud.service.tag: gray
                msePilotCreateAppName: spring-cloud-c
            spec:
              containers:
              - env:
                - name: JAVA_HOME
                  value: /usr/lib/jvm/java-1.8-openjdk/jre
                image: registry.cn-hangzhou.aliyuncs.com/mse-governance-demo/spring-cloud-c:3.0.1
                imagePullPolicy: IfNotPresent
                name: spring-cloud-c-gray
                ports:
                - containerPort: 8080
                livenessProbe:
                  tcpSocket:
                    port: 20003
                  initialDelaySeconds: 10
                  periodSeconds: 30
  7. Ingress アプリケーションであるアプリケーション A に 2 つの Kubernetes サービスを設定します。

    1. ACK コンソールにログインします。

    2. 詳細ページの左側のナビゲーションウィンドウで、[ネットワーク] > [サービス] を選択します

    3. [サービス] ページで、[名前空間] を選択し、[YAML でリソースを作成] をクリックします。[作成] ページでパラメーターを設定し、[作成] をクリックします。

      • アプリケーション A のベースバージョン用にデプロイされる spring-cloud-a-base サービスの YAML コード

        YAML コードの表示

        apiVersion: v1
        kind: Service
        metadata:
          name: spring-cloud-a-base
        spec:
          ports:
            - name: http
              port: 20001
              protocol: TCP
              targetPort: 20001
          selector:
            app: spring-cloud-a
      • アプリケーション A のカナリアバージョン用にデプロイされる spring-cloud-a-gray サービスの YAML コード

        YAML コードの表示

        apiVersion: v1
        kind: Service
        metadata:
          name: spring-cloud-a-gray
        spec:
          ports:
            - name: http
              port: 20001
              protocol: TCP
              targetPort: 20001
          selector:
            app: spring-cloud-a-gray

ステップ 1: レーングループの作成

  1. MSE コンソールにログインし、トップナビゲーションバーでリージョンを選択します。

  2. 左側のナビゲーションウィンドウで、Microservices Governance > Full link Grayscale を選択します。

  3. [フルトレースグレーリリース] ページで、[レーングループとレーンの作成] をクリックします。選択したマイクロサービスの名前空間にレーングループが利用可能な場合は、[レーングループの作成] をクリックします。

  4. [レーングループの作成] パネルで、パラメーターを設定し、[OK] をクリックします。

    パラメーター

    説明

    レーングループ名

    レーングループの名前を入力します。

    Ingress タイプ

    [その他のゲートウェイ] を選択します。

    その他のゲートウェイには、NGINX Ingress、APISIX、および自己管理の Java ゲートウェイが含まれます。ゲートウェイでカナリア転送ルールを実装する必要があります。

    レーングループアプリケーション

    Ingress アプリケーションまたは Ingress ゲートウェイに関連するすべてのサービスを選択します。

    レーングループが作成されたら、Ingress アプリケーションおよびその他の関連アプリケーションが有効であるかどうかを確認します。[フルトレースグレーリリース] ページの [レーングループと関連アプリケーション] セクションで作成したレーングループを表示できます。レーングループ情報を変更するには、右側の 编辑 アイコンをクリックして情報を変更します。

ステップ 2: レーンの作成

  1. フルトレースグレーリリース ページで、トップナビゲーションバーでレーングループが存在するリージョンを選択し、下部にある [最初の分割レーンを作成] をクリックします。

    選択したマイクロサービスの名前空間にレーンが利用可能な場合は、[レーンの作成] をクリックします。

    重要

    アプリケーションでエンドツーエンドカナリアリリース機能が有効になっている場合、これらのアプリケーションにはカナリアリリース機能とタグベースルーティング機能を使用しないことを推奨します。

  2. [レーンの作成] パネルで、パラメーターを設定し、[OK] をクリックします。

    重要

    ゲートウェイが Ingress ゲートウェイの場合は、ACK コンソールで Ingress ルーティングルールを設定する必要があります。

    パラメーター

    説明

    ノードタグの追加

    • 設定方法: ACK コンソールで、アプリケーションの YAML ファイルの spec.template.metadata.labelsalicloud.service.tag: ${tag} を追加します。

    • タグ名の設定: 次のキーと値のペアを spec.template.metadata.labels に追加します。

      • msePilotCreateAppName:${AppName}

      • alicloud.service.tag:{tag}

    レーン名

    レーンの名前を入力します。

    レーンタグ

    [ノードタグ] を設定すると、タグが [レーンタグ] ドロップダウンリストに表示されます。ドロップダウンリストから設定したタグを選択すると、タグはレーン内のアプリケーションに自動的に追加されます。

    レーンを作成した後、[フルトレースグレーリリース] ページの [トラフィック分散] セクションでレーン情報を表示または設定できます。

    • 图标 アイコンをクリックして、レーンのトラフィックの割合を表示します。

    • [アクション] 列の 应用状态图标 アイコンをクリックして、レーンアプリケーションのステータスを設定します。

      • レーンを有効にする: [有効化] をクリックします。トラフィックはレーンの設定に基づいてルーティングされます。トラフィックは、レーンタグを持つアプリケーションバージョンに優先的にルーティングされます。タグ付けされたアプリケーションバージョンが存在しない場合、トラフィックはタグ付けされていないアプリケーションバージョンにルーティングされます。

      • レーンを無効にする: [無効化] をクリックします。レーン内のアプリケーションのトラフィックは、その後タグ付けされていないアプリケーションバージョンにルーティングされます。

      • レーンに関する情報の編集: [編集] をクリックします。

      • レーンの削除: [削除] をクリックします。

ステップ 3: ベースバージョンの Ingress ルールの設定

ビジネスドメイン名が example.com で、example.com へのすべてのリクエストトラフィックをベースライン (オンライン) 環境のみにルーティングする場合、次のコードを使用してベースライン環境の Ingress ルールを設定できます。

YAML コードの表示

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: spring-cloud-a
  namespace: default
spec:
  ingressClassName: mse
  rules:
    - host: example.com
      http:
        paths:
          - backend:
              service:
                name: spring-cloud-a-base
                port:
                  number: 20001
            path: /
            pathType: Prefix

curl コマンドを使用して example.com にアクセスし、トラフィックをベースライン環境にルーティングします。

curl -H "host: example.com" http://47.98.xxx.xx/a

次の結果が返されます:

A[192.168.0.98][config=base] -> B[192.168.0.157] -> C[192.168.0.161]

ステップ 4: カナリアバージョンの Ingress ルーティングルールの設定

ヘッダーベースのポリシーを使用して本番トラフィックとカナリアトラフィックを区別する場合、example.com にアクセスするときに HTTP ヘッダー x-user-id: 100 を含むリクエストをカナリア環境にルーティングできます。トラフィックは、呼び出しチェーン内の各アプリケーションのカナリアリリースバージョンに優先的にルーティングされます。アプリケーションにカナリアリリースバージョンが存在しない場合、トラフィックはディザスタリカバリのためにベースラインバージョンにルーティングされます。次のコードを使用して、カナリア環境の Ingress ルールを設定します。

YAML コードの表示

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  annotations:
    nginx.ingress.kubernetes.io/canary: 'true'
    nginx.ingress.kubernetes.io/canary-by-header: x-user-id
    nginx.ingress.kubernetes.io/canary-by-header-value: '100'
    mse.ingress.kubernetes.io/request-header-control-update: x-mse-tag gray
  name: spring-cloud-a-gray
  namespace: default
spec:
  ingressClassName: mse
  rules:
    - host: example.com
      http:
        paths:
          - backend:
              service:
                name: spring-cloud-a-gray
                port:
                  number: 20001
            path: /
            pathType: Prefix

上記のコードでは、アノテーションを使用してカナリアリリース、ヘッダー設定、およびヘッダーコントロール機能を実装しています。アノテーションの使用方法の詳細については、「MSE Ingress の高度な使用法」をご参照ください。

curl コマンドを使用して example.com にアクセスし、トラフィックをカナリア環境にルーティングします。リクエストには HTTP ヘッダー x-user-id: 100 を含める必要があります。

curl -H "host: example.com" -H "x-user-id: 100" http://47.98.xxx.xx/a

次の結果は、カナリアトラフィックがアプリケーション A と C のカナリアバージョンに優先的にルーティングされることを示しています。アプリケーション B については、カナリアバージョンが利用できないため、トラフィックはベースバージョンにルーティングされます。

Agray[192.168.0.128][config=base] -> B[192.168.0.152] -> Cgray[192.168.0.151]

MSE コンソールでのアプリケーションのトラフィックモニタリングチャートの表示

  • 単一アプリケーションのモニタリングチャートを表示します。

    1. フルトレースグレーリリース ページで、モニタリング情報を表示したいレーングループのタブをクリックします。

    2. Lane Groups and Involved Applications セクションで、モニタリング情報を表示したいアプリケーションの名前をクリックします。1 秒あたりのクエリ数 (QPS) データが、ページの右側にある QPS data セクションに表示されます。

  • レーングループ内のすべてのアプリケーションのモニタリングチャートを表示します。

    1. フルトレースグレーリリース ページで、モニタリング情報を表示したいレーングループのタブをクリックします。

    2. [アプリケーション QPS モニタリング] セクションの右側にある [トラフィック詳細の表示] をクリックして、レーン内のすべてのアプリケーションのトラフィックモニタリングチャートを表示します。