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

Microservices Engine:MSE クラウドネイティブゲートウェイに基づくエンドツーエンドカナリアリリースの実装

最終更新日:Apr 19, 2025

マイクロサービスのシナリオでは、アプリケーション間の呼び出しはランダムです。デプロイした Spring Cloud アプリケーションまたは Dubbo アプリケーションの新しいバージョンが利用可能な場合、特定の特性を持つトラフィックは、アプリケーションのデスティネーションバージョンにルーティングされない可能性があります。この問題を解決するために、マイクロサービスエンジン (MSE) が提供するエンドツーエンドカナリアリリース機能を使用して、ビジネスコードを変更することなく、エンドツーエンドのトラフィック調整を実装できます。エンドツーエンドカナリアリリース機能を使用すると、レーンを作成し、それらを独立したランタイム環境として使用して、アプリケーションバージョンを分離できます。レーンルールを設定して、ルールに一致するトラフィックをアプリケーションのデスティネーションバージョンにルーティングできます。このトピックでは、MSE クラウドネイティブゲートウェイを設定してエンドツーエンドカナリアリリースを実装する方法について説明します。

実装プロセス

制限事項

  • エンドツーエンドカナリアリリース機能は、マイクロサービスガバナンスによって提供されるタグベースルーティング機能と統合されています。アプリケーションにエンドツーエンドカナリアリリース機能を実装する場合、アプリケーションにカナリアリリースルールとタグベースルーティングルールを設定しないことをお勧めします。

  • Java アプリケーションでのエンドツーエンドカナリアリリース機能の制限事項の詳細については、「マイクロサービスガバナンスでサポートされている Java フレームワーク」をご参照ください。

  • 最新バージョンのエンドツーエンドカナリアリリースを実装するには、MSE クラウドネイティブゲートウェイのバージョンが 2.0.6 以降であることを確認する必要があります。 MSE クラウドネイティブゲートウェイをアップグレードする方法の詳細については、「MSE クラウドネイティブゲートウェイのアップグレード」をご参照ください。

サンプルシナリオ

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

顧客が注文した後、トラフィックは MSE クラウドネイティブゲートウェイに流れ込みます。次に、MSE クラウドネイティブゲートウェイはトランザクションセンター (アプリケーション A) を呼び出し、トランザクションセンター (アプリケーション A) は商品センター (アプリケーション B) を呼び出し、次に商品センター (アプリケーション B) は在庫センター (アプリケーション C) を呼び出します。次の呼び出しプロセスが使用されます。顧客 > MSE クラウドネイティブゲートウェイ > アプリケーション A > アプリケーション B > アプリケーション C。

新しい機能は、ビジネスの反復とともにリリースする必要があります。この例では、アプリケーション A とアプリケーション C の新しいバージョンがリリースされています。アプリケーション A とアプリケーション C の新しいバージョンが正式にリリースされる前に、カナリアリリースを使用して 2 つのアプリケーションで新しいバージョンをテストする必要があります。新しいバージョンが安定していることが証明されたら、アプリケーションのバージョンをリリースできます。

エンドツーエンドカナリアリリース機能は、MSE クラウドネイティブゲートウェイとマイクロサービスガバナンスに基づいて実装されています。ゲートウェイから複数のバックエンドアプリケーションへのエンドツーエンドカナリアリリースを実装できます。このようにして、特定の特性を持つカナリアトラフィックは常にアプリケーションのカナリアバージョンにルーティングできます。これにより、カナリアリリースを使用して複数のアプリケーションのバージョンを同時にテストできます。アプリケーションにカナリアバージョンがない場合、トラフィックはアプリケーションのベースバージョンに自動的にルーティングされます。

使用场景

用語

  • MSE クラウドネイティブゲートウェイ: Kubernetes Ingress と互換性のある次世代ゲートウェイ。 MSE クラウドネイティブゲートウェイは、Container Service for Kubernetes (ACK) や Nacos インスタンスなどの複数のソースに基づくサービスディスカバリをサポートしています。 MSE クラウドネイティブゲートウェイは、セキュリティ保護を提供するために複数のログオン認証方式もサポートしています。

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

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

  • ベース環境: タグ付けされていないアプリケーションが実行される環境。ベース環境は、他の環境にディザスタリカバリを提供します。

準備

ACK クラスタの作成

