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

Microservices Engine:セルフマネージド Spring Cloud または Zuul ゲートウェイに基づくエンドツーエンドカナリアリリースの実装

最終更新日:Jan 08, 2025

Spring Cloud と Zuul ゲートウェイは、マイクロサービスアーキテクチャで一般的に使用される 2 種類の API ゲートウェイです。これらのゲートウェイは、ルート転送やフィルター処理などの機能を実装できます。カナリアバージョンへのリクエストをルーティングするようにルーティングルールを設定して、カナリアバージョンの検証とテストを行うことができます。マイクロサービスエンジン(MSE)は、ビジネスコードを変更することなくエンドツーエンドのトラフィック調整を実装できるエンドツーエンドのカナリアリリース機能を提供します。このトピックでは、Spring Cloud または Zuul ゲートウェイに基づいてエンドツーエンドのカナリアリリースを実装する方法について説明します。

前提条件

背景情報

このトピックでは、シミュレートされた呼び出しプロセスを使用して、MSE を使用してマイクロサービスアプリケーションのエンドツーエンドカナリアリリースを実装する方法について説明します。エンドツーエンドのカナリアリリースを実装するには、アプリケーションコードを変更することなく、イングレスアプリケーションのカナリアトラフィックルールを設定するだけで済みます。このようにして、指定されたトラフィックルールに一致するトラフィックは、バージョンのタグに基づいてカナリアバージョンに直接渡されます。アプリケーションが呼び出されると、カナリアトラフィックルールに一致するトラフィックは、優先的にアプリケーションのカナリアバージョンにルーティングされます。アプリケーションにカナリアバージョンがない場合、トラフィックはアプリケーションの基本バージョンまたは安定バージョンにルーティングされます。

この例では、spring-cloud-gateway、spring-cloud-a、spring-cloud-b、spring-cloud-c というビジネスアプリケーションがデプロイされています。 nacos-server アプリケーションはレジストリとしてデプロイされています。ビジネスアプリケーションは、spring-cloud-gateway -> spring-cloud-a -> spring-cloud-b -> spring-cloud-c の順序で呼び出されます。

アプリケーション呼び出しには、Spring Cloud サービス呼び出しと Dubbo サービス呼び出しが含まれます。

エンドツーエンドのカナリアリリース機能は、トラフィックタギングを提供します。タグ付けされたカナリアトラフィックは、優先的にカナリアノードに送信されます。これにより、制御可能な方法でカナリアリリースを実行し、安定性を確保できます。

エンドツーエンドのカナリアリリースには、一般的に次のポリシーが使用されます。

  • オンライン トラフィックのごく一部にタグが付けられ、カナリア ノードに送信されます。

  • オンライン トラフィックは、特定のルールに基づいてフィルタリングされます。たとえば、指定されたヘッダーまたは Cookie を持つリクエストのオンライン トラフィックは、カナリア ノードに送信されます。

このトピックでは、マイクロサービス アーキテクチャのさまざまなカナリア リリース要件を満たすために、上記のポリシーを設定する方法について説明します。

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

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

