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

Alibaba Cloud Service Mesh:レイヤー 4 TCP ルーティング

最終更新日:Jan 13, 2025

Service Mesh(ASM)のレイヤー 4 ルーティング機能を使用して、ルーティングルールに基づいて TCP トラフィックをルーティングできます。このトピックでは、ASM でサポートされているすべての TCP マッチングルールとルーティング機能について説明します。

前提条件

クラスターが ASM インスタンスに追加されていること

サンプルアプリケーションのデプロイ

サンプルアプリケーションをデプロイし、サンプルコードで提供されている仮想サービスを使用して、レイヤー 4 の負荷分散をテストできます。レイヤー 4 の負荷分散をテストするには、以下の手順を実行して、データプレーンのクラスターに echo-server アプリケーションと telnet-client アプリケーションをデプロイします。

  1. foo 名前空間を作成します。詳細については、「グローバル名前空間の管理」をご参照ください。

  2. グローバル名前空間ASM コンソール の [グローバル名前空間] ページで、デフォルトの名前空間と foo 名前空間の両方でサイドカープロキシインジェクションまたは Ambient Mesh モードが有効になっていることを確認します。

  3. kubectl を使用して、kubeconfig ファイルの情報に基づいてデータプレーンのクラスターに接続し、echo-server アプリケーションと telnet-client アプリケーションをデプロイします。

    1. 以下のサンプルコードに示されている対応するコンテンツを使用して、echoserver.yaml ファイルと telnet.yaml ファイルを作成します。

      展開して echoserver.yaml ファイルを表示

      apiVersion: apps/v1
      kind: Deployment
      metadata:
        name: echo-server
        labels:
          app: echo-server
          version: prod
      spec:
        replicas: 1
        selector:
          matchLabels:
            app: echo-server
            version: prod
        template:
          metadata:
            labels:
              app: echo-server
              version: prod
          spec:
            serviceAccountName: echo-server
            containers:
            - name: server
              image: istio/tcp-echo-server:1.2
              ports:
              - containerPort: 9000
              resources:
                limits:
                  cpu: "100m"
      ---
      apiVersion: v1
      kind: Service
      metadata:
        name: echo-server
        labels:
          app: echo-server
      spec:
        selector:
          app: echo-server
        ports:
        - protocol: TCP
          name: tcp
          port: 19000
          targetPort: 9000
        type: ClusterIP 
      ---
      apiVersion: v1
      kind: ServiceAccount
      metadata:
        name: echo-server
      ---
      apiVersion: apps/v1 
      kind: Deployment
      metadata:
        name: echo-server-2 
        labels:
          app: echo-server-2
      spec:
        replicas: 1
        selector:
          matchLabels:
            app: echo-server-2
        template:
          metadata:
            labels:
              app: echo-server-2
          spec:
            serviceAccountName: echo-server-2
            containers:
            - name: server 
              image: istio/tcp-echo-server:1.2 
              command:
              - "/bin/tcp-echo"
              - "9000"
              - "hello-2"
              ports:
              - containerPort: 9000
              resources:
                limits:
                  cpu: "100m"
      
      ---
      apiVersion: v1
      kind: Service
      metadata:
        name: echo-server-2
        labels:
          app: echo-server-2 
      spec:
        selector:
          app: echo-server-2
        ports:
        - protocol: TCP
          name: tcp
          port: 19000
          targetPort: 9000
        type: ClusterIP 
      ---
      apiVersion: v1
      kind: ServiceAccount
      metadata:
        name: echo-server-2
      

      展開して telnet.yaml ファイルを表示

      apiVersion: apps/v1 
      kind: Deployment
      metadata:
        name: telnet-client 
        labels:
          app: telnet-client 
      spec:
        replicas: 1
        selector:
          matchLabels:
            app: telnet-client 
        template:
          metadata:
            labels:
              app: telnet-client 
          spec:
            serviceAccountName: telnet-client 
            containers:
            - name: client 
              image: mikesplain/telnet:latest 
              command: 
              - "sleep"
              - "3600"
              resources:
                limits:
                  cpu: "100m"
      ---
      apiVersion: v1
      kind: ServiceAccount
      metadata:
        name: telnet-client 
      ---
      apiVersion: apps/v1 
      kind: Deployment
      metadata:
        name: telnet-client-2 
        labels:
          app: telnet-client-2
      spec:
        replicas: 1
        selector:
          matchLabels:
            app: telnet-client-2 
        template:
          metadata:
            labels:
              app: telnet-client-2 
          spec:
            serviceAccountName: telnet-client-2
            containers:
            - name: client 
              image: mikesplain/telnet:latest 
              command: 
              - "sleep"
              - "3600"
              resources:
                limits:
                  cpu: "100m"
      ---
      apiVersion: v1
      kind: ServiceAccount
      metadata:
        name: telnet-client-2
      ---
      apiVersion: apps/v1 
      kind: Deployment
      metadata:
        name: telnet-client-foo 
        namespace: foo
        labels:
          app: telnet-client-foo
      spec:
        replicas: 1
        selector:
          matchLabels:
            app: telnet-client-foo
        template:
          metadata:
            labels:
              app: telnet-client-foo
          spec:
            serviceAccountName: telnet-client-foo
            containers:
            - name: client 
              image: mikesplain/telnet:latest 
              command: 
              - "sleep"
              - "3600"
              resources:
                limits:
                  cpu: "100m"
      ---
      apiVersion: v1
      kind: ServiceAccount
      metadata:
        name: telnet-client-foo
        namespace: foo
      

    2. 以下のコマンドを実行して、echo-server アプリケーションと telnet-client アプリケーションをデプロイします。

      kubectl apply -f echoserver.yaml
      kubectl apply -f telnet.yaml