詳細については、「ACK 専用クラスターの作成 (廃止)」または「ACK マネージドクラスターの作成」をご参照ください。

アプリケーションの MSE マイクロサービスガバナンスを有効にする

重要

MSE Java エージェントのバージョンが 3.2.3 以降であることを確認してください。そうでない場合、ビジネスに悪影響を与える可能性があります。

  1. マイクロサービスガバナンス タブで、マイクロサービスガバナンスプロフェッショナルエディションをアクティブにします。

  2. Container Service for Kubernetes (ACK) クラスタ内のマイクロサービスアプリケーションに対してマイクロサービスガバナンスを有効にします。ビジネス要件に基づいて適切な方法を選択できます。詳細については、「ACK および ACS クラスタ内の Java マイクロサービスアプリケーションのマイクロサービスガバナンスを有効にする」をご参照ください。

MSE クラウドネイティブゲートウェイの作成

詳細については、「MSE クラウドネイティブゲートウェイの作成」をご参照ください。

クラウドネイティブゲートウェイをサービスソースに関連付ける

詳細については、「サービスソースの追加」をご参照ください。

説明
  • MSE クラウドネイティブゲートウェイに基づくエンドツーエンドカナリアリリースは、サービスソースとして ACK クラスタまたは MSE Nacos インスタンスをサポートしています。

  • MSE クラウドネイティブゲートウェイは、ACK クラスタまたは MSE Nacos インスタンスと同じ Virtual Private Cloud (VPC) にデプロイする必要があります。

1. ビジネスアプリケーションのベース環境の構築