ACK 名前空間内のアプリケーションに対してマイクロサービス ガバナンスを有効にする

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

  2. 左側のナビゲーションペインで、Microservices Governance > Application Governance を選択します。

  3. Application list ページで、ACK Application Access をクリックします。

  4. ACK Application Access ダイアログボックスで、パラメーターを設定し、OK をクリックします。

    image

    パラメーター

    説明

    Cluster type

    ACK ClusterACK Serverless Cluster、または ACS Cluster を選択します。

    説明

    クラスターに MSE を呼び出す権限を付与していない場合は、リンク をクリックして承認を実行する必要があります。

    Cluster Name/ID

    マイクロサービス ガバナンスを有効にするクラスターの名前または ID を選択します。キーワードを使用してクラスター名または ID を検索できます。

    ack-onepilot

    ack-onepilot コンポーネントのステータスを表示します。

    • ack-onepilot コンポーネントがインストールされていない場合は、ack-onepilot の右側にある Click Install をクリックします。インストールが完了すると、ack-onepilot コンポーネントのステータスは インストール済み と表示されます。

    • RAM ユーザーとして操作を実行し、操作を実行する権限がないことを示すメッセージが表示された場合は、ACK コンソール にログインして目的のクラスターにアクセスし、[操作] > [アドオン] を選択します。次に、ack-onepilot を見つけて [インストール] をクリックします。

    説明
    • この手順では、ack-onepilot コンポーネントが関係しています。ACK コンソール にログインして宛先クラスターにアクセスし、[操作] > [アドオン] を選択して、コンポーネントの詳細を表示できます。

    • ack-onepilot コンポーネントがインストールされると、エージェントが自動的に挿入されます。この場合、アプリケーションの起動時間が最大 10 秒長くなる可能性があります。

    Access Type

    [名前空間アクセス] を選択します。

    ACK Cluster Namespace

    ACK クラスター名前空間を選択します。

    Microservices Governance Namespace

    マイクロサービス ガバナンス名前空間を選択します。次に、既存のアプリケーションを再デプロイするか、関連付けられたマイクロサービス名前空間にアプリケーションを作成します。これにより、アプリケーションに対してマイクロサービス ガバナンスが有効になります。

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

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

  2. 左側のナビゲーションペインで、Microservices Governance > Application Governance を選択します。

  3. Application list ページで、ACK Application Access をクリックします。

  4. ACK Application Access ダイアログボックスで、パラメーターを設定し、OK をクリックします。

    image

    パラメーター

    説明

    Cluster type

    ACK ClusterACK Serverless Cluster、または ACS Cluster を選択します。

    説明

    クラスターに MSE を呼び出す権限を付与していない場合は、リンク をクリックして承認を実行する必要があります。

    Cluster Name/ID

    マイクロサービス ガバナンスを有効にするクラスターの名前または ID を選択します。キーワードを使用してクラスター名または ID を検索できます。

    ack-onepilot

    ack-onepilot コンポーネントのステータスを表示します。

    • ack-onepilot コンポーネントがインストールされていない場合は、ack-onepilot の右側にある Click Install をクリックします。インストールが完了すると、ack-onepilot コンポーネントのステータスは インストール済み と表示されます。

    • RAM ユーザーとして操作を実行し、操作を実行する権限がないことを示すメッセージが表示された場合は、ACK コンソール にログインして目的のクラスターにアクセスし、[操作] > [アドオン] を選択します。次に、ack-onepilot を見つけて [インストール] をクリックします。

    説明
    • この手順では、ack-onepilot コンポーネントが関係しています。ACK コンソール にログインして宛先クラスターにアクセスし、[操作] > [アドオン] を選択して、コンポーネントの詳細を表示できます。

    • ack-onepilot コンポーネントがインストールされると、エージェントが自動的に挿入されます。この場合、アプリケーションの起動時間が最大 10 秒長くなる可能性があります。

    Access Type

    Single Application Access を選択します。

    Access Procedure

    次の手順を実行します。

    Step 1: Go to the ACK console, and click the cluster name. In the left-side navigation pane of the page that appears, choose Workloads > Deployments. Then, select the namespace to which the application belongs.

    Step 2: Click the name of the connected application. On the page that appears, click View in YAML.

    Step 3: Edit the labels field in the following format and click Update.

    spec:
      template:
        metadata:
          labels:
            # on 値は、マイクロサービス ガバナンスが有効になっていることを示します。 on 値は二重引用符( "")で囲む必要があります。
            msePilotAutoEnable: "on"
            # アプリケーションが存在する MSE マイクロサービス名前空間。指定した名前空間が存在しない場合は、指定した名前の名前空間が自動的に作成されます。
            mseNamespace: 202401
            # マイクロサービス ガバナンスが有効になっているアプリケーションの実際の名前。名前は二重引用符( "")で囲む必要があります。
            msePilotCreateAppName: "your-deployment-name"