マッチングルール

destinationSubnets

tcp.match[n].destinationSubnets 属性を設定して、トラフィックの宛先 CIDR ブロックを照合できます。宛先 CIDR ブロックが属性で指定された値と一致する場合、トラフィックは tcp.match[n].destinationSubnets 属性に対応するルーティングルールを使用してルーティングされます。

サポートされているかどうか

  • Ambient Mesh モード:サポートされていません

  • サイドカーモード:サポートされています

サンプルリソースのデプロイ

次の YAML ファイルでは、宛先 CIDR ブロックは 192.168.0.0/16 です。この CIDR ブロック宛ての TCP トラフィックは、echo-server-2.default.svc.cluster.local サービスに転送されます。サンプルリソースは、CLI を使用するか、ASM コンソールでデプロイできます。次の例では、CLI を使用します。ASM コンソールでリソースをデプロイする方法の詳細については、「仮想サービスの管理」をご参照ください。

  1. 以下のコンテンツを含む destinationSubnets.yaml ファイルを作成します。

    サンプルコードでは、echo-server.default.svc.cluster.local サービスのエンドポイントは 192.168.0.0/16 CIDR ブロックにあります。ビジネス要件に基づいてエンドポイントを変更します。

    apiVersion: networking.istio.io/v1beta1
    kind: VirtualService
    metadata:
      name: echo
      namespace: default
    spec:
      hosts:
        - echo-server.default.svc.cluster.local
      tcp:
        - match:
            - destinationSubnets:
                - "192.168.0.0/16"
          route:
            - destination:
                host: echo-server-2.default.svc.cluster.local
  2. kubectl を使用して、kubeconfig ファイルの情報に基づいて ASM インスタンスに接続し、次のコマンドを実行して仮想サービスをデプロイします。

    kubectl apply -f destinationSubnets.yaml
  3. 以下のコマンドを実行して、echo-server.default.svc.cluster.local 19000 への接続を確立し、test というコンテンツを送信して、telnet-client アプリケーションを使用してテストを開始します。

    kubectl exec -it telnet-client-5786fc744f-9**** -c client -- telnet echo-server.default.svc.cluster.local:19000
    test

    hello2 test というメッセージが echo-server-2 から返されます。これは、トラフィックが仮想サービスで宣言されているポート 19000 の一致ルールにヒットしたことを示しています。ルーティングは想定どおりに実行されます。

port

tcp.match[n].port 属性を設定して、トラフィックの宛先ポートを照合できます。リクエストの宛先ポートがこの属性で指定された値と一致する場合、リクエストは tcp.match[n].port 属性に対応するルーティングルールを使用してルーティングされます。

サポートされているかどうか

  • Ambient Mesh モード:サポートされていません

  • サイドカーモード:サポートされています

サンプルリソースのデプロイ