ステップ 1: バックエンドアプリケーションのベースバージョンのデプロイ

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

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

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

  4. ページの上部で、クラスターの [名前空間] を選択し、[YAML から作成] をクリックします。

  5. バックエンドアプリケーションのベースバージョンをデプロイします。

    MSE Nacos インスタンスをサービスソースとして使用する

    次の Yet Another Markup Language (YAML) コードをコピーして、アプリケーション A、アプリケーション B、およびアプリケーション C のベースバージョンをデプロイします。

    重要

    コード内の {nacos server address} を、作成した MSE Nacos インスタンスの内部エンドポイントに置き換え、中括弧 {} を削除します。

    YAML コードを表示

    # アプリケーション A のベースバージョンの YAML コード
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: spring-cloud-a
      namespace: default
    spec:
      selector:
        matchLabels:
          app: spring-cloud-a
      template:
        metadata:
          labels:
            app: spring-cloud-a
            msePilotCreateAppName: spring-cloud-a
            msePilotAutoEnable: 'on'
        spec:
          containers:
          - name: spring-cloud-a
            image: registry.cn-hangzhou.aliyuncs.com/mse-governance-demo/spring-cloud-a:3.0.1
            imagePullPolicy: Always
            ports:
              - containerPort: 20001
            livenessProbe:
              tcpSocket:
                port: 20001
              initialDelaySeconds: 30
              periodSeconds: 60
            env:
            - name: spring.cloud.nacos.discovery.server-addr
              value: {nacos server address}
            - name: dubbo.registry.address
              value: 'nacos://{nacos server address}:8848'
    ---
    # アプリケーション B のベースバージョンの YAML コード
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: spring-cloud-b
      namespace: default
    spec:
      selector:
        matchLabels:
          app: spring-cloud-b
      template:
        metadata:
          labels:
            app: spring-cloud-b
            msePilotCreateAppName: spring-cloud-b
            msePilotAutoEnable: 'on'
        spec:
          containers:
          - name: spring-cloud-b
            image: registry.cn-hangzhou.aliyuncs.com/mse-governance-demo/spring-cloud-b:3.0.1
            imagePullPolicy: Always
            ports:
              - containerPort: 20002
            livenessProbe:
              tcpSocket:
                port: 20002
              initialDelaySeconds: 30
              periodSeconds: 60
            env:
            - name: spring.cloud.nacos.discovery.server-addr
              value: {nacos server address}
            - name: dubbo.registry.address
              value: 'nacos://{nacos server address}:8848'
    ---
    # アプリケーション C のベースバージョンの YAML コード
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: spring-cloud-c
      namespace: default
    spec:
      selector:
        matchLabels:
          app: spring-cloud-c
      template:
        metadata:
          labels:
            app: spring-cloud-c
            msePilotCreateAppName: spring-cloud-c
            msePilotAutoEnable: 'on'
        spec:
          containers:
          - name: spring-cloud-c
            image: registry.cn-hangzhou.aliyuncs.com/mse-governance-demo/spring-cloud-c:3.0.1
            imagePullPolicy: Always
            ports:
              - containerPort: 20003
            livenessProbe:
              tcpSocket:
                port: 20003
              initialDelaySeconds: 30
              periodSeconds: 60
            env:
            - name: spring.cloud.nacos.discovery.server-addr
              value: {nacos server address}
            - name: dubbo.registry.address
              value: 'nacos://{nacos server address}:8848'

    ACK クラスタをサービスソースとして使用する

    1. 次の YAML コードをコピーして、MSE Nacos インスタンスをセルフマネージドサービスレジストリとしてデプロイします。

      重要

      YAML コードでは、セルフマネージド Nacos インスタンスに登録されているベースバージョンのエンドポイントが提供されます。

    YAML コードを表示

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: nacos-server
    spec:
      replicas: 1
      selector:
        matchLabels:
          app: nacos-server
      template:
        metadata:
          labels:
            msePilotAutoEnable: "off"
            app: nacos-server
        spec:
          containers:
            - name: nacos-server
              image: 'registry.cn-hangzhou.aliyuncs.com/mse-governance-demo/nacos-server:v2.1.2'
              env:
                - name: MODE
                  value: standalone
                - name: JVM_XMS
                  value: 512M
                - name: JVM_XMX
                  value: 512M
                - name: JVM_XMN
                  value: 256M
              imagePullPolicy: Always
              livenessProbe:
                failureThreshold: 3
                initialDelaySeconds: 15
                periodSeconds: 10
                successThreshold: 1
                tcpSocket:
                  port: 8848
                timeoutSeconds: 3
              readinessProbe:
                failureThreshold: 5
                initialDelaySeconds: 15
                periodSeconds: 15
                successThreshold: 1
                tcpSocket:
                  port: 8848
                timeoutSeconds: 3
              resources:
                requests:
                  cpu: '1'
                  memory: 2Gi
          dnsPolicy: ClusterFirst
          restartPolicy: Always
    
    ---
    apiVersion: v1
    kind: Service
    metadata:
      name: nacos-server
    spec:
      type: ClusterIP
      ports:
        - name: nacos-server-8848-8848
          port: 8848
          protocol: TCP
          targetPort: 8848
        - name: nacos-server-9848-9848
          port: 9848
          protocol: TCP
          targetPort: 9848
      selector:
        app: nacos-server
    1. 次の YAML コードをコピーして、アプリケーション A、アプリケーション B、およびアプリケーション C のベースバージョンをデプロイします。

      YAML コードを表示

      # アプリケーション A のベースバージョンの YAML コード
      apiVersion: apps/v1
      kind: Deployment
      metadata:
        name: spring-cloud-a
        namespace: default
      spec:
        selector:
          matchLabels:
            app: spring-cloud-a
        template:
          metadata:
            labels:
              app: spring-cloud-a
              msePilotCreateAppName: spring-cloud-a
              msePilotAutoEnable: 'on'
          spec:
            containers:
            - name: spring-cloud-a
              image: registry.cn-hangzhou.aliyuncs.com/mse-governance-demo/spring-cloud-a:3.0.1
              imagePullPolicy: Always
              ports:
                - containerPort: 20001
              livenessProbe:
                tcpSocket:
                  port: 20001
                initialDelaySeconds: 30
                periodSeconds: 60
              # Nacos サービスを使用してセルフマネージド Nacos インスタンスにアクセスします。
              env:
              - name: spring.cloud.nacos.discovery.server-addr
                value: nacos-server
              - name: dubbo.registry.address
                value: 'nacos://nacos-server:8848'
      ---
      # アプリケーション B のベースバージョンの YAML コード
      apiVersion: apps/v1
      kind: Deployment
      metadata:
        name: spring-cloud-b
        namespace: default
      spec:
        selector:
          matchLabels:
            app: spring-cloud-b
        template:
          metadata:
            labels:
              app: spring-cloud-b
              msePilotCreateAppName: spring-cloud-b
              msePilotAutoEnable: 'on'
          spec:
            containers:
            - name: spring-cloud-b
              image: registry.cn-hangzhou.aliyuncs.com/mse-governance-demo/spring-cloud-b:3.0.1
              imagePullPolicy: Always
              ports:
                - containerPort: 20002
              livenessProbe:
                tcpSocket:
                  port: 20002
                initialDelaySeconds: 30
                periodSeconds: 60
              # Nacos サービスを使用してセルフマネージド Nacos インスタンスにアクセスします。
              env:
              - name: spring.cloud.nacos.discovery.server-addr
                value: nacos-server
              - name: dubbo.registry.address
                value: 'nacos://nacos-server:8848'
      ---
      # アプリケーション C のベースバージョンの YAML コード
      apiVersion: apps/v1
      kind: Deployment
      metadata:
        name: spring-cloud-c
        namespace: default
      spec:
        selector:
          matchLabels:
            app: spring-cloud-c
        template:
          metadata:
            labels:
              app: spring-cloud-c
              msePilotCreateAppName: spring-cloud-c
              msePilotAutoEnable: 'on'
          spec:
            containers:
            - name: spring-cloud-c
              image: registry.cn-hangzhou.aliyuncs.com/mse-governance-demo/spring-cloud-c:3.0.1
              imagePullPolicy: Always
              ports:
                - containerPort: 20003
              livenessProbe:
                tcpSocket:
                  port: 20003
                initialDelaySeconds: 30
                periodSeconds: 60
              # Nacos サービスを使用してセルフマネージド Nacos インスタンスにアクセスします。
              env:
              - name: spring.cloud.nacos.discovery.server-addr
                value: nacos-server
              - name: dubbo.registry.address
                value: 'nacos://nacos-server:8848'
    2. 次の YAML コードをコピーして、イングレスアプリケーションとして機能するアプリケーション A のサービスを作成します。

      YAML コードを表示

      # アプリケーション A を公開します。
      apiVersion: v1
      kind: Service
      metadata:
        name: sc-a
        namespace: default
      spec:
        ports:
          - port: 20001
            protocol: TCP
            targetPort: 20001
        selector:
          app: spring-cloud-a
        type: ClusterIP