ステップ 2: シミュレーション用のアプリケーションをデプロイする

  1. ACK コンソール にログインします。左側のナビゲーションペインで、[クラスター] をクリックします。

  2. [クラスター] ページで、管理するクラスターを見つけ、その名前をクリックします。左側のペインで、[ワークロード] > [デプロイメント] を選択します。

  3. [デプロイメント] ページで、[名前空間] を選択し、[YAML から作成] をクリックします。

    この例では、nacos-server アプリケーションがレジストリとしてデプロイされ、spring-cloud-gateway、spring-cloud-a、spring-cloud-b、および spring-cloud-c がビジネスアプリケーションとしてデプロイされます。このデモのソースコードは、alibabacloud-microservice-demo から入手できます。

    • nacos-server アプリケーションの YAML (Yet Another Markup Language) コード

      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
    • spring-cloud-c アプリケーションの YAML コード

      YAML コードを表示

      # Source: mse-simple-demo/templates/spring-cloud-c-deployment.yaml
      # 出典: mse-simple-demo/templates/spring-cloud-c-deployment.yaml
      apiVersion: apps/v1
      kind: Deployment
      metadata:
        name: spring-cloud-c
      spec:
        replicas: 1
        selector:
          matchLabels:
            app: spring-cloud-c
        template:
          metadata:
            labels:
              msePilotAutoEnable: "on"
              msePilotCreateAppName: "spring-cloud-c"
              app: "spring-cloud-c"
          spec:
            containers:
              - name: spring-cloud-c
                image: "registry.cn-hangzhou.aliyuncs.com/mse-governance-demo/spring-cloud-c:3.0.1"
                imagePullPolicy: Always
                env:
                  - name: nacos.host
                    value: "nacos-server"
                  - name: nacos.namespace
                    value: "public"
                resources:
                  requests:
                    cpu: 1
                    memory: 2Gi
                  limits:
                    cpu: 1
                    memory: 2Gi
                ports:
                - name: http-port
                  containerPort: 20003
            affinity:
              podAntiAffinity:
                preferredDuringSchedulingIgnoredDuringExecution:
                  - podAffinityTerm:
                      topologyKey: failure-domain.beta.kubernetes.io/zone
                    weight: 50
                  - podAffinityTerm:
                      topologyKey: kubernetes.io/hostname
                    weight: 100
    • spring-cloud-b アプリケーションの YAML コード

      YAML コードを表示

      # Source: mse-simple-demo/templates/spring-cloud-b-deployment.yaml
      # 出典: mse-simple-demo/templates/spring-cloud-b-deployment.yaml
      apiVersion: apps/v1
      kind: Deployment
      metadata:
        name: spring-cloud-b
      spec:
        replicas: 1
        selector:
          matchLabels:
            app: spring-cloud-b
        template:
          metadata:
            labels:
              msePilotAutoEnable: "on"
              msePilotCreateAppName: "spring-cloud-b"
              app: "spring-cloud-b"
          spec:
            containers:
              - name: spring-cloud-b
                image: "registry.cn-hangzhou.aliyuncs.com/mse-governance-demo/spring-cloud-b:3.0.1"
                imagePullPolicy: Always
                env:
                  - name: nacos.host
                    value: "nacos-server"
                  - name: nacos.namespace
                    value: "public"
                resources:
                  requests:
                    cpu: 1
                    memory: 2Gi
                  limits:
                    cpu: 1
                    memory: 2Gi
                ports:
                  - name: http-port
                    containerPort: 20002
            affinity:
              podAntiAffinity:
                preferredDuringSchedulingIgnoredDuringExecution:
                  - podAffinityTerm:
                      topologyKey: failure-domain.beta.kubernetes.io/zone
                    weight: 50
                  - podAffinityTerm:
                      topologyKey: kubernetes.io/hostname
                    weight: 100
    • spring-cloud-a アプリケーションの YAML コード

      YAML コードを表示

      # Source: mse-simple-demo/templates/spring-cloud-a-deployment.yaml
      # 出典: mse-simple-demo/templates/spring-cloud-a-deployment.yaml
      apiVersion: apps/v1
      kind: Deployment
      metadata:
        name: spring-cloud-a
      spec:
        replicas: 1
        selector:
          matchLabels:
            app: spring-cloud-a
        template:
          metadata:
            labels:
              msePilotAutoEnable: "on"
              msePilotCreateAppName: "spring-cloud-a"
              app: "spring-cloud-a"
          spec:
            containers:
              - name: spring-cloud-a
                image: "registry.cn-hangzhou.aliyuncs.com/mse-governance-demo/spring-cloud-a:3.0.1"
                imagePullPolicy: Always
                env:
                  - name: nacos.host
                    value: "nacos-server"
                  - name: nacos.namespace
                    value: "public"
                resources:
                  requests:
                    cpu: 1
                    memory: 2Gi
                  limits:
                    cpu: 1
                    memory: 2Gi
                ports:
                  - name: http-port
                    containerPort: 20001
            affinity:
              podAntiAffinity:
                preferredDuringSchedulingIgnoredDuringExecution:
                  - podAffinityTerm:
                      topologyKey: failure-domain.beta.kubernetes.io/zone
                    weight: 50
                  - podAffinityTerm:
                      topologyKey: kubernetes.io/hostname
                    weight: 100
    • spring-cloud-gateway アプリケーションの YAML コード

      YAML コードを表示

      # Source: mse-simple-demo/templates/spring-cloud-gateway-deployment.yaml
      # 出典: mse-simple-demo/templates/spring-cloud-gateway-deployment.yaml
      apiVersion: apps/v1
      kind: Deployment
      metadata:
        name: spring-cloud-gateway
      spec:
        replicas: 1
        selector:
          matchLabels:
            app: spring-cloud-gateway
        template:
          metadata:
            labels:
              msePilotAutoEnable: "on"
              msePilotCreateAppName: "spring-cloud-gateway"
              app: spring-cloud-gateway
          spec:
            containers:
              - image: "registry.cn-hangzhou.aliyuncs.com/mse-governance-demo/spring-cloud-gateway:3.0.1"
                imagePullPolicy: Always
                env:
                  - name: nacos.host
                    value: "nacos-server"
                  - name: nacos.namespace
                    value: "public"
                  - name: enable.auto
                    value: "true"
                  - name: enable.rpc.invoke
                    value: "true"
                  - name: enable.sql
                    value: "false"
                  - name: enable.sentinel.demo.flow
                    value: "true"
                name: "spring-cloud-gateway"
                resources:
                  requests:
                    cpu: 1
                    memory: 2Gi
                  limits:
                    cpu: 1
                    memory: 2Gi
                ports:
                  - containerPort: 20000
            affinity:
              podAntiAffinity:
                preferredDuringSchedulingIgnoredDuringExecution:
                  - podAffinityTerm:
                      topologyKey: failure-domain.beta.kubernetes.io/zone
                    weight: 50
                  - podAffinityTerm:
                      topologyKey: kubernetes.io/hostname
                    weight: 100
      ---
      # Source: mse-simple-demo/templates/spring-cloud-gateway-service.yaml
      # 出典: mse-simple-demo/templates/spring-cloud-gateway-service.yaml
      apiVersion: v1
      kind: Service
      metadata:
        annotations:
          service.beta.kubernetes.io/alibaba-cloud-loadbalancer-spec: slb.s1.small
          service.beta.kubernetes.io/alicloud-loadbalancer-address-type: internet
        name: spring-cloud-gateway-slb
      spec:
        ports:
          - port: 80
            protocol: TCP
            targetPort: 20000
        selector:
          app: spring-cloud-gateway
        type: LoadBalancer

    デプロイ結果をクエリするには、次のコマンドを実行します。

    kubectl get svc,deploy

    予想される出力:

    NAME                               TYPE           CLUSTER-IP   EXTERNAL-IP  PORT(S)             AGE
    service/kubernetes                 ClusterIP      172.16.x.x   <none>       443/TCP             23h
    service/nacos-server               ClusterIP      172.16.x.x   <none>       8848/TCP,9848/TCP   94s
    service/spring-cloud-gateway-slb   LoadBalancer   172.16.x.x   8.130.x.x    80:32641/TCP        57s
    
    NAME                                   READY   UP-TO-DATE   AVAILABLE   AGE
    deployment.apps/nacos-server           1/1     1            1           94s
    deployment.apps/spring-cloud-a         1/1     1            1           66s
    deployment.apps/spring-cloud-b         1/1     1            1           74s
    deployment.apps/spring-cloud-c         1/1     1            1           83s
    deployment.apps/spring-cloud-gateway   1/1     1            1           57s

