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

Microservices Engine:MSE クラウドネイティブゲートウェイを用いたエンドツーエンドカナリアリリースの実装

最終更新日:Mar 11, 2026

複数のマイクロサービスの新バージョンを同時にリリースする場合、本番トラフィックをすべて新バージョンに切り替える前に、それらを統合してテストする必要があります。エンドツーエンドカナリアリリースでは、呼び出しチェーン内のすべてのサービスのカナリアバージョンに対して特定の特性を持つリクエストをルーティングし、通常のトラフィックはベースバージョンを通じて継続的に流れます。サービスにカナリアバージョンが存在しない場合は、トラフィックが自動的にそのベースバージョンにフォールバックします。

Microservices Engine (MSE) は、クラウドネイティブゲートウェイとマイクロサービスガバナンスを組み合わせることで、エンドツーエンドカナリアリリースを実現します。アプリケーションのカナリアバージョン向けに分離されたトラフィックレーンを定義し、ゲートウェイでルーティングルールを設定すると、MSE がこれらのルールを呼び出しチェーン全体に伝播させます。ビジネスコードの変更は一切不要です。

Implementation process

基本概念

概念説明
トラフィックレーン(レーン)同一バージョンのアプリケーション向けに分離された実行環境です。特定のルーティングルールに一致するリクエストのみが、レーン内のタグ付きアプリケーションに到達します。アプリケーションとレーンの間には多対多の関係があります。
レーングループ異なるチームやシナリオを区別するためのレーンのコレクションです。
ベース環境タグなしアプリケーションが実行される環境です。他の環境に対するディザスタリカバリ機能を提供します。
MSE クラウドネイティブゲートウェイKubernetes Ingress と互換性のあるゲートウェイで、Container Service for Kubernetes (ACK) クラスターおよび Nacos インスタンスなど、複数のソースからのサービス検出をサポートします。

サンプル シナリオ

以下の e コマース注文処理のシナリオでは、MSE クラウドネイティブゲートウェイから Spring Cloud バックエンドへのエンドツーエンドカナリアリリースを実証します。

アーキテクチャには、以下の 3 つのアプリケーションが含まれます:

アプリケーション役割ポート
アプリケーション Aトランザクションセンター20001
アプリケーション B商品センター20002
アプリケーション C在庫センター20003

呼び出しチェーンは次のとおりです:クライアント > MSE クラウドネイティブゲートウェイ > A > B > C

サービス検出には MSE Nacos インスタンスを使用します。クライアントおよび HTML を介したバックエンドアプリケーションへのアクセスの両方がサポートされます。

アプリケーション A およびアプリケーション C の新バージョンがリリースされます。本番環境への適用前に、エンドツーエンドカナリアリリースを通じてカナリアバージョンをテストします。アプリケーション B にはカナリアバージョンがないため、引き続きベースバージョンでサービスを提供します。

Scenario diagram

制限事項

前提条件

開始する前に、以下の条件を満たしていることを確認してください。

重要

MSE Java エージェントのバージョンは 3.2.3 以降である必要があります。それより前のバージョンでは問題が発生する可能性があります。

説明 MSE クラウドネイティブゲートウェイは、ACK クラスターまたは MSE Nacos インスタンスと同じ仮想プライベートクラウド(VPC)にデプロイされている必要があります。

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

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

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

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

  4. [名前空間] を選択し、[YAML から作成] をクリックします。

  5. アプリケーション A、アプリケーション B、アプリケーション C の YAML コードを貼り付けます。使用する YAML は、サービスソースに応じて適切なものを選択してください。

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

重要

{nacos server address} を、ご使用の MSE Nacos インスタンスの内部エンドポイントに置き換え、中括弧 {} を削除してください。

YAML コードを表示

# アプリケーション A のベースバージョン
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 のベースバージョン
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 のベースバージョン
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. サービスレジストリとして、自己管理型の Nacos インスタンスをデプロイします。

重要

以下の YAML コードでは、ベースバージョンのエンドポイントを自己管理型の Nacos インスタンスに登録します。

自己管理型 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. アプリケーション A、アプリケーション B、アプリケーション C のベースバージョンをデプロイします。

ベースバージョンの YAML コードを表示(ACK サービスソース)