ステップ 2: MSE クラウドネイティブゲートウェイを使用してアプリケーション A を公開する

ケース 1: 新しいサービスを公開する

アプリケーション A をクラウドネイティブゲートウェイに追加していない場合は、次の手順を実行してアプリケーション A を公開します。

  1. MSE コンソール にログインします。左側の[ナビゲーションウィンドウ]で、[クラウドネイティブゲートウェイ] > [ゲートウェイ] を選択します。[ゲートウェイ] ページで、作成したクラウドネイティブゲートウェイの名前をクリックします。左側の[ナビゲーションウィンドウ]で、[ルート] をクリックします。[ルート] ページで、[サービス] タブをクリックします。次に、Add Service をクリックします。詳細については、「サービスの追加」をご参照ください。

    • ACK クラスタをサービスソースとして使用する

      • サービスソース: [コンテナサービス] を選択します。

      • 名前空間: [default] を選択します。

      • サービス: [sc-a] を選択します。

    • MSE Nacos インスタンスをサービスソースとして使用する

      • サービスソース: [MSE Nacos] を選択します。

      • 名前空間: [public] を選択します。

      • サービス: [sc-A] を選択します。

  2. [ルート] ページで、[ルート] タブをクリックします。[ルート] タブで、[ルートの追加] をクリックして sc-a または sc-A のルートを作成し、そのルートを使用してサービスを公開します。詳細については、「ルートを作成する」をご参照ください。

    パラメータ

    説明

    パス

    一致条件ドロップダウンリストから [プレフィックス] を選択し、パスフィールドに /a と入力します。

    ルートポイント

    [単一サービス] を選択します。

    バックエンドサービス

    [sc-A] を選択します。

ケース 2: 既存のサービスを公開する

インポートされたサービスの場合、次の手順を実行してアプリケーション A を公開できます。

MSE コンソール にログインします。左側のナビゲーションウィンドウで、クラウドネイティブゲートウェイ > ゲートウェイ を選択します。[ゲートウェイ] ページで、作成したクラウドネイティブゲートウェイの名前をクリックします。[ルート] ページで、[ルート] タブをクリックします。[ルート] タブで、既存のルートを変更し、そのルートを使用してサービスを公開します。

パラメータ

説明

パス

一致条件ドロップダウンリストから [プレフィックス] を選択し、パスフィールドに /a と入力します。

