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

Microservices Engine:ALBイングレスゲートウェイに基づくエンドツーエンドカナリーリリースの設定

最終更新日:Jan 08, 2025

マイクロサービスアーキテクチャでは、マイクロサービス呼び出し中に複数のマイクロサービスアプリケーションに変更を加える必要がある場合があります。ほとんどの場合、カナリートラフィックを受信するために、各マイクロサービスアプリケーションにカナリー環境またはグループがデプロイされます。アップストリームアプリケーションのカナリー環境からダウンストリームアプリケーションのカナリー環境にトラフィックを流すには、リクエストがカナリー環境を通過するようにする必要があります。この場合、マイクロサービス呼び出しプロセスに含まれる一部のマイクロサービスアプリケーションにそれぞれのカナリー環境がない場合でも、リクエストはダウンストリームアプリケーションのカナリー環境にルーティングできます。Alibaba Cloud Application Load Balancer(ALB)イングレスゲートウェイが提供する柔軟なルーティング機能と、Microservices Engine(MSE)が提供するエンドツーエンドカナリーリリース機能を使用することで、ビジネスコードを変更することなく、前述の要件を満たすことができます。

実装プロセス

注意事項

  • Flannel ネットワークプラグインを使用する場合、ALBイングレスゲートウェイのバックエンドサービスは NodePort または LoadBalancer タイプである必要があります。

  • ALBイングレスゲートウェイの vSwitch は、ACK クラスタと同じ仮想プライベートクラウド(VPC)にデプロイする必要があります。 ALBイングレスゲートウェイでサポートされているリージョンについては、サポートされているリージョンとゾーン をご参照ください。

サンプルシナリオ:ドメイン名ベースのルーティングを使用してエンドツーエンドカナリーリリースを実装する

この例では、アプリケーションアーキテクチャは ALBイングレスゲートウェイと Spring Cloud で構成されています。 Spring Cloud はバックエンドマイクロサービスアーキテクチャです。バックエンドサービスの呼び出しには、トランザクションセンター(アプリケーション A)、商品センター(アプリケーション B)、在庫センター(アプリケーション C)の 3 つのアプリケーションが関係します。クライアントベースまたは HTML ベースのバックエンドサービスへのアクセスがサポートされています。アプリケーション間のサービスディスカバリには Nacos インスタンスが使用されます。

オンラインベース環境とカナリー環境を区別するために、異なるドメイン名を使用できます。カナリー環境には、個別にドメイン名を設定できます。たとえば、www.example.com 宛てのリクエストはカナリー環境にルーティングされ、www.aliyundoc.com 宛てのリクエストはベース環境にルーティングされます。

次の図は、サービス呼び出しプロセスを示しています。サービス呼び出しは、ALBイングレスゲートウェイ > アプリケーション A > アプリケーション B > アプリケーション C の順に開始されます。アプリケーション A は Spring Boot アプリケーションにすることができます。

场景

準備

ACK クラスタを作成する

Kubernetes バージョンが V1.18 以降の ACK クラスタを作成します。詳細については、ACK マネージドクラスタの作成 または ACK 専用クラスタの作成 をご参照ください。

kubectl を使用して ACK クラスタに接続する

kubectl を使用して ACK クラスタに接続します。詳細については、クラスタの kubeconfig ファイルを取得し、kubectl を使用してクラスタに接続する をご参照ください。

ALB Ingress Controller コンポーネントをインストールする

