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

Alibaba Cloud Service Mesh:ASM を使用して TCP トラフィックを移行する

最終更新日:Jan 13, 2025

ネットワークトポロジの最適化、アプリケーションサーバーのスケールアウト、またはユーザートラフィックの調整を行う場合は、サービスメッシュ(ASM)コンソールのトラフィック管理センターを使用して、TCP トラフィックをスムーズに移行できます。これにより、ビジネスの継続性とサービスの高可用性を確保できます。このトピックでは、Istio の TCP トラフィックシフトの例に基づいて、アプリケーションのあるバージョンから別のバージョンに TCP トラフィックを移行する方法について説明します。この例では、tcp-echo という名前のアプリケーションには、v1 と v2 の 2 つのバージョンがあります。バージョン v1 では、アプリケーションはレスポンスを返す前に、レスポンスのタイムスタンプにプレフィックス「one」を追加します。バージョン v2 では、アプリケーションはレスポンスを返す前に、レスポンスのタイムスタンプにプレフィックス「two」を追加します。このようにして、トラフィック移行の結果に基づいてトラフィック分割ポリシーを調整し、特定のビジネス要件とパフォーマンス目標を満たすことができます。

前提条件

手順 1:サンプルアプリケーションの 2 つのバージョンをデプロイする

  1. tcp-echo アプリケーションの 2 つのバージョンをデプロイします。

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

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

    3. [デプロイメント] ページの上部にある [名前空間] ドロップダウンリストから、tcp-echo アプリケーションの 2 つのバージョンをデプロイする名前空間を選択し、右上隅にある [YAML から作成] をクリックします。

    4. カスタム[サンプルテンプレート] ドロップダウンリストから テンプレート作成 を選択し、次の YAML コードを コードエディターにコピーして、 をクリックします。

      YAML コードを表示

      apiVersion: apps/v1
      kind: Deployment
      metadata:
        name: tcp-echo-v1
      spec:
        replicas: 1
        selector:
          matchLabels:
            app: tcp-echo
            version: v1
        template:
          metadata:
            labels:
              app: tcp-echo
              version: v1
          spec:
            containers:
            - name: tcp-echo
              image: docker.io/istio/tcp-echo-server:1.1
              imagePullPolicy: IfNotPresent
              args: [ "9000", "one" ]  // ポート 9000、プレフィックス "one" を指定
              ports:
              - containerPort: 9000
      ---
      apiVersion: apps/v1
      kind: Deployment
      metadata:
        name: tcp-echo-v2
      spec:
        replicas: 1
        selector:
          matchLabels:
            app: tcp-echo
            version: v2
        template:
          metadata:
            labels:
              app: tcp-echo
              version: v2
          spec:
            containers:
            - name: tcp-echo
              image: docker.io/istio/tcp-echo-server:1.1
              imagePullPolicy: IfNotPresent
              args: [ "9000", "two" ]  // ポート 9000、プレフィックス "two" を指定
              ports:
              - containerPort: 9000

      [デプロイメント] ページに戻ります。これで、tcp-echo アプリケーションの 2 つのバージョンが表示されます。

  2. tcp-echo という名前のサービスを作成し、サービスを公開します。

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

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

    3. [サービス] ページの上部にある [名前空間] ドロップダウンリストから、サービスを作成する名前空間を選択し、右上隅にある [作成] をクリックします。

    4. [サービスの作成] ダイアログボックスで、次のパラメータを設定し、[OK] をクリックします。

      パラメータ

      説明

      [名前]

      サービスの名前。この例では、名前は tcp-echo に設定されています。

      [サービスの種類]

      サービスを公開する方法を指定するサービスの種類。有効な値:[クラスタ IP][ノードポート][サーバーロードバランサー]

      説明

      [ヘッドレスサービス] チェックボックスは、[サービスの種類] パラメータを [クラスタ IP] に設定した場合にのみ表示されます。このチェックボックスをオンにすると、Kubernetes のサービスディスカバリの実装に縛られることなく、ヘッドレスサービスを使用して他のサービスディスカバリメカニズムと連携できます。

      [バックエンド]

      サービスに関連付けるデプロイメント。この例では、[名前] パラメータは app に設定され、[値] パラメータは tcp-echo-v1 に設定されています。

      説明

      サービスは、関連付けられたデプロイメントの app ラベルをセレクタとして使用して、トラフィックをルーティングするデプロイメントを決定します。 tcp-echo-v1 デプロイメントと tcp-echo-v2 デプロイメントは、同じ app ラベル(app:tcp-echo)を共有します。したがって、サービスは 2 つのデプロイメントのいずれか一方に関連付けることができます。

      [外部トラフィックポリシー]

      [ローカル] または [クラスタ] を選択できます。

      説明

      [外部トラフィックポリシー] パラメータは、サービスの種類を [ノードポート] または [サーバーロードバランサー] に設定した場合にのみ表示されます。

      [ポートマッピング]

      この例では、[名前] パラメータは tcp に設定され、[サービスポート][コンテナポート] パラメータは 9000 に設定され、[プロトコル] パラメータは [TCP] に設定されています。

      [アノテーション]

      サービスにアノテーションを追加して、ロードバランシングを設定できます。たとえば、service.beta.kubernetes.io/alicloud-loadbalancer-bandwidth:20 アノテーションは、サービスの最大帯域幅を 20 Mbit/s に指定します。これは、サービスを通過するトラフィック量を制限します。このパラメータの詳細については、「アノテーションを使用して CLB インスタンスを設定する」をご参照ください。

      [ラベル]

      サービスを識別するために、サービスに 1 つ以上のラベルを追加できます。

      tcp-echo サービスが作成されると、[サービス] ページにサービスが表示されます。