ルートポイント

[単一サービス] を選択します。

バックエンドサービス

[sc-A] を選択します。

ステップ 3: ベースバージョンのトラフィックのテスト

  1. MSE コンソール にログインします。上部の[ナビゲーションバー]で、リージョンを選択します。

  2. 左側のナビゲーション ウィンドウで、Cloud-Native Gateway > ゲートウェイリスト を選択します。 [ゲートウェイ] ページで、ゲートウェイの名前をクリックします。

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

  4. [エンドポイント] タブで、Server Load Balancer (SLB) インスタンスのイングレス IP アドレスをクエリします。

  5. cURL コマンドを使用して、ベースバージョンのトラフィックをテストします。テスト結果によると、トラフィックはアプリケーション A、アプリケーション B、およびアプリケーション C のベースバージョンを通過します。次のサンプルコードは、構成の例を示しています。

    # テストコマンド
    curl x.x.1.1/a
    
    # テスト結果
    A[10.0.3.178][config=base] -> B[10.0.3.195] -> C[10.0.3.201]

    テスト結果では、アプリケーション B とアプリケーション C の名前の後にバージョン番号は続きません。テスト結果は、トラフィックが 2 つのアプリケーションのベースバージョンを通過することを示しています。

2. ビジネスアプリケーションのカナリア環境の構築

この例では、新機能のリリースにより、アプリケーション A とアプリケーション C の新しいバージョンを同時にリリースする必要があります。エンドツーエンドカナリアリリース機能を使用して、アプリケーション A とアプリケーション C のカナリアバージョンをテストする必要があります。

ステップ 1: バックエンドアプリケーションのカナリアバージョンのデプロイ

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

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

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

  4. ページの上部で、クラスターの [名前空間] を選択し、[YAML から作成] をクリックします。

  5. 次の YAML コードを使用して、アプリケーション A とアプリケーション C のカナリアバージョンをデプロイします。

    MSE Nacos インスタンスをサービスソースとして使用する

    重要

    コード内の {nacos server address} を、作成した MSE Nacos インスタンスの内部エンドポイントに置き換え、中括弧 {} を削除します。

    YAML コードを表示

    # アプリケーション A のカナリアバージョンの YAML コード
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: spring-cloud-a-gray
      namespace: default
    spec:
      selector:
        matchLabels:
          app: spring-cloud-a-gray
      template:
        metadata:
          labels:
            alicloud.service.tag: gray
            app: spring-cloud-a-gray
            msePilotCreateAppName: spring-cloud-a
            msePilotAutoEnable: 'on'
        spec:
          containers:
          - name: spring-cloud-a
            image: registry.cn-hangzhou.aliyuncs.com/mse-governance-demo/spring-cloud-a:3.0.1
            imagePullPolicy: Always
            ports:
              - containerPort: 20001
            livenessProbe:
              tcpSocket:
                port: 20001
              initialDelaySeconds: 30
              periodSeconds: 60
            env:
            - name: spring.cloud.nacos.discovery.server-addr
              value: {nacos server address}
            - name: dubbo.registry.address
              value: 'nacos://{nacos server address}:8848'
    ---
    # アプリケーション C のカナリアバージョンの YAML コード
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: spring-cloud-c-gray
      namespace: default
    spec:
      selector:
        matchLabels:
          app: spring-cloud-c-gray
      template:
        metadata:
          labels:
            alicloud.service.tag: gray
            app: spring-cloud-c-gray
            msePilotCreateAppName: spring-cloud-c
            msePilotAutoEnable: 'on'
        spec:
          containers:
          - name: spring-cloud-c
            image: registry.cn-hangzhou.aliyuncs.com/mse-governance-demo/spring-cloud-c:3.0.1
            imagePullPolicy: Always
            ports:
              - containerPort: 20003
            livenessProbe:
              tcpSocket:
                port: 20003
              initialDelaySeconds: 30
              periodSeconds: 60
            env:
            - name: spring.cloud.nacos.discovery.server-addr
              value: {nacos server address}
            - name: dubbo.registry.address
              value: 'nacos://{nacos server address}:8848'

    ACK クラスタをサービスソースとして使用する

    重要

    YAML コードでは、セルフマネージド Nacos インスタンスに登録されているカナリアバージョンのエンドポイントが提供されます。ベースバージョンの YAML コードと比較して、alicloud.service.tag:gray がカナリアバージョンの YAML コードに追加されています。

    YAML コードを表示

    # アプリケーション A のカナリアバージョンの YAML コード
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: spring-cloud-a-gray
      namespace: default
    spec:
      selector:
        matchLabels:
          app: spring-cloud-a
      template:
        metadata:
          labels:
            alicloud.service.tag: gray
            app: spring-cloud-a
            msePilotCreateAppName: spring-cloud-a
            msePilotAutoEnable: 'on'
        spec:
          containers:
          - name: spring-cloud-a
            image: registry.cn-hangzhou.aliyuncs.com/mse-governance-demo/spring-cloud-a:3.0.1
            imagePullPolicy: Always
            ports:
              - containerPort: 20001
            livenessProbe:
              tcpSocket:
                port: 20001
              initialDelaySeconds: 30
              periodSeconds: 60
            # Nacos サービスを使用してセルフマネージド Nacos インスタンスにアクセスします。
            env:
            - name: spring.cloud.nacos.discovery.server-addr
              value: nacos-server
            - name: dubbo.registry.address
              value: 'nacos://nacos-server:8848'
    
    ---
    # アプリケーション C のカナリアバージョンの YAML コード
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: spring-cloud-c-gray
      namespace: default
    spec:
      selector:
        matchLabels:
          app: spring-cloud-c
      template:
        metadata:
          labels:
            alicloud.service.tag: gray
            app: spring-cloud-c
            msePilotCreateAppName: spring-cloud-c
            msePilotAutoEnable: 'on'
        spec:
          containers:
          - name: spring-cloud-c
            image: registry.cn-hangzhou.aliyuncs.com/mse-governance-demo/spring-cloud-c:3.0.1
            imagePullPolicy: Always
            ports:
              - containerPort: 20003
            livenessProbe:
              tcpSocket:
                port: 20003
              initialDelaySeconds: 30
              periodSeconds: 60
            # Nacos サービスを使用してセルフマネージド Nacos インスタンスにアクセスします。
            env:
            - name: spring.cloud.nacos.discovery.server-addr
              value: nacos-server
            - name: dubbo.registry.address
              value: 'nacos://nacos-server:8848'