# アプリケーション A のベースバージョン
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 インスタンスへのアクセス
        env:
        - name: spring.cloud.nacos.discovery.server-addr
          value: nacos-server
        - name: dubbo.registry.address
          value: 'nacos://nacos-server:8848'
---
# アプリケーション B のベースバージョン
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 インスタンスへのアクセス
        env:
        - name: spring.cloud.nacos.discovery.server-addr
          value: nacos-server
        - name: dubbo.registry.address
          value: 'nacos://nacos-server:8848'
---
# アプリケーション C のベースバージョン
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 インスタンスへのアクセス
        env:
        - name: spring.cloud.nacos.discovery.server-addr
          value: nacos-server
        - name: dubbo.registry.address
          value: 'nacos://nacos-server:8848'
  1. ゲートウェイがアプリケーション A にトラフィックをルーティングできるように、アプリケーション A の Kubernetes サービスを作成します。

アプリケーション A のサービスの YAML コードを表示

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:ゲートウェイ経由でのアプリケーション A の公開

MSE クラウドネイティブゲートウェイを構成して、外部トラフィックをアプリケーション A にルーティングします。サービスが既に追加済みかどうかに応じて、以下のいずれかの方法を選択してください。

新しいサービスを追加する場合

アプリケーション A がゲートウェイに追加されていない場合は、まず追加してください。

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

    • ACK クラスターをサービスソースとする場合[サービスソース][Container Service] に、[名前空間][default] に、[サービス][sc-a] に設定します。

    • MSE Nacos インスタンスをサービスソースとする場合[サービスソース][MSE Nacos] に、[名前空間][public] に、[サービス][sc-A] に設定します。

  2. [ルート] タブで、[ルートの追加] をクリックして、[sc-a](または [sc-A])のルートを作成します。詳細については、「ルートの作成」をご参照ください。

    パラメーター
    パス[プレフィックス] を選択し、/a
    ルートポイント[単一サービス]
    バックエンドサービス[sc-A]

既存のサービスを使用する場合

アプリケーション A がすでにインポート済みの場合は、既存のルートを変更します。

  1. MSE コンソールにログインします。左側のナビゲーションウィンドウで、[クラウドネイティブゲートウェイ] > [ゲートウェイ] を選択し、ゲートウェイ名をクリックします。[ルート] タブで、ルートを変更します。

    パラメーター
    パス[プレフィックス] を選択し、/a
    ルートポイント単一サービス
    バックエンドサービス[sc-A]

操作手順 3:ベースバージョンのトラフィックの検証

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

  2. 左側のナビゲーションウィンドウで、[クラウドネイティブゲートウェイ] > [ゲートウェイ] を選択し、ゲートウェイ名をクリックします。

  3. 左側のナビゲーションウィンドウで、[概要] をクリックします。[エンドポイント] タブで、Server Load Balancer (SLB) インスタンスの Ingress IP アドレスを確認します。

  4. 以下のコマンドを実行して、トラフィックがベースバージョンを通過していることを検証します。

# x.x.1.1 を SLB の Ingress IP アドレスに置き換えます
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 にバージョンサフィックスが付いていないことから、すべてのトラフィックがベースバージョンを通過していることが確認できます。

操作手順 4:アプリケーション A およびアプリケーション C のカナリアバージョンのデプロイ

アプリケーション A およびアプリケーション C に新機能の更新が適用されます。アプリケーション B は変更されず、引き続きベースバージョンのみで実行されます。

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

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

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

  4. [名前空間] を選択し、[YAML から作成] をクリックします。

  5. アプリケーション A およびアプリケーション C のカナリアバージョンの YAML コードを貼り付けます。使用する YAML は、サービスソースに応じて適切なものを選択してください。

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

重要

{nacos server address} を、ご使用の MSE Nacos インスタンスの内部エンドポイントに置き換え、中括弧 {} を削除してください。

YAML コードを表示

# アプリケーション A のカナリアバージョン
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 のカナリアバージョン
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 では、alicloud.service.tag: grayspec.template.metadata.labels に追加することで、カナリアノードとベースノードを区別します。

重要

カナリアバージョンのエンドポイントは、自己管理型の Nacos インスタンスに登録されます。

YAML コードを表示