次の YAML ファイルでは、宛先ポートは 19000 です。このポート宛ての TCP トラフィックは echo-server-2.default.svc.cluster.local サービスに転送されます。サンプルリソースは、CLI を使用するか、ASM コンソールでデプロイできます。次の例では、CLI を使用します。ASM コンソールでサンプルリソースをデプロイする方法の詳細については、「仮想サービスの管理」をご参照ください。

  1. 以下のコンテンツを含む port.yaml ファイルを作成します。

    apiVersion: networking.istio.io/v1beta1
    kind: VirtualService
    metadata:
      name: echo
      namespace: default
    spec:
      hosts:
        - echo-server.default.svc.cluster.local
      tcp:
        - match:
            - port: 19000
          route:
            - destination:
                host: echo-server-2.default.svc.cluster.local
  2. kubectl を使用して kubeconfig ファイルの情報に基づいて ASM インスタンスに接続し、次のコマンドを実行して仮想サービスをデプロイします。

    kubectl apply -f port.yaml
  3. 以下のコマンドを実行して echo-server.default.svc.cluster.local 19000 への接続を確立し、test というコンテンツを送信して telnet-client アプリケーションを使用してテストを開始します。

    kubectl exec -it telnet-client-5786fc744f-9**** -c client -- telnet echo-server.default.svc.cluster.local:19000
    test

    hello2 test というメッセージが echo-server-2 から返されます。これは、トラフィックが仮想サービスで宣言されているポート 19000 の一致ルールにヒットしたことを示しています。ルーティングは想定どおりに実行されます。

sourceLabels

tcp.match[n].sourceLabels 属性を設定して、特定のワークロードから送信されたリクエストを照合できます。

サポートされているかどうか

  • Ambient Mesh モード:サポートされていません

  • サイドカーモード:サポートされています

サンプルリソースのデプロイ

次の YAML ファイルは、app: telnet-client ラベルを持つワークロードから送信されたリクエストと一致します。 telnet-client アプリケーションは app: telnet-client ラベルを持ち、telnet-client-2 アプリケーションは app: telnet-client-2 ラベルを持ちます。したがって、telnet-client-2 アプリケーションから送信された TCP トラフィックではなく、telnet-client アプリケーションから送信された TCP トラフィックが、次の仮想サービスで定義されているルールと一致します。サンプルリソースは、CLI を使用するか ASM コンソールでデプロイできます。次の例では、CLI を使用します。ASM コンソールでサンプルリソースをデプロイする方法の詳細については、「仮想サービスの管理」をご参照ください。

  1. 以下のコンテンツを含む sourceLabels.yaml ファイルを作成します。

    apiVersion: networking.istio.io/v1beta1
    kind: VirtualService
    metadata:
      name: echo
      namespace: default
    spec:
      hosts:
        - echo-server.default.svc.cluster.local
      tcp:
        - match:
            - sourceLabels:
                app: telnet-client
          route:
            - destination:
                host: echo-server-2.default.svc.cluster.local
  2. kubectl を使用して kubeconfig ファイルの情報に基づいて ASM インスタンスに接続し、次のコマンドを実行して仮想サービスをデプロイします。

    kubectl apply -f sourceLabels.yaml
  3. 以下のコマンドを実行して echo-server.default.svc.cluster.local 19000 への接続を確立し、test というコンテンツを送信して、telnet-client アプリケーションを使用してテストを開始します。

    kubectl exec -it telnet-client-5786fc744f-9**** -c client -- telnet echo-server.default.svc.cluster.local:19000
    test

    hello2 test というメッセージが echo-server-2 から返されます。これは、telnet-client アプリケーションが実行されているポッドから送信されたトラフィックが、仮想サービスで宣言されているルーティングルールと一致していることを示しています。

  4. 以下のコマンドを実行して echo-server.default.svc.cluster.local 19000 への接続を確立し、test というコンテンツを送信して、telnet-client-2 アプリケーションを使用してテストを開始します。

    kubectl exec -it telnet-client-2-c56db78bd-7**** -c client -- telnet echo-server.default.svc.cluster.local:19000
    test

    hello test というメッセージが echo-server から返されます。これは、トラフィックが echo-server-2 に転送されておらず、telnet-client-2 アプリケーションが実行されているポッドから送信されたトラフィックが、仮想サービスで宣言されているルーティングルールと一致していないことを示しています。ルーティングは想定どおりに実行されます。