ステップ 2: カナリア環境のレーングループを作成する

  1. MSE コンソール にログインし、上部の[ナビゲーションバー]でリージョンを選択します。

  2. 左側のナビゲーション ウィンドウで、[マイクロサービス ガバナンス] > [フルリンク グレースケール] を選択します。

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

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

    パラメータ

    説明

    レーングループ名

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

    イングレスタイプ

    [MSE クラウドネイティブゲートウェイ] を選択します。

    イングレスゲートウェイ

    デスティネーションクラウドネイティブゲートウェイを選択します。

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

    [spring-cloud-a][spring-cloud-b]、および [spring-cloud-c] を選択します。

    创建泳道组.png

    レーングループが作成された後、Full link grayscale ページの Lane Group セクションでレーングループを表示できます。レーングループに関する情報を変更するには、编辑 アイコンをクリックします。

ステップ 3: カナリア環境のレーンを作成する

説明
  • エンドツーエンドカナリアリリース機能を使用する場合、カナリアアプリケーションノードに tag を追加して、他のノードと区別する必要があります。コンテナ環境では、alicloud.service.tag: ${tag}spec.template.metadata.labels に追加する必要があります。Elastic Compute Service (ECS) 環境では、Java 起動パラメータ -Dalicloud.service.tag=${tag} を追加する必要があります。

  • レーングループを作成するときにイングレスタイプに MSE クラウドネイティブゲートウェイを選択した場合、MSE は次のレーンルーティングモードをサポートします。

    • リクエストコンテンツによるルーティング: リクエストコンテンツを使用してカナリアノードを識別できる場合は、このレーンルーティングモードを使用することをお勧めします。リクエストコンテンツを使用してカナリアノードを識別できない場合は、システムの変更を使用してそのような識別子を追加して、カナリアリリースの効果を高めることを強くお勧めします。たとえば、このモードを使用して、カナリアリクエストが同じ環境に確実に渡されるようにすることができます。

    • パーセンテージによるルーティング: リクエストコンテンツを使用してカナリアノードを識別できず、レガシーシステムを変更できない場合は、このモードを使用できます。ただし、このモードを使用すると、同じソースからのリクエストが異なるレーンにあるアプリケーションノードにルーティングされる場合があります。その結果、カナリアリクエストが異なる環境に渡される可能性があります。

  • レーンルーティングモードは、レーングループ内のレーンで同じである必要があります。レーンルーティングモードは、レーングループの最初のレーンを作成するときにのみ変更できます。

  1. [フルリンクグレースケール] ページの下部にある [最初の分割レーンの作成] をクリックします。選択したマイクロサービススペースにレーンが使用可能な場合は、[レーンの作成] をクリックします。

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

    リクエストコンテンツによるルーティングを使用するレーンの作成

    パラメータ

    説明

    [ノードタグの追加]

    カナリアアプリケーションノードに手動でタグを追加して、他のノードと区別します。

    [レーン情報を入力]

    レーンのタグ: レーン内のアプリケーションノードに送信されるリクエストのタグ。

    一致関係の確認: タグ付けされたアプリケーションノードの数が予想どおりであるかどうかを確認できます。

    カナリアリリースルールの追加

    レーン内のアプリケーションノードにリクエストをルーティングするためのルールを指定します。

    • カナリアリリースモード: [コンテンツによるカナリアリリース] を選択します。

    • カナリアリリース条件: [すべての条件を満たす] を選択します。

      この例の構成の詳細:

      • パラメータタイプ: このパラメータをヘッダーに設定します。

      • パラメータ: このパラメータを canary に設定します。

      • 条件: このパラメータを == に設定します。

      • : このパラメータを gray に設定します。

    レーンルーティングモード

    カナリアリリース条件

    効果

    すべての条件を満たす

    すべての条件を満たすトラフィックは、関連するレーンにルーティングされます。

    いずれかの条件を満たす

    次のいずれかの条件を満たすトラフィックは、関連するレーンにルーティングされます。

    条件の説明

    条件

    説明

    エンドツーエンドカナリアリリースの例

    クラウドネイティブゲートウェイリクエストの例

    ==

    完全一致。トラフィック値と条件値が完全に同じ場合、条件は満たされます。

    image.png

    image.png

    !=

    不一致。トラフィック値と条件値が異なる場合、条件は満たされます。

    image.png

    image.png

    in

    包含一致。トラフィック値が指定されたリストに含まれている場合、条件は満たされます。

    image.png

    image.png

    パーセンテージ

    パーセンテージ一致。原則: 'hash(get(キー)) % 100 < ' の場合、条件は満たされます。

    image.png

    image.png

    正規表現一致

    正規表現一致。指定された正規表現ルールに基づいてトラフィック値が一致する場合、条件は満たされます。

    image.png

    image.png

    パーセンテージによるルーティングを使用するレーンの作成

    説明

    パーセンテージによるルーティングを使用するレーンを作成するには、ack-onepilot のバージョンが 3.0.18 以降であり、エージェントのバージョンが 3.2.3 以降であることを確認してください。

    パラメータ

    説明

    [ノードタグの追加]

    カナリアアプリケーションノードに手動でタグを追加して、他のノードと区別します。

    [レーン情報を入力]

    レーンのタグ: レーン内のアプリケーションノードに送信されるリクエストのタグ。

    一致関係の確認: タグ付けされたアプリケーションノードの数が予想どおりであるかどうかを確認できます。

    ルーティングとカナリアリリースルールの設定

    レーン内のアプリケーションノードにリクエストをルーティングするためのルールを指定します。

    • カナリアリリースモード: [比率によるカナリアリリース] を選択します。

    • フロー比率: 30 と入力します。単位: パーセント (%)。

    説明

    各ゲートウェイベースルートに異なるトラフィックのパーセンテージを設定することもできます。この機能を有効にする場合は、すべてのレーングループに設定されているゲートウェイベースルートのトラフィックのパーセンテージの合計が 100% を超えないようにする必要があります。

