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

Container Service for Kubernetes:ingressゲートウェイを使用したASMインスタンスのgRPCサービスへのアクセス

最終更新日:Dec 14, 2024

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

前提条件

手順1: 2つのバージョンのgRPCサービスをデプロイする

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

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

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

  3. の上部にデプロイメントページから名前空間を選択します。名前空間ドロップダウンリストをクリックし、YAMLから作成する.

    説明

    選択する名前空間には、istio-injection=enabledラベルが必要です。これは、名前空間に対して自動サイドカープロキシ注入が有効になっていることを示します。 詳細については、「自動サイドカープロキシ注入の有効化」をご参照ください。

  4. On the作成ページ、サンプルテンプレートをカスタム次のYAMLコードをコードエディターにコピーし、作成.

    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: ASMインスタンスのルーティングルールの設定

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

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

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

  3. を作成するCreate anIstioゲートウェイ.

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

    2. On the作成ページを選択します。デフォルトから名前空間ドロップダウンリストからテンプレートを選択します。テンプレートドロップダウンリストで、次の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:
          - "*"
  4. を作成します。Create a宛先ルール.

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

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

      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"    
  5. を作成します。Create a仮想サービス.

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

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

      YAMLコードを表示する

      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        

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

ingressゲートウェイのポート8080を有効にします。 ポート8080が存在しない場合は、ポート8080を追加します。

ingressゲートウェイの作成

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

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

  3. On theIngressゲートウェイページをクリックします。作成必要に応じてパラメーターを設定し、作成.

    次の表に、いくつかのパラメーターを示します。 詳細については、「Ingress gatewayパラメーター」をご参照ください。

    パラメーター

    説明

    クラスター

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

    CLBインスタンスタイプ

    Classic Load Balancer (CLB) インスタンスのアクセスタイプ。 この例では、[インターネットアクセス] を選択します。

    CLBインスタンスの作成または既存のCLBインスタンスの使用

    [CLBインスタンスの作成] または [既存のCLBインスタンスの使用] を選択できます。

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

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

    説明

    Kubernetes ServiceごとにCLBインスタンスを選択することを推奨します。 複数のKubernetes Servicesが同じCLBインスタンスを共有する場合、次のリスクと制限が存在します。

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

    • Kubernetes Serviceの作成時にCLBインスタンスを作成した場合、Kubernetes Services間でCLBインスタンスを共有することはできません。 共有できるのは、CLBコンソールまたはAPIを呼び出して作成したCLBインスタンスのみです。

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

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

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

    ポートマッピング

    プロトコルTCPに、サービスポート8080に設定します。

既存のingressゲートウェイへのポート8080の追加

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

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

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

ステップ4: gRPCクライアントを起動する

  1. gRPCurlは、gRPCサービスとやり取りするために使用できるコマンドラインツールです。 gRPCサービスのテストとデバッグ、およびサービスの定義とメタデータの表示を簡単に行うことができます。 gRPCurlをダウンロードしてインストールするには、https://github.com/fullstorydev/grpcurl. 次のコマンドを実行します。

    grpcurl -d '{"name": "Jack"}' -plaintext {IP address of the ingress gateway}: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: 特定の比率に基づいて、2つのバージョンのgRPCサービスにトラフィックをルーティングする

istio-grpc-server-v2へのトラフィックのルート40% とistio-grpc-server-v1へのトラフィックの60% 。

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

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

  3. VirtualServiceベージのgrpc-vs仮想サーバで、アクション列にあるYAMLをクリックします。

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

    ....
          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
  5. 次のgRPCurlコマンドを実行して、ASMインスタンスにデプロイしたgRPCサービスにアクセスします。

    grpcurl -d '{"name": "Jack"}' -plaintext {IP address of the ingress gateway}: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!"