gateways

tcp.match[n].gateways を設定して、特定のゲートウェイからサービスに送信されたリクエストを照合できます。

サポートされているかどうか

  • Ambient Mesh モード:サポートされています

  • サイドカーモード:サポートされています

サンプルリソースのデプロイ

上記の必須条件に加えて、次の例では 2 つの ASM ゲートウェイをデプロイする必要があります。これらは ingressgateway-1 と ingressgateway-2 という名前です。例で提供されている仮想サービスをこれら 2 つのゲートウェイに適用すると、ingressgateway-1 から送信されたトラフィックは echo-server アプリケーションにルーティングされ、ingressgateway-2 から送信されたトラフィックは echo-server-2 アプリケーションにルーティングされます。

  1. 2 つの ASM ゲートウェイを作成し、istio-ingressgateway-1 と istio-ingressgateway-2 という名前を付けます。詳細については、「イングレスゲートウェイの作成」をご参照ください。

    ingressgateway-1 ゲートウェイと ingressgateway-2 ゲートウェイで同じ設定を行います。[ポートマッピング] を設定する際に、[ポートの追加] をクリックし、[プロトコル][TCP] に設定し、[サービスポート][19000] に設定します。image.png

  2. Istio ゲートウェイをデプロイします。

    次の例では、CLI を使用します。ASM コンソールで Istio ゲートウェイをデプロイする方法の詳細については、「Istio ゲートウェイの管理」をご参照ください。

    1. 以下のコンテンツを使用して、それぞれ ingressgateway-1.yaml ファイルと ingressgateway-2.yaml ファイルを作成します。

      次のサンプルコードでは、2 つのゲートウェイのリスニングポートが設定されています。この例では、TCP トラフィックが使用されています。したがって、Host は * に設定されています。

      展開して ingressgateway-1.yaml を表示

      apiVersion: networking.istio.io/v1beta1
      kind: Gateway
      metadata:
        name: ingressgateway-1
        namespace: istio-system
      spec:
        selector:
          istio: ingressgateway-1
        servers:
          - hosts:
              - '*'
            port:
              name: tcp
              number: 19000
              protocol: TCP

      展開して ingressgateway-2.yaml を表示

      apiVersion: networking.istio.io/v1beta1
      kind: Gateway
      metadata:
        name: ingressgateway-1
        namespace: istio-system
      spec:
        selector:
          istio: ingressgateway-1
        servers:
          - hosts:
              - '*'
            port:
              name: tcp
              number: 19000
              protocol: TCP
    2. 以下のコマンドを実行して、Istio ゲートウェイをデプロイします。

      kubectl apply -f ingressgateway-1.yaml
      kubectl apply -f ingressgateway-2.yaml
  3. 2 つのゲートウェイの仮想サービスをデプロイします。

    次の仮想サービスは、2 つのルーティングルールを定義しています。最初のルールはゲートウェイのマッチングを定義しています。トラフィックが ingressgateway-2 からの場合、トラフィックは echo-server-2.default.svc.cluster.local にルーティングされます。サンプルリソースは、CLI を使用するか ASM コンソールでデプロイできます。次の例では、CLI を使用します。ASM コンソールでサンプルリソースをデプロイする方法の詳細については、「仮想サービスの管理」をご参照ください。

    1. 以下のコンテンツを含む ingressgateway-vs.yaml ファイルを作成します。

      展開して ingressgateway-vs.yaml を表示

      apiVersion: networking.istio.io/v1beta1
      kind: VirtualService
      metadata:
        name: ingressgateway
        namespace: istio-system
      spec:
        gateways:
          - ingressgateway-1
          - ingressgateway-2
        hosts:
          - '*'
        tcp:
          - match:
              - gateways:
                  - ingressgateway-2
            route:
              - destination:
                  host: echo-server-2.default.svc.cluster.local
          - route:
              - destination:
                  host: echo-server.default.svc.cluster.local
      
  4. kubectl を使用して kubeconfig ファイルの情報に基づいて ASM インスタンスに接続し、次のコマンドを実行して仮想サービスをデプロイします。

    kubectl apply -f ingressgateway-vs.yaml
  5. 以下のコマンドを実行して ingressgateway-1 ゲートウェイの IP アドレスに接続し、test というコンテンツを送信します。

    kubectl exec -it telnet-client-5786fc744f-9**** -c client -- telnet echo-server.default.svc.cluster.local:19000
    test

    hello test というメッセージが返されます。仮想サービスで定義されているように、ingressgateway-1 から送信されたトラフィックは echo-server.default.svc.cluster.local にルーティングされるはずです。トラフィックは想定どおりにルーティングされます。

  6. 以下のコマンドを実行して ingressgateway-2 ゲートウェイの IP アドレスに接続し、test というコンテンツを送信します。

    kubectl exec -it telnet-client-2-c56db78bd-7**** -c client -- telnet echo-server.default.svc.cluster.local:19000
    test

    hello-2 test というメッセージが返されます。仮想サービスで定義されているように、ingressgateway-2 から送信されたトラフィックは echo-server-2.default.svc.cluster.local にルーティングされるはずです。トラフィックは想定どおりにルーティングされます。