レーンが作成された後、Full link grayscale ページの [トラフィック分散] セクションでレーンの詳細を表示できます。また、次の操作を実行することもできます。

  • レーンを見つけて [操作] 列の [有効化] をクリックすると、レーンが有効になります。このようにして、トラフィックはレーンの構成に基づいてルーティングされます。ルーティングルールに一致するトラフィックは、タグがレーンに対応するアプリケーションバージョンに優先的にルーティングされます。タグ付けされたアプリケーションバージョンが存在しない場合、トラフィックはタグ付けされていないアプリケーションバージョンにルーティングされます。

  • レーンを見つけて [操作] 列の [無効化] をクリックすると、作成されたレーンが無効になります。アプリケーションのトラフィックは、タグ付けされていないアプリケーションバージョンにルーティングされます。

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

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

ステップ 4: カナリアバージョンのトラフィックのテスト

リクエストコンテンツによるルーティングを使用するレーンのテスト

cURL コマンドを使用して、カナリアトラフィックをテストします。テスト結果では、トラフィックはアプリケーション A とアプリケーション C のカナリアバージョンを通過します。アプリケーション B にはカナリアバージョンがなく、トラフィックはアプリケーション B のベースバージョンに自動的にルーティングされます。

# テストコマンド
curl -H "canary: gray" x.x.x.x/a

