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

Alibaba Cloud Service Mesh:ASM インスタンスの gRPC サービスにアクセスするためにイングレスゲートウェイを使用する

最終更新日:May 14, 2025

Service Mesh(ASM)イングレスゲートウェイを使用して、ASM インスタンス内の Google Remote Procedure Call(gRPC)サービスにアクセスできます。これにより、gRPC サービスに対する正確なアクセス制御を実装し、サービスガバナンスを向上させ、サービス間の通信のセキュリティを確保できます。このトピックでは、イングレスゲートウェイを使用して ASM インスタンス内の gRPC サービスにアクセスする方法と、gRPC サービスの 2 つのバージョン間でトラフィックをシフトする方法について説明します。

前提条件

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

gRPC サービスのバージョン 1 とバージョン 2(istio-grpc-server-v1 と istio-grpc-server-v2)をデプロイします。

  1. app.yaml という名前のファイルを作成し、次の内容をファイルにコピーします。

    詳細を表示するにはクリックします

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: grpc-helloworld-py-v1
      labels:
        app: grpc-helloworld-py
        version: v1
    spec:
      replicas: 1
      selector:
        matchLabels:
          app: grpc-helloworld-py
          version: v1
      template:
        metadata:
          labels:
            app: grpc-helloworld-py
            version: v1
        spec:
          containers:
            - name: grpc-helloworld-py
              image: registry.cn-hangzhou.aliyuncs.com/aliacs-app-catalog/istio-grpc-server:grpc-helloworld-py-v1.0
              imagePullPolicy: Always
              env:
                - name: podname
                  valueFrom:
                    fieldRef:
                      apiVersion: v1
                      fieldPath: metadata.name
              ports:
                - containerPort: 50051
                  name: grpc-port
    ---
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: grpc-helloworld-py-v2
      labels:
        app: grpc-helloworld-py
        version: v2
    spec:
      replicas: 1
      selector:
        matchLabels:
          app: grpc-helloworld-py
          version: v2
      template:
        metadata:
          labels:
            app: grpc-helloworld-py
            version: v2
        spec:
          containers:
            - name: grpc-helloworld-py
              image: registry.cn-hangzhou.aliyuncs.com/aliacs-app-catalog/istio-grpc-server:grpc-helloworld-py-v1.0
              imagePullPolicy: Always
              env:
                - name: podname
                  valueFrom:
                    fieldRef:
                      apiVersion: v1
                      fieldPath: metadata.name
              ports:
                - containerPort: 50051
                  name: grpc-port
    ---
    apiVersion: v1
    kind: Service
    metadata:
      name: grpc-helloworld-py
      labels:
        app: grpc-helloworld-py
    spec:
      ports:
        - port: 50051
          name: grpc-port
      selector:
        app: grpc-helloworld-py
  2. 次のコマンドを実行して、アプリケーションをデプロイします。

    kubectl apply -f app.yaml

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

すべてのインバウンドトラフィックを istio-grpc-server-v1 にルーティングするように、ASM インスタンスの Istio ゲートウェイ、仮想サービス、およびデスティネーションルールを作成します。

  1. 次のコマンドを実行して、rules.yaml という名前のファイルを作成し、次の内容をファイルにコピーします。

    apiVersion: networking.istio.io/v1beta1
    kind: Gateway
    metadata:
      name: grpc-gateway
    spec:
      selector:
        istio: ingressgateway
      servers:
      - port:
          number: 8080
          name: grpc
          protocol: GRPC
        hosts:
        - "*"
    ---
    apiVersion: networking.istio.io/v1beta1
    kind: DestinationRule
    metadata:
      name: dr-istio-grpc-server
    spec:
      host: grpc-helloworld-py
      trafficPolicy:
        loadBalancer:
          simple: ROUND_ROBIN
      subsets:
        - name: v1
          labels:
            version: "v1"
        - name: v2
          labels:
            version: "v2"    
    ---
    apiVersion: networking.istio.io/v1alpha3
    kind: VirtualService
    metadata:
      name: grpc-vs
    spec:
      hosts:
      - "*"
      gateways:
      - grpc-gateway
      http:
        - match:
            - port: 8080
          route:
            - destination:
                host: grpc-helloworld-py
                port:
                  number: 50051
                subset: v1
              weight: 100
            - destination:
                host: grpc-helloworld-py
                port:
                  number: 50051
                subset: v2
              weight: 0        
  2. 次のコマンドを実行して、ルーティングルールをデプロイします。

    kubectl apply -f rules.yaml