sourceNamespace

sourceNamespace フィールドを設定して、トラフィックの送信元名前空間を照合できます。

サポートされているかどうか

  • Ambient Mesh モード:サポートされていません

  • サイドカーモード:サポートされています

サンプルリソースのデプロイ

次の YAML ファイルの目的:foo 名前空間から送信され、echo-server.default.svc.cluster.local 宛てのトラフィックは、echo-server-2.default.svc.cluster.local にルーティングされます。サンプルリソースは、CLI を使用するか ASM コンソールでデプロイできます。次の例では、CLI を使用します。ASM コンソールでリソースをデプロイする方法の詳細については、「仮想サービスの管理」をご参照ください。

  1. 以下のコンテンツを含む source-namespace.yaml ファイルを作成します。

    apiVersion: networking.istio.io/v1beta1
    kind: VirtualService
    metadata:
      name: source-namespace
      namespace: default
    spec:
      hosts:
        - echo-server.default.svc.cluster.local
      http: []
      tcp:
        - match:
            - sourceNamespace: foo
          route:
            - destination:
                host: echo-server-2.default.svc.cluster.local
        - route:
            - destination:
                host: echo-server.default.svc.cluster.local
    
  2. kubectl を使用して kubeconfig ファイルの情報に基づいて ASM インスタンスに接続し、次のコマンドを実行して仮想サービスをデプロイします。

    kubectl apply -f source-namespace.yaml
  3. 以下のコマンドを実行して、foo 名前空間の telnet-client アプリケーションを使用して test というコンテンツを送信し、テストを開始します。

    kubectl -n foo exec -it telnet-client-foo-7c94569bfd-h**** -c client -- telnet echo-server.default.svc.cluster.local:19000
    test

    hello2 test というメッセージが echo-server-2 から返されます。これは、foo 名前空間の telnet-client アプリケーションが実行されているポッドから送信されたトラフィックが、仮想サービスで宣言されているルーティングルールと一致していることを示しています。

  4. 以下のコマンドを実行して、デフォルトの名前空間の telnet-client アプリケーションを使用して test というコンテンツを送信し、テストを開始します。

    kubectl exec -it telnet-client-c56db78bd-7**** -c client -- telnet echo-server.default.svc.cluster.local:19000
    test

    hello test というメッセージが echo-server から返され、トラフィックは echo-server-2 に転送されません。これは、default/telnet-client ポッドから送信されたトラフィックが、仮想サービスで定義されているデフォルトのマッチングルールに従って echo-server.default.svc.cluster.local にルーティングされていることを示しています。

ルーティング

weight

weight フィールドを設定して、トラフィックのパーセンテージに基づいて複数のサブセット間でトラフィックをルーティングできます。

サポートされているかどうか

  • Ambient Mesh モード:サポートされていません

  • サイドカーモード:サポートされています