# テスト結果
Agray[10.0.3.177][config=base] -> B[10.0.3.195] -> Cgray[10.0.3.180]

パーセンテージによるルーティングを使用するレーンのテスト

次の Python スクリプトを実行して、パーセント値に基づいてルーティングされるリクエストの分散をテストできます。 requests パッケージをインストールし、x.x.x.x をクラウドネイティブゲートウェイに関連付けられている SLB インスタンスの IP アドレスに置き換える必要があります。

Python スクリプトを表示

# pip3 install requests
# python3 traffic.py
import requests


TOTAL_REQUEST = 100
ENTRY_URL = 'http://x.x.x.x/a'

def parse_tag(text:str):
    '''
    A[10.0.23.64][config=base] -> B[10.0.23.65] -> C[10.0.23.61]
    Agray[10.0.23.64][config=base] -> B[10.0.23.65] -> Cgray[10.0.23.61]
    Ablue[10.0.23.64][config=base] -> B[10.0.23.65] -> Cblue[10.0.23.61]
    '''
    print(text)
    app_parts = text.split(' -> ')
    # tag_app: C[10.0.23.61] / Cgray[10.0.23.61]
    tag_app = app_parts[-1]
    
    splits = tag_app.split('[')
    
    # tag_part: C / Cgray
    tag_part = splits[0]
    tag = tag_part[1:]
    return tag if len(tag) > 0 else 'base'

def get_tag(url:str):
    resp = requests.get(url)
    resp.encoding = resp.apparent_encoding
    return parse_tag(resp.text)

def cal_tag_count(url:str, total_request:int):
    count_map = {}
    for i in range(total_request):
        tag = get_tag(url)
        if tag not in count_map:
            count_map[tag] = 1
        else:
            count_map[tag] += 1

    print()
    print('Total Request:', total_request)
    print('Traffic Distribution:', count_map)


if __name__ == '__main__':
    cal_tag_count(ENTRY_URL, TOTAL_REQUEST)

次の結果は、約 30% のリクエストがカナリア環境にルーティングされていることを示しています。

image

(オプション) 3. 可観測性の実装

アプリケーションで問題が発生した場合、MSE コンソールで提供される可観測性機能を使用して異常データを表示できます。これにより、問題を迅速に特定できます。

クラウドネイティブ ゲートウェイの可観測性

MSE クラウドネイティブ ゲートウェイの [ルート] ページで、ルート[サービス] タブをクリックします。Monitor タブで、表示する サービス の名前をクリックします。表示されるページの タブで、各 サービス のメトリックデータを表示します。

基础监控

マイクロサービス ガバナンスの可観測性

MSE マイクロサービス ガバナンスの Full link grayscale ページで、デスティネーション アプリケーション をクリックします。[QPS データ] セクションで、関連レーン のベースバージョン(タグなしバージョン)とカナリアバージョン のトラフィックデータを表示できます。

应用监控

  • 合計 QPS: アプリケーション の合計 QPS です。

  • 例外 QPS: アプリケーション のエラー リクエスト の数です。

  • GrayQPS: アプリケーション のカナリアバージョン の QPS です。

ARMS の可観測性

アプリケーションが Application Real-Time Monitoring Service (ARMS) に接続されている場合は、ARMS コンソールの「シナリオベースの分析」ページの「フルリンク グレースケール」タブでカナリア 環境 のトラフィックデータを表示し、ロールバック を実行するか、リリース プロセス を続行するかを決定できます。

image