# アプリケーション A のカナリアバージョン
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 インスタンスへのアクセス
        env:
        - name: spring.cloud.nacos.discovery.server-addr
          value: nacos-server
        - name: dubbo.registry.address
          value: 'nacos://nacos-server:8848'

---
# アプリケーション C のカナリアバージョン
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 インスタンスへのアクセス
        env:
        - name: spring.cloud.nacos.discovery.server-addr
          value: nacos-server
        - name: dubbo.registry.address
          value: 'nacos://nacos-server:8848'

操作手順 5:レーングループの作成

レーングループは、カナリアリリースに参加するアプリケーションのセットを定義します。

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

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

  3. [レーングループとレーンの作成] をクリックします。選択したマイクロサービス名前空間に既にレーングループが存在する場合は、[レーングループの作成] をクリックします。

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

    パラメーター
    [レーングループ名]レーングループの名前を入力します
    [Ingress タイプ]MSE Cloud-native Gateway
    [Ingress ゲートウェイ]ターゲットのクラウドネイティブゲートウェイを選択します
    [レーングループアプリケーション]spring-cloud-aspring-cloud-b、およびspring-cloud-c

    Create lane group

作成後、レーングループは [フルリンクグレースケール] ページの [レーングループ] セクションに表示されます。編集するには、編集アイコンをクリックします。

操作手順 6:レーンの作成

レーンは、アプリケーションのカナリアバージョンに特定のトラフィックをルーティングするルーティングルールを定義します。

説明
  • カナリアアプリケーションノードをベースノードと区別するためにタグを付与します。コンテナ環境では、alicloud.service.tag: ${tag}spec.template.metadata.labels に追加します。Elastic Compute Service (ECS) 環境では、Java 起動パラメーター -Dalicloud.service.tag=${tag} を追加します。
  • レーングループ内のすべてのレーンで、レーンのルーティングモードは同一である必要があります。このモードは、最初のレーンを作成するときにのみ設定できます。

イングレスタイプが MSE クラウドネイティブゲートウェイの場合、MSE は以下の 2 つのルーティングモードをサポートします。

ルーティングモード使用タイミング動作
リクエスト内容によるルーティングリクエストの内容(ヘッダー、パラメーター)によってカナリアトラフィックを識別できる場合カナリアリクエストは、呼び出しチェーン全体で同一の環境内に留まります
割合によるルーティングリクエストの内容でカナリアトラフィックを識別できず、システムを変更して識別子を追加できない場合同一のソースからのリクエストが異なるレーンにルーティングされる場合があります

リクエスト内容によるルーティングでレーンを作成する場合

  1. [フルリンクグレースケール] ページ下部で、[最初の分割レーンの作成](既にレーンが存在する場合は [レーンの作成])をクリックします。

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

    パラメーター設定
    [ノードタグの追加]カナリアアプリケーションノードにタグを付与して、ベースノードと区別します
    [レーン情報の入力][レーンタグ] を、このレーンにルーティングされるリクエストのタグ値に設定します。[一致関係の確認] を使用して、予期されるタグ付きノード数を検証します
    [カナリアリリースルールの追加][カナリアリリースモード][コンテンツによるカナリアリリース] に設定します。[カナリアリリース条件][すべての条件を満たす] に設定します。条件を次のように構成します:[パラメータータイプ] = Header[パラメーター] = canary[条件] = ==[値] = gray

カナリアリリース条件

条件効果
[すべての条件を満たす]指定されたすべての条件を満たすトラフィックをルーティングします
[いずれかの条件を満たす]指定された条件のうち少なくとも 1 つを満たすトラフィックをルーティングします

条件演算子

演算子説明
==完全一致。トラフィックの値は、条件の値と完全に一致する必要があります。
!=不一致。トラフィックの値は、条件の値と異なっている必要があります。
in包含一致。トラフィックの値は、指定されたリスト内に存在する必要があります。
割合ハッシュベースの一致。式 hash(get(key)) % 100 < value が成立した場合にトラフィックをルーティングします。
正規表現正規表現による一致。トラフィックの値は、指定されたパターンに一致する必要があります。

割合によるルーティングでレーンを作成する場合