ステップ 3:spring-cloud-c と spring-cloud-a のカナリアバージョンをデプロイする

  1. ACK コンソール にログインします。 次の YAML コードを使用して、spring-cloud-c アプリケーションのカナリアバージョンをデプロイします。

    YAML コードを表示

    # Source: mse-simple-demo/templates/spring-cloud-c-gray-deployment.yaml
    # ソース:mse-simple-demo/templates/spring-cloud-c-gray-deployment.yaml
    
  2. 次の YAML コードを使用して、spring-cloud-a アプリケーションのカナリアバージョンをデプロイします。

    YAML コードを表示

    # Source: mse-simple-demo/templates/spring-cloud-a-gray-deployment.yaml
    # ソース:mse-simple-demo/templates/spring-cloud-a-gray-deployment.yaml
    

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

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

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

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

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

    パラメーター

    説明

    レーン グループ名

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

    イングレス タイプ

    Java マイクロサービス ゲートウェイ を選択します。

    レーン グループ トラフィック エントリ

    spring-cloud-gateway を選択します。

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

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

    レーン グループが作成されると、[フルリンク グレー スケール] ページの [レーン グループ] セクションにレーン グループが表示されます。レーン グループに関する情報を変更するには、编辑 アイコンをクリックして情報を編集します。

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

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

  • イングレストイプに Java マイクロサービスゲートウェイを選択した場合、MSE は次のレーンルーティングモードをサポートします。

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

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

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

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

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