手順 2:ルーティングルールを設定する

ASM インスタンスの Istio ゲートウェイ、仮想サービス、および宛先ルールを作成して、すべてのトラフィックを tcp-echo アプリケーションのバージョン v1 にルーティングできます。

  1. ASM コンソールにログインします。左側のナビゲーションペインで、[サービスメッシュ] > [メッシュ管理] を選択します。

  2. [メッシュ管理] ページで、設定する ASM インスタンスを見つけます。[管理] 列で、ASM インスタンスの名前をクリックするか、[アクション] をクリックします。

  3. Istio ゲートウェイを作成します。

    1. ASM インスタンスの詳細ページで、左側のナビゲーションペインの [ASM ゲートウェイ] > [ゲートウェイ] を選択します。表示されるページで、[YAML から作成] をクリックします。

    2. [作成] ページで、既定[名前空間] ドロップダウンリストから テンプレート作成 を選択し、 ドロップダウンリストからテンプレートを選択し、次の YAML コードを YAML コードエディターにコピーして、 をクリックします。

      apiVersion: networking.istio.io/v1alpha3
      kind: Gateway
      metadata:
        name: tcp-echo-gateway
      spec:
        selector:
          istio: ingressgateway
        servers:
        - port:
            number: 31400
            name: tcp
            protocol: TCP
          hosts:
          - "*"
  4. 仮想サービスを作成します。

    1. ASM インスタンスの詳細ページで、左側のナビゲーションペインの [トラフィック管理センター] > [virtualservice] を選択します。表示されるページで、[YAML から作成] をクリックします。

    2. [作成] ページで、既定[名前空間] ドロップダウンリストから テンプレート作成 を選択し、 ドロップダウンリストからテンプレートを選択し、次の YAML コードを YAML コードエディターにコピーして、 をクリックします。

      apiVersion: networking.istio.io/v1alpha3
      kind: VirtualService
      metadata:
        name: tcp-echo
      spec:
        hosts:
        - "*"
        gateways:
        - tcp-echo-gateway
        tcp:
        - match:
          - port: 31400  // ポート 31400 に一致
          route:
          - destination:
              host: tcp-echo
              port:
                number: 9000
              subset: v1  // v1 サブセットにルーティング
  5. 宛先ルールを作成します。

    1. ASM インスタンスの詳細ページで、左側のナビゲーションペインの [トラフィック管理センター] > [destinationrule] を選択します。表示されるページで、[YAML から作成] をクリックします。

    2. [作成] ページで、[名前空間] ドロップダウンリストから [default] を選択し、[テンプレート] ドロップダウンリストからテンプレートを選択し、次の YAML コードを YAML コードエディターにコピーして、[作成] をクリックします。

      apiVersion: networking.istio.io/v1alpha3
      kind: DestinationRule
      metadata:
        name: tcp-echo-destination
      spec:
        host: tcp-echo
        subsets:
        - name: v1  // v1 サブセットを定義
          labels:
            version: v1
        - name: v2  // v2 サブセットを定義
          labels:
            version: v2

