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

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

最終更新日:Jul 18, 2026

Microservices Engine (MSE) を使用すると、MSE Ingress ゲートウェイに基づいてエンドツーエンドカナリアリリースを実装できます。これにより、ビジネスコードを変更せずにエンドツーエンドでのトラフィック速度制限を実現できます。

前提条件

制限事項

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

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

背景情報

Spring Cloud または Dubbo アプリケーションを使用したマイクロサービスシナリオでは、デフォルトでトラフィックはアプリケーションバージョン間でランダムに分散されます。そのため、特定の特性を持つトラフィックが意図したバージョンに到達しない可能性があります。エンドツーエンドカナリアリリース機能は、特定のアプリケーションバージョンをスイムレーン(独立した実行環境)に分離し、定義されたルールに一致するトラフィックを目的のバージョンにルーティングすることでこの問題を解決します。アプリケーションバージョンを分離するためにスイムレーンを作成し、MSE Ingress ゲートウェイのルーティングルールを設定してトラフィックをルーティングできます。

シナリオ

この例では、MSE Ingress ゲートウェイから e コマース注文シナリオにおけるバックエンドマイクロサービスへのエンドツーエンドカナリアリリースを紹介します。アーキテクチャは MSE Ingress ゲートウェイと、トランザクションセンター(アプリケーション A)、商品センター(アプリケーション B)、在庫センター(アプリケーション C)の 3 つのアプリケーションで構成される Spring Cloud バックエンドで構成されています。クライアントまたは HTML ページは、Nacos インスタンスに登録されたこれらのバックエンドアプリケーションにアクセスします。

顧客が注文を完了すると、トラフィックは MSE Ingress ゲートウェイを経由し、アプリケーション A → アプリケーション B → アプリケーション C の順にルーティングされます:顧客 → MSE Ingress ゲートウェイ → アプリケーション A → アプリケーション B → アプリケーション C。

アプリケーション A およびアプリケーション C の新バージョンをリリースする前に、両方のアプリケーションに対してカナリアリリースを使用して新バージョンをテストする必要があります。バージョンの安定性が確認された後、アプリケーション A およびアプリケーション C の両方に対して本番リリースを行います。MSE Ingress ゲートウェイおよび Microservices Governance に基づくエンドツーエンドカナリアリリース機能により、特定の特性を持つカナリアトラフィックが複数のアプリケーションにわたって常にカナリアバージョンにルーティングされます。アプリケーションにカナリアバージョンが存在しない場合、トラフィックは自動的にベース環境にルーティングされます。

全链路灰度场景

用語

  • レーン

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

  • レーングループ

    複数のスイムレーンを集めたコレクションで、異なるチームやシナリオを区別するために使用されます。

  • MSE Ingress ゲートウェイ

    MSE Ingress ゲートウェイは、MSE クラウドネイティブゲートウェイに基づいて Ingress トラフィックを管理します。NGINX Ingress と互換性があり、50 種類以上の NGINX Ingress アノテーションをサポートしているため、複数のサービスバージョンに対して同時にカナリアリリースを実現できます。柔軟なサービスガバナンスと包括的なセキュリティ保護により、大規模なクラウドネイティブ分散アプリケーションのトラフィックガバナンス要件を満たします。

前提条件

アプリケーションに対する Microservices Governance の有効化

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

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

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

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

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

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

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

  1. Container Service 管理コンソールにログインします。

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

  3. クラスターリスト ページで、対象クラスターの名前をクリックするか、詳細操作 列でクリックします。

  4. クラスター管理ページの左側ナビゲーションウィンドウで、ワークロード > 展開 を選択します。

  5. Stateless ページで、Namespaces を選択し、YAML から作成 をクリックします。

  6. テンプレートを設定し、Create をクリックします。

    この例では、サービス検出のために 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
    
    # The configuration of the nacos-server service.
    ---
    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. Service ページで、Namespaces を選択し、YAML から作成 をクリックしてテンプレートを設定し、Create をクリックします。

      • アプリケーション 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. End-to-end Canary Release ページで、Create Lane Groups and Lanes をクリックします。選択したマイクロサービ 名前空間にすでにレーングループが存在する場合は、+レーングループの作成 をクリックします。

  4. Create Lane Group パネルで、レーングループのパラメーターを設定し、OK をクリックします。

    パラメーター

    説明

    Name of Lane Group

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

    Entry Type

    Other Gateways を選択します。

    NGINX Ingress ゲートウェイ、APISIX ゲートウェイ、セルフマネージド Java ゲートウェイなどのその他のゲートウェイでは、ゲートウェイ上でカナリア転送ルールを実装する必要があります。

    Lane group involves application

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

    レーングループを作成後、Ingress アプリケーションおよび関連するすべてのアプリケーションが正しいことを確認します。End-to-end Canary Release ページの Lane Groups and Involved Applications セクションでレーングループを確認できます。レーングループ情報を変更するには、右側の 编辑 アイコンをクリックして情報を更新します。

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

  1. エンドツーエンドカナリアリリースページ の上部で、レーングループと同じリージョンを選択し、ページ下部の Create First Split Lane をクリックします。

    選択したマイクロサービスの名前空間にすでにスイムレーンが存在する場合は、Create Lane をクリックします。

    重要

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

  2. Create Lane パネルで、スイムレーンのパラメーターを設定し、OK をクリックします。

    重要

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

    パラメーター

    説明

    Add Node Tag

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

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

      • msePilotCreateAppName:${AppName}

      • alicloud.service.tag:{tag}

    Lane Name

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

    Lane Tag

    Add Node Tag 後、ドロップダウンリストに該当するタグの一覧が表示されます。タグを選択すると、対応するアプリケーションが自動的に追加されます。

    スイムレーンを作成後、End-to-end Canary Release ページの Traffic Distribution セクションで、その情報を確認または設定できます。

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

    • スイムレーンリストのActions列にあるアプリケーションステータスアイコンアイコンをクリックして、スイムレーン内のアプリケーションのステータスを設定します。

      • スイムレーンの有効化:Enable をクリックします。これによりスイムレーンがアクティブになり、スイムレーン構成に従ってトラフィックがルーティングされます。一致するトラフィックは、対応するスイムレーンタグを持つアプリケーションバージョンに優先的にルーティングされます。タグ付きバージョンが存在しない場合は、タグなしバージョンにルーティングされます。

      • スイムレーンの無効化:Close をクリックします。このアプリケーションのトラフィックはタグなしバージョンにルーティングされます。

      • スイムレーンの変更:Edit をクリックして、スイムレーン構成を変更します。

      • スイムレーンの削除:Delete をクリックして、スイムレーンを削除します。

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

サービスドメイン名が example.com で、トラフィックをベースバージョン(オンラインバージョン)のみにルーティングしたい場合は、以下の YAML を使用してベースバージョン用の 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

上記のコードでは、アノテーションを使用してカナリアリリース、ヘッダー設定、ヘッダーコントロールを実装しています。これらのアノテーションの詳細については、「Container Service for Kubernetes: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 セクションで、モニタリング情報を確認したいアプリケーションの名前をクリックします。秒間クエリ数 (QPS) データがページ右側の QPS data セクションに表示されます。

  • レーングループ内のすべてのアプリケーションのモニタリングチャートの確認

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

    2. Application QPS Monitoring セクションの右側で、View Traffic Details をクリックして、レーングループ内のすべてのアプリケーションのトラフィックモニタリングチャートを確認します。