説明 割合によるルーティングには、ack-onepilot のバージョン 3.0.18 以降およびエージェントのバージョン 3.2.3 以降が必要です。
  1. [フルリンクグレースケール] ページ下部で、[最初の分割レーンの作成](既にレーンが存在する場合は [レーンの作成])をクリックします。

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

    パラメーター設定
    [ノードタグの追加]カナリアアプリケーションノードにタグを付与して、ベースノードと区別します
    [レーン情報の入力][レーンタグ] を、このレーンにルーティングされるリクエストのタグ値に設定します。[一致関係の確認] を使用して、予期されるタグ付きノード数を検証します
    [ルーティングおよびカナリアリリースルールの構成][カナリアリリースモード][割合によるカナリアリリース] に設定します。[フロー比率]30 (パーセンテージ) に設定します
説明 各ゲートウェイベースルートに対して異なるトラフィック割合を設定することもできます。この機能を有効化する場合、特定のベースルートについて、すべてのレーングループのトラフィック割合の合計は 100% を超えてはなりません。

レーンの管理

レーンを作成すると、[フルリンクグレースケール] ページの [トラフィック配分] セクションに表示されます。利用可能な操作は以下のとおりです。

操作効果
[有効化]レーンを有効化して、レーンの構成に基づいてトラフィックをルーティングします。条件に一致するトラフィックは、タグ付きアプリケーションバージョンに送信されます。タグ付きバージョンが存在しない場合は、トラフィックがタグなしバージョンにフォールバックします。
[無効化]レーンを無効化します。すべてのトラフィックは、タグなしアプリケーションバージョンにルーティングされます。

また、このページからレーンのトラフィック割合を確認したり、レーン内のアプリケーションのステータスを構成したりすることもできます。

操作手順 7:カナリアトラフィックの検証

リクエスト内容によるルーティングの検証

以下のコマンドを実行して、canary: gray ヘッダーを含むリクエストを送信し、トラフィックがカナリアバージョンを通過していることを検証します。

# x.x.x.x をクラウドネイティブゲートウェイの SLB IP アドレスに置き換えます
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]

アプリケーション A およびアプリケーション C の gray サフィックスにより、カナリアトラフィックがカナリアバージョンに到達していることが確認できます。アプリケーション B にはカナリアバージョンがないため、トラフィックはそのベースバージョンにルーティングされます。

割合によるルーティングの検証

以下の Python スクリプトを実行して、トラフィックの配分をテストします。コード内の x.x.x.x を、クラウドネイティブゲートウェイの SLB IP アドレスに置き換えてください。

pip3 install requests
python3 traffic.py

Python スクリプトを展開して表示

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]
    '''
    print(text)
    app_parts = text.split(' -> ')
    tag_app = app_parts[-1]

    splits = tag_app.split('[')
    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% のリクエストがカナリア環境にルーティングされます。

Percentage routing test result

(任意)カナリアトラフィックの監視

早期に問題を特定するために、以下のいずれかの場所からカナリアトラフィックを監視できます。

クラウドネイティブゲートウェイからの監視

MSE クラウドネイティブゲートウェイの [ルート] ページで、[サービス] タブをクリックします。対象のサービス名をクリックし、[監視] タブでメトリックデータを確認します。

Gateway monitoring

マイクロサービスガバナンスからの監視

[フルリンクグレースケール] ページで、対象のアプリケーションをクリックします。[QPS データ] セクションで、ベースバージョンおよびカナリアバージョンのトラフィックデータを確認します。

メトリクス説明
合計 QPSアプリケーションの 1 秒あたりの合計クエリ数
例外 QPSアプリケーションのエラー発生リクエスト数
GrayQPSカナリアバージョンの 1 秒あたりのクエリ数
Microservices Governance monitoring

Application Real-Time Monitoring Service(ARMS)からの監視

アプリケーションが ARMS に接続されている場合、ARMS コンソールの [シナリオベース分析] ページの [フルリンクグレースケール] タブで、カナリアトラフィックデータを確認できます。このデータを活用して、ロールバックまたは本番環境への完全リリースを判断できます。

ARMS monitoring

次のステップ

  • カナリアバージョンの安定性が確認できた後、ベースデプロイメントを新しいイメージバージョンに更新し、カナリアデプロイメントを削除することで、カナリアバージョンを本番環境に昇格させます。

  • ロールバックを行う場合は、レーンを無効化し、カナリアデプロイメントを削除します。これにより、すべてのトラフィックが自動的にベースバージョンに戻ります。