手順 3:イングレスゲートウェイをデプロイする

イングレスゲートウェイにポート 31400 を追加し、ポートを Istio ゲートウェイのポート 31400 にマップします。

  1. ASM コンソールにログインします。左側のナビゲーションペインで、[サービスメッシュ] > [メッシュ管理] を選択します。

  2. [メッシュ管理] ページで、ASM インスタンスの名前をクリックします。左側のナビゲーションペインで、[ASM ゲートウェイ] > [イングレスゲートウェイ] を選択します。

  3. [イングレスゲートウェイ] ページで、[作成] をクリックします。作成ページで、パラメータを設定し、[作成] をクリックします。

    次の表に、いくつかのパラメータについて説明します。詳細については、「イングレスゲートウェイを作成する」をご参照ください。

    パラメータ

    説明

    [クラスタ]

    イングレスゲートウェイをデプロイするクラスタ。

    [CLB インスタンスタイプ]

    CLB インスタンスのアクセスタイプ。この例では、[インターネットアクセス] が選択されています。

    CLB インスタンスを作成するか、既存の CLB インスタンスを使用する

    • [既存の CLB インスタンスを使用する]:ドロップダウンリストから既存の CLB インスタンスを選択します。

    • [CLB インスタンスを作成する][CLB インスタンスを作成] をクリックし、ドロップダウンリストから必要な CLB インスタンスの仕様を選択します。

    説明

    Kubernetes サービスごとに CLB インスタンスを選択することをお勧めします。複数の Kubernetes サービスが同じ CLB インスタンスを共有する場合、次のリスクと制限があります。

    • 別の Kubernetes サービスですでに使用されている CLB インスタンスを使用するように Kubernetes サービスを設定すると、CLB インスタンスの既存のリスナーが強制的に上書きされます。これは、元の Kubernetes サービスを中断する可能性があります。

    • Kubernetes サービスを作成するときに CLB インスタンスを作成する場合、CLB インスタンスを Kubernetes サービス間で共有することはできません。CLB コンソールで、または API オペレーションを呼び出すことによって作成した CLB インスタンスのみを共有できます。

    • 同じ CLB インスタンスを共有する Kubernetes サービスは、異なるフロントエンドリスニングポートを使用する必要があります。そうしないと、ポートの競合が発生する可能性があります。

    • 複数の Kubernetes サービスが同じ CLB インスタンスを共有する場合、リスナー名と vServer グループ名は Kubernetes で一意の識別子として使用されます。リスナーまたは vServer グループの名前を変更しないでください。

    • クラスタ間で CLB インスタンスを共有することはできません。

    [ポートマッピング]

    [ポートを追加] をクリックし、表示される行にプロトコルとサービスポートを指定できます。この例では、プロトコルは TCP に設定され、サービスポートは 31400 に設定されています。

手順 4:結果を確認する