サンプルリソースのデプロイ

  1. デプロイメントを作成します。

    1. 以下のコンテンツを含む echo-server-backup.yaml ファイルを作成します。

      次の YAML ファイルは、echo-server アプリケーションのグレースケールサブセットをデプロイするために使用されます。

      展開して echo-server-backup.yaml を表示

      apiVersion: apps/v1
      kind: Deployment
      metadata:
        name: echo-server-gray
        labels:
          app: echo-server
          version: gray
      spec:
        replicas: 1
        selector:
          matchLabels:
            app: echo-server
            version: gray
        template:
          metadata:
            labels:
              app: echo-server
              version: gray
          spec:
            serviceAccountName: echo-server
            containers:
            - name: server
              image: istio/tcp-echo-server:1.2
              command:
              - "/bin/tcp-echo"
              - "9000"
              - "hello-gray"
              ports:
              - containerPort: 9000
              resources:
                limits:
                  cpu: "100m"
    2. kubectl を使用して kubeconfig ファイルの情報に基づいてデータプレーンのクラスターに接続し、次のコマンドを実行してデプロイメントを作成します。

      kubectl apply -f echo-server-backup.yaml
  2. 宛先ルールをデプロイします。

    次の例では、CLI を使用します。ASM コンソールで宛先ルールをデプロイする方法の詳細については、「宛先ルールの管理」をご参照ください。

    1. 以下のコンテンツを含む echoserver-dr.yaml ファイルを作成します。

      次の YAML ファイルは、echo-server アプリケーションの 2 つのサブセット(prod と gray)を作成する宛先ルールを定義しています。

      apiVersion: networking.istio.io/v1beta1
      kind: DestinationRule
      metadata:
        name: echo
        namespace: default
      spec:
        host: echo.default.svc.cluster.local
        subsets:
          - labels:
              version: prod
            name: prod
          - labels:
              version: gray
            name: gray
    2. kubectl を使用して kubeconfig ファイルの情報に基づいて ASM インスタンスに接続し、次のコマンドを実行して宛先ルールをデプロイします。

      kubectl apply -f echoserver-dr.yaml
  3. 仮想サービスをデプロイします。

    次の例では、CLI を使用します。ASM コンソールで仮想サービスをデプロイする方法の詳細については、「仮想サービスの管理」をご参照ください。

    1. 以下のコンテンツを含む echoserver-vs.yaml ファイルを作成します。

      次の YAML ファイルは、prod サブセットと gray サブセットに 80:20 のトラフィックウェイトを設定する仮想サービスを定義しています。これは、トラフィックの 80% が prod サブセットにルーティングされ、トラフィックの 20% が gray サブセットにルーティングされることを意味します。

      apiVersion: networking.istio.io/v1beta1
      kind: VirtualService
      metadata:
        name: echo
      spec:
        hosts:
        - echo-server.default.svc.cluster.local
        http:
          - route:
            - destination:
                host: echo-server.default.svc.cluster.local
                subset: gray
              weight: 20
            - destination:
                host: echo-server.default.svc.cluster.local
                subset: prod
              weight: 80
    2. kubectl を使用して kubeconfig ファイルの情報に基づいて ASM インスタンスに接続し、次のコマンドを実行して仮想サービスをデプロイします。

      kubectl apply -f echoserver-vs.yaml
  4. 以下のコマンドを実行して、test というコンテンツを送信し、telnet-client アプリケーションを使用してテストを開始します。 echo-server アプリケーションから hello test というメッセージを受信したら、Ctrl + D ショートカットを押して終了します。上記の手順を 5 回繰り返します。

    $ ackctl exec -it telnet-client-5786fc744f-9**** -c client -- telnet echo-server.default.svc.cluster.local:19000
    test
    hello-gray test
    $ ackctl exec -it telnet-client-5786fc744f-9**** -c client -- telnet echo-server.default.svc.cluster.local:19000
    test
    hello test
    $ ackctl exec -it telnet-client-5786fc744f-9**** -c client -- telnet echo-server.default.svc.cluster.local:19000
    test
    hello test
    $ ackctl exec -it telnet-client-5786fc744f-9**** -c client -- telnet echo-server.default.svc.cluster.local:19000
    test
    hello test
    $ ackctl exec -it telnet-client-5786fc744f-9**** -c client -- telnet echo-server.default.svc.cluster.local:19000
    test
    hello test

    TCP トラフィックの負荷分散は接続レベルで動作します。上記のサンプルから、5 つの接続が仮想サービスで指定されたトラフィックのパーセンテージに基づいて prod サブセットと gray サブセットにルーティングされていることがわかります。トラフィックは設定されたトラフィックのパーセンテージに厳密に基づいてルーティングされるわけではないことに注意してください。