パラメータ

説明

ノードタグを追加

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

レーン情報を入力

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

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

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

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

  • パス:このパラメータを空のままにすると、すべてのパスが一致とみなされます。

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

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

説明

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

リクエストコンテンツによるルーティング

パラメータ

説明

ノードタグを追加

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

レーン情報を入力

レーンのタグ:レーン内のアプリケーションノードに送信されるリクエストのタグ。この例では、gray がレーンのタグとして使用されます。

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

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

ルーティングルールの条件を設定します。

  • パス パラメータの値を入力します。このパラメータを設定しない場合、すべてのパスが一致とみなされます。

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

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

    この例では、パラメータタイプは name に設定され、値は xiaoming に設定されています。設定例:

    • パラメータタイプ:パラメータを選択します。

    • パラメータ:name と入力します。

    • 条件:== を選択します。

    • :xiaoming と入力します。

パーセンテージによるルーティング
重要

MSE Java エージェントのバージョンが 3.2.3 以降であることを確認してください。そうでない場合、パーセンテージベースのカナリアリリース機能に悪影響を及ぼします。

パラメータ

説明

ノードタグを追加

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

レーン情報を入力

レーンのタグ:レーン内のアプリケーションノードに送信されるリクエストのタグ。この例では、gray がレーンのタグとして使用されます。

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

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

ルーティングルールの条件を設定します。

  • パス:このパラメータを空のままにすると、すべてのパスが一致とみなされます。

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

  • フロー比率:30% と入力します。

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

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

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

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

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

ステップ 6:トラフィックルーティングのテスト

リクエストコンテンツによるルーティング
  1. 次の curl コマンドを実行して、ベースバージョンにルーティングされるトラフィックをテストします。

    curl 8.130.x.x/A/a
    A[192.168.x.x][config=base] -> B[192.168.x.x] -> C[192.168.x.x]
    説明

    上記のコマンドで、8.130.x.x は spring-cloud-gateway アプリケーションによって公開されているパブリック IP アドレスです。

  2. 次の curl コマンドを実行して、カナリーバージョンにルーティングされるトラフィックをテストします。

    curl 8.130.x.x/A/a?name=xiaoming
    Agray[192.168.x.x][config=base] -> B[192.168.x.x] -> Cgray[192.168.x.x]
    説明
    • リクエストに name=xiaoming が含まれている場合、リクエストはカナリーバージョンに渡されます。

    • たとえば、カナリータグ付きのリクエストが spring-cloud-a と spring-cloud-c に送信された場合、リクエストは 2 つのアプリケーションのカナリーノードにルーティングされます。

    • リクエストが spring-cloud-b に送信された場合、このアプリケーションで使用可能なカナリーノードがないため、リクエストは引き続きアプリケーションのベースノードに送信されます。

パーセンテージによるルーティング

次の Python3 スクリプトを使用して、カナリーバージョンにルーティングされるトラフィックの割合をテストします。テストを実行する前に、requests パッケージをインストールする必要があります。x.x.x.x を、spring-cloud-gateway に関連付けられているイングレスサーバーロードバランサー(SLB)インスタンスの IP アドレスに置き換えます。

# pip3 install requests
# python3 traffic.py
import requests

TOTAL_REQUEST = 100
ENTRY_URL = 'http://x.x.x.x/A/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.png

ステップ 7:可観測性の実装

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

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

MSEマイクロサービスガバナンスの[フルリンクグレースケール] ページで、宛先アプリケーションをクリックします。[アプリケーション QPS モニタリング] セクションで、関連レーンのベースバージョンとカナリアバージョンのトラフィックデータを表示できます。

image

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

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

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

参考資料