手順 3:イングレスゲートウェイを作成するか、既存のイングレスゲートウェイを使用する

イングレスゲートウェイを作成する

イングレスゲートウェイを作成し、イングレスゲートウェイの [サービスポート] を 8080 に設定します。

ポート 8080 を既存のイングレスゲートウェイに追加する

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

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

  3. [イングレスゲートウェイ] ページで、目的のゲートウェイの名前をクリックします。基本オプション[ゲートウェイの詳細] ページの Dingtalk_20230104170049.jpgポート[ポート マッピング][ポートを追加]プロトコルTCP[サービス ポート]8080[送信] セクションで、 の横にある アイコンをクリックします。 ダイアログボックスで、 をクリックし、 を に設定し、 を に設定して、 をクリックします。

手順 4: gRPC クライアントを起動する

  1. grpcurl コマンドラインツールをインストールして、次のコマンドを実行します。

    grpcurl -d '{"name": "Jack"}' -plaintext {イングレスゲートウェイの IP アドレス}:8080 helloworld.Greeter/SayHello
  2. 出力は、すべてのリクエストが istio-grpc-server-v1 にルーティングされていることを示しています。

     "message": "Hello, Jack! I'm from grpc-helloworld-py-v1-79b5dc9654-cg4dq!"
     "message": "Hello, Jack! I'm from grpc-helloworld-py-v1-79b5dc9654-cg4dq!"
     "message": "Hello, Jack! I'm from grpc-helloworld-py-v1-79b5dc9654-cg4dq!"
     "message": "Hello, Jack! I'm from grpc-helloworld-py-v1-79b5dc9654-cg4dq!"
     "message": "Hello, Jack! I'm from grpc-helloworld-py-v1-79b5dc9654-cg4dq!"     

手順 5:特定の比率に基づいて gRPC サービス v2 にトラフィックをルーティングする

トラフィックの 40% を istio-grpc-server-v2 に、60% を istio-grpc-server-v1 にルーティングします。

  1. 次のコマンドを実行して、仮想サービスを編集します。

    kubectl edit VirtualService grpc-vs

    次のコマンドを実行して route を変更し、ルールを保存します。

    ....
          route:
            - destination:
                host: grpc-helloworld-py
                port:
                  number: 50051
                subset: v1
              weight: 60
            - destination:
                host: grpc-helloworld-py
                port:
                  number: 50051
                subset: v2
              weight: 40
  2. 次の gRPCurl コマンドを実行して、ASM インスタンスにデプロイした gRPC サービスにアクセスします。

    grpcurl -d '{"name": "Jack"}' -plaintext {イングレスゲートウェイの IP アドレス}:8080 helloworld.Greeter/SayHello

    出力は、トラフィックの 40% が istio-grpc-server-v2 にルーティングされていることを示しています。

    説明

    トラフィックは、正確に 60:40 の比率で istio-grpc-server-v1 と istio-grpc-server-v2 にルーティングされない場合があります。ただし、全体的なトラフィック分布はこの比率に常に近くなります。

    "message": "Hello, Jack! I'm from grpc-helloworld-py-v1-79b5dc9654-cg4dq!"
    "message": "Hello, Jack! I'm from grpc-helloworld-py-v1-79b5dc9654-cg4dq!"
    "message": "Hello, Jack! I'm from grpc-helloworld-py-v2-7f56b49b7f-9vvr7!"
    "message": "Hello, Jack! I'm from grpc-helloworld-py-v1-79b5dc9654-cg4dq!"
    "message": "Hello, Jack! I'm from grpc-helloworld-py-v2-7f56b49b7f-9vvr7!"
    "message": "Hello, Jack! I'm from grpc-helloworld-py-v1-79b5dc9654-cg4dq!"
    "message": "Hello, Jack! I'm from grpc-helloworld-py-v2-7f56b49b7f-9vvr7!"
    "message": "Hello, Jack! I'm from grpc-helloworld-py-v1-79b5dc9654-cg4dq!"
    "message": "Hello, Jack! I'm from grpc-helloworld-py-v2-7f56b49b7f-9vvr7!"
    "message": "Hello, Jack! I'm from grpc-helloworld-py-v1-79b5dc9654-cg4dq!"