次のいずれかの方法を使用して、ACK クラスタに ALB Ingress Controller コンポーネントをインストールします。

  • ACK クラスタを作成するときに、[ALB Ingress] [ingress][コンポーネント設定] 手順で ALB Ingress Controller コンポーネントをクラスタにインストールします。

  • 既存の ACK クラスタの場合、[アドオン] ページで ALB Ingress Controller コンポーネントをインストールできます。詳細については、コンポーネントの管理 をご参照ください。

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

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

    マイクロサービスガバナンスの請求については、請求の概要 をご参照ください。

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

    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 値は{
        "error": {
          "code": 500,
          "message": "Internal error encountered.",
          "status": "INTERNAL"
        }
      }
      二重引用符(")で囲む必要があります。
              msePilotAutoEnable: "on"
              # アプリケーションが存在する MSE マイクロサービス名前空間。指定した名前空間が存在しない場合は、指定した名前の名前空間が自動的に作成されます。
              mseNamespace: 202401
              # マイクロサービスガバナンスが有効になっているアプリケーションの実際の名前。名前は二重引用符(")で囲む必要があります。
              msePilotCreateAppName: "your-deployment-name"

デモアプリケーションをデプロイする

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

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

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

    この例では、アプリケーション A、B、および C がデプロイされています。各アプリケーションの基本バージョンとカナリーバージョンがデプロイされます。サービスディスカバリを実装するために、nacos-server という名前のアプリケーションがデプロイされます。

    # アプリケーション A のベースバージョンの YAML コード
    ---
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: spring-cloud-a
    spec:
      replicas: 2
      selector:
        matchLabels:
          app: spring-cloud-a
      template:
        metadata:
          labels:
            msePilotCreateAppName: spring-cloud-a
            app: 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
    
    # アプリケーション A のカナリーバージョンの YAML コード
    ---
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: spring-cloud-a-new
    spec:
      replicas: 2
      selector:
        matchLabels:
          app: spring-cloud-a-new
      strategy:
      template:
        metadata:
          labels:
            alicloud.service.tag: gray
            msePilotCreateAppName: spring-cloud-a
            app: spring-cloud-a-new
        spec:
          containers:
          - env:
            - name: JAVA_HOME
              value: /usr/lib/jvm/java-1.8-openjdk/jre
            - name: profiler.micro.service.tag.trace.enable
              value: "true"
            image: registry.cn-hangzhou.aliyuncs.com/mse-governance-demo/spring-cloud-a:3.0.1
            imagePullPolicy: Always
            name: spring-cloud-a-new
            ports:
            - containerPort: 20001
            livenessProbe:
              tcpSocket:
                port: 20001
              initialDelaySeconds: 10
              periodSeconds: 30
    
    # アプリケーション B のベースバージョンの YAML コード
    ---
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: spring-cloud-b
    spec:
      replicas: 2
      selector:
        matchLabels:
          app: spring-cloud-b
      strategy:
      template:
        metadata:
          labels:
            msePilotCreateAppName: spring-cloud-b
            app: 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
    
    # アプリケーション B のカナリーバージョンの YAML コード
    ---
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: spring-cloud-b-new
    spec:
      replicas: 2
      selector:
        matchLabels:
          app: spring-cloud-b-new
      template:
        metadata:
          labels:
            alicloud.service.tag: gray
            msePilotCreateAppName: spring-cloud-b
            app: spring-cloud-b-new
        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-new
            ports:
            - containerPort: 8080
            livenessProbe:
              tcpSocket:
                port: 20002
              initialDelaySeconds: 10
              periodSeconds: 30
    
    # アプリケーション C のベースバージョンの YAML コード
    ---
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: spring-cloud-c
    spec:
      replicas: 2
      selector:
        matchLabels:
          app: spring-cloud-c
      template:
        metadata:
          labels:
            msePilotCreateAppName: spring-cloud-c
            app: 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
    
    # アプリケーション C のカナリーバージョンの YAML コード
    ---
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: spring-cloud-c-new
    spec:
      replicas: 2
      selector:
        matchLabels:
          app: spring-cloud-c-new
      template:
        metadata:
          labels:
            alicloud.service.tag: gray
            msePilotCreateAppName: spring-cloud-c
            app: spring-cloud-c-new
        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-new
            ports:
            - containerPort: 8080
            livenessProbe:
              tcpSocket:
                port: 20003
              initialDelaySeconds: 10
              periodSeconds: 30
    
    # Nacos Server
    ---
    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 サービスの YAML コード
    ---
    apiVersion: v1
    kind: Service
    metadata:
      name: nacos-server
    spec:
      ports:
      - port: 8848
        protocol: TCP
        targetPort: 8848
      selector:
        app: nacos-server
      type: ClusterIP
                    

ネットワーク設定を行う

イングレスアプリケーションとして機能するアプリケーション A に対して、2 つの Kubernetes サービス spring-cloud-a-base と spring-cloud-a-gray を設定します。 spring-cloud-a-base サービスはアプリケーション A のベースバージョンに対応します。 spring-cloud-a-gray サービスはアプリケーション A のカナリーバージョンに対応します。

apiVersion: v1
kind: Service
metadata:
  name: spring-cloud-a-base
spec:
  ports:
    - name: http
      nodePort: 32605
      port: 20001
      protocol: TCP
      targetPort: 20001
  selector:
    app: spring-cloud-a
  sessionAffinity: None
  type: NodePort

---
apiVersion: v1
kind: Service
metadata:
  name: spring-cloud-a-gray
spec:
  ports:
    - name: http
      nodePort: 31622
      port: 20001
      protocol: TCP
      targetPort: 20001
  selector:
    app: spring-cloud-a-new
  sessionAffinity: None
  type: NodePort

手順 1:ALBイングレスゲートウェイのルートを設定する

  1. AlbConfig オブジェクトを作成します。詳細については、AlbConfig オブジェクトの作成 をご参照ください。

    重要

    ALBイングレスゲートウェイの vSwitch がクラスタと同じ VPC にデプロイされていることを確認する必要があります。そうでないと、ビジネスに悪影響を及ぼします。

  2. Ingress を設定します。

    次の内容を gray-ingress.yaml ファイルにコピーします。

    • V1.19 より前の Kubernetes バージョンを実行しているクラスタ

      apiVersion: networking.k8s.io/v1beta1
      kind: Ingress
      metadata:
        name: demo
        namespace: default
      spec:
        ingressClassName: alb
        rules:
          - host: www.aliyundoc.com
            http:
              paths:
                - path: /a
                  backend:
                    serviceName: spring-clud-a-base
                    servicePort: 20001
          - host: www.example.com
            http:
              paths:
                - backend:
                    serviceName: spring-cloud-a-gray
                    servicePort: 20001
                  path: /a
                  pathType: ImplementationSpecific
    • Kubernetes V1.19 以降を実行しているクラスタ

      apiVersion: networking.k8s.io/v1
      kind: Ingress
      metadata:
        name: cafe-ingress
      spec:
        ingressClassName: alb
        rules:
         - host: www.aliyundoc.com
           http:
            paths:
            # コンテキストパスを指定します。
            - path: /a
              pathType: ImplementationSpecific
              backend:
                service:
                  name: spring-clud-a-base
                  port:
                    number: 20001
         - host: www.example.com
           http:
            paths:
            # コンテキストパスを指定します。
            - path: /a
              pathType: ImplementationSpecific
              backend:
                service:
                  name: spring-clud-a-base-gray
                  port:
                    number: 20001
  3. 次のコマンドを実行します。

    kubectl apply -f gray-ingress.yaml

    执行命令出力の ADDRESS に情報が表示されない場合は、次のページに移動してイベントを表示し、このトピックの「準備」セクションに基づいて問題のトラブルシューティングを行います。

手順 2:MSE コンソールでエンドツーエンドカナリーリリース機能を設定する

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

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

  3. [レーン グループとレーンを作成します。] をクリックします。選択したマイクロサービス スペースにレーン グループが既に作成されている場合は、[+ レーン グループを作成] をクリックします。

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

    spring-cloud-a、spring-cloud-b、および spring-cloud-c アプリケーションをレーン グループに追加します。

  5. [フルリンクグレースケール] ページの下部にある [最初の分割レーンの作成] をクリックします。[レーンの作成] パネルで、パラメータを設定し、[gray] タグを選択して、[OK] をクリックします。

手順 3:結果を確認する

  • www.aliyundoc.com 宛てのリクエストをアプリケーションのベースバージョンにルーティングします。

    # テストコマンド
    curl -H"Host:aliyundoc.base.com" http://alb-828vagckg5omzfy49n.cn-beijing.alb.aliyuncs.com/a
    # テスト結果
    A[172.18.XX.XX] -> B[172.18.XX.XX] -> C[172.18.XX.XX]%
  • www.example.com 宛てのリクエストをアプリケーションのカナリーバージョンにルーティングします。

    # テストコマンド
    curl -H"Host:www.example.com" http://alb-828vagckg5omzfy49n.cn-beijing.alb.aliyuncs.com/a
    # テスト結果
    Agray[172.18.XX.XX] -> Bgray[172.18.XX.XX] -> Cgray[172.18.XX.XX]%
説明

上記のコマンドで、alb-828vagckg5omzfy49n.cn-beijing.alb.aliyuncs.com は ALBイングレスゲートウェイのエンドポイントを示します。