kubectl クライアントを使用して、すべての TCP トラフィックが tcp-echo アプリケーションの v1 バージョンにルーティングされているかどうかを確認します。

  1. kubectl クライアントを使用して ACK クラスタに接続します。詳細については、「手順 2:クラスタ認証情報の種類を選択する」をご参照ください。

  2. 次のコマンドを実行して、tcp-echo サービスの IP アドレスとポート番号をクエリします。

    $ export INGRESS_HOST=$(kubectl -n istio-system get service istio-ingressgateway -o jsonpath='{.status.loadBalancer.ingress[0].ip}')
    $ export INGRESS_PORT=$(kubectl -n istio-system get service istio-ingressgateway -o jsonpath='{.spec.ports[?(@.name=="tcp")].port}')
  3. telnet コマンドを実行して、tcp-echo サービスに接続します。

    $ telnet $INGRESS_HOST $INGRESS_PORT
    Trying xxx.xxx.xxx.xxx...
    Connected to xxx.xxx.xxx.xxx.
    Escape character is '^]'
  4. 文字列を入力して、Enter キーを押します。

    返された文字列の先頭に「one」が付いている場合、tcp-echo アプリケーションはデプロイされており、すべてのサービストラフィックは tcp-echo アプリケーションの v1 バージョンにルーティングされています。

手順 5:トラフィックの一部を tcp-echo-v2 バージョンに移行する

この例では、トラフィックの 20% が tcp-echo-v2 バージョンにルーティングされ、残りの 80% が tcp-echo-v1 バージョンにルーティングされます。

  1. ASM インスタンスの仮想サービスの構成を変更します。

    1. ASM インスタンスの詳細ページで、左側のナビゲーションペインの [トラフィック管理センター] > [virtualservice] を選択します。

    2. [virtualservice] ページで、tcp-echo サービスを見つけ、YAML[アクション] 列の をクリックします。

    3. [編集] ダイアログボックスで、次の YAML コンテンツをコードエディターにコピーし、[OK] をクリックします。

      apiVersion: networking.istio.io/v1alpha3
      kind: VirtualService
      metadata:
        name: tcp-echo
      spec:
        hosts:
        - "*"
        gateways:
        - tcp-echo-gateway
        tcp:
        - match:
          - port: 31400
          route:
          - destination:
              host: tcp-echo
              port:
                number: 9000
              subset: v1  // v1 サブセット
            weight: 80  // 重み 80
          - destination:
              host: tcp-echo
              port:
                number: 9000
              subset: v2  // v2 サブセット
            weight: 20  // 重み 20
  2. 次のコマンドを実行して、tcp-echo サービスに 10 個のリクエストを送信します。

    $ for i in {1..10}; do \
    docker run -e INGRESS_HOST=$INGRESS_HOST -e INGRESS_PORT=$INGRESS_PORT -it --rm busybox sh -c "(date; sleep 1) | nc $INGRESS_HOST $INGRESS_PORT"; \
    done
    one Mon Nov 12 23:38:45 UTC 2018
    two Mon Nov 12 23:38:47 UTC 2018
    one Mon Nov 12 23:38:50 UTC 2018
    one Mon Nov 12 23:38:52 UTC 2018
    one Mon Nov 12 23:38:55 UTC 2018
    two Mon Nov 12 23:38:57 UTC 2018
    one Mon Nov 12 23:39:00 UTC 2018
    one Mon Nov 12 23:39:02 UTC 2018
    one Mon Nov 12 23:39:05 UTC 2018
    one Mon Nov 12 23:39:07 UTC 2018

    上記の結果は、トラフィックの 20% が tcp-echo-v2 バージョンにルーティングされていることを示しています。

    説明

    テストで 10 個のリクエストを送信した場合、トラフィックが常に指定された比率で tcp-echo-v1 バージョンと tcp-echo-v2 バージョンにルーティングされるとは限りません。ただし、サンプルサイズが大きくなると、実際の比率は 80:20 に近づきます。