プロキシレス gRPC サービス メッシュを設定する

このガイドでは、プロキシレス gRPC サービス メッシュの構成方法について説明します。

始める前に

Envoy サイドカー自動インジェクションが有効になっている名前空間に、プロキシレス gRPC サービス メッシュを作成しないでください。サイドカー インジェクションが有効になっているかどうかを確認するには、次のコマンドを実行します。

kubectl get namespace default --show-labels

サイドカー自動インジェクションが有効になっている場合は、次のコマンドを実行してラベルを削除します。

kubectl label namespace default istio-injection-

gRPC サービスをデプロイする

このセクションでは、gRPC helloworld サンプル サービスをデプロイします。helloworld サンプル サービスは、gRPC クライアントのリクエストに応じて簡単なメッセージを返す gRPC サーバー アプリケーションです。helloworld サービスは、クラスタのポート 8080 で gRPC サービスを公開します。

  1. grpc-td-helloworld.yaml ファイルに次のものを保存します。

    apiVersion: v1
    kind: Service
    metadata:
      name: helloworld
      namespace: default
    spec:
      ports:
      - port: 8080
        name: helloworld
        protocol: TCP
        targetPort: 50051
      selector:
        run: app1
      type: ClusterIP
    
    ---
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      labels:
        run: app1
      name: app1
      namespace: default
    spec:
      selector:
        matchLabels:
          run: app1
      replicas: 2
      template:
        metadata:
          labels:
            run: app1
          annotations:
            sidecar.istio.io/inject: "false"
        spec:
          containers:
          - image: grpc/java-example-hostname:1.37.0
            name: app1
            ports:
            - protocol: TCP
              containerPort: 50051
    
  2. ファイル grpc-td-helloworld.yaml を適用します。

    kubectl apply -f grpc-td-helloworld.yaml
    
  3. 新しい helloworld サービスが作成されたことを確認します。

    kubectl get svc -n default
    

    出力は次のようになります。

    NAME           TYPE        CLUSTER-IP   EXTERNAL-IP   PORT (S)   AGE
    helloworld     ClusterIP   10.71.9.71   <none>        8080/TCP  41m
    [..skip..]
    
  4. アプリケーション Pod が動作していることを確認します。

    kubectl get pods -n default
    
  5. 出力 Pod は次のようになります。

    NAME                        READY     STATUS    RESTARTS   AGE
    app1-6db459dcb9-zvfg2   1/1       Running   0          6m
    app1-6db459dcb9-hlvhj   1/1       Running   0          6m
    [..skip..]
    

gRPC サービス メッシュを構成する

このセクションでは、シンプルな gRPC サービス メッシュを構成します。

  1. td-grpc-mesh.yaml ファイルで、次の mesh マニフェストを保存します。

    kind: TDMesh
    apiVersion: net.gke.io/v1alpha1
    metadata:
      name: td-grpc-mesh
      namespace: default
    spec:
      gatewayClassName: gke-td
      allowedRoutes:
        namespaces:
          from: All
        kinds:
        - group: net.gke.io
          kind: TDGRPCRoute
    
  2. メッシュ マニフェストを gke-1 に適用します。

    kubectl apply -f td-grpc-mesh.yaml
    

    サンプルの TDMesh では、TDGRPCRoute リソースのみに接続が許可されます。このマニフェストでは、許可されるルートの種類を定義します。

  3. 新しい td-grpc-mesh メッシュが作成されたことを確認します。

    kubectl describe tdmesh td-grpc-mesh -n default
    

    出力は次のようになります。

    ...
    Status:
      Conditions:
        Last Transition Time:  2022-04-14T22:22:09Z
        Message:
        Reason:                MeshReady
        Status:                True
        Type:                  Ready
        Last Transition Time:  2022-04-14T22:21:41Z
        Message:
        Reason:                Scheduled
        Status:                True
        Type:                  Scheduled
    Events:
      Type    Reason  Age   From                Message
      ----    ------  ----  ----                -------
      Normal  ADD     79s   mc-mesh-controller  Processing mesh default/td-grpc-mesh
      Normal  UPDATE  79s   mc-mesh-controller  Processing mesh default/td-grpc-mesh
      Normal  SYNC    50s   mc-mesh-controller  SYNC on default/td-grpc-mesh was a success
    
  4. helloworld-route.yaml ファイルで、次のマニフェストを保存します。

    kind: TDGRPCRoute
    apiVersion: net.gke.io/v1alpha1
    metadata:
      name: helloworld-route
      namespace: default
    spec:
      parentRefs:
      - name: td-grpc-mesh
        namespace: default
        group: net.gke.io
        kind: TDMesh
      hostnames:
      - helloworld
      rules:
      - backendRefs:
        - name: helloworld
          port: 8080
          namespace: default
    
  5. helloworld-route.yaml マニフェストを gke-1 に適用します。

    kubectl apply -f helloworld-route.yaml
    
  6. 新しい helloworld-route GRPCRoute リソースが作成されたことを確認します。

    kubectl get tdgrpcroute -n default
    

構成を確認する

構成プロセスが完了したら、プロキシレス gRPC クライアントを使用して helloworld gRPC サーバーに到達できることを確認します。このクライアントは Traffic Director に接続して helloworld サービスに関する情報を取得し、その情報を使用してサービスのバックエンドにトラフィックを送信します。

次の例では、grpcurl ツールを使用して、Traffic Director がメッシュでトラフィックを正しくルーティングしていることを確認します。クライアント Pod を作成してから、シェルを開き、シェルから検証コマンドを実行します。

環境変数とブートストラップ ファイルを設定する

  1. grpc-client.yaml ファイルに次の Pod マニフェストを保存します。

    apiVersion: v1
    kind: Pod
    metadata:
      name: static-sleeper
      namespace: default
      annotations:
        sidecar.istio.io/inject: "false"
    spec:
      containers:
      - image: curlimages/curl:7.82.0
        imagePullPolicy: IfNotPresent
        name: sleeper
        command:
        - sleep
        - 365d
        env:
        - name: GRPC_XDS_BOOTSTRAP
          value: "/tmp/grpc-xds/td-grpc-bootstrap.json"
        volumeMounts:
        - name: grpc-td-conf
          mountPath: /tmp/grpc-xds/
      initContainers:
      - args:
        - --config-mesh-experimental
        - "gketd-td-grpc-mesh"
        - --output
        - "/tmp/bootstrap/td-grpc-bootstrap.json"
        image: gcr.io/trafficdirector-prod/td-grpc-bootstrap:0.14.0
        imagePullPolicy: IfNotPresent
        name: grpc-td-init
        volumeMounts:
        - name: grpc-td-conf
          mountPath: /tmp/bootstrap/
      volumes:
      - name: grpc-td-conf
        emptyDir:
          medium: Memory
    
  2. gke-1 に Pod マニフェストを適用します。

    kubectl apply -f grpc-client.yaml
    
  3. Pod の準備ができたら、クライアント Pod へのシェルを開きます。

    kubectl exec -it static-sleeper -- /bin/sh
    

grpcurl ツールは、プロキシレス gRPC クライアントとして使用できます。grpcurl ツールは、環境変数とブートストラップ情報を使用して Traffic Director に接続します。次に、Traffic Director が構成された helloworld サービスについて学習します。

grpcurl ツールを使用して構成を確認するには:

  1. grpcurl ツールをダウンロードしてインストールします。

    cd /home/curl_user
    curl -L https://github.com/fullstorydev/grpcurl/releases/download/v1.8.1/grpcurl_1.8.1_linux_x86_64.tar.gz | tar -xz
    
  2. サービス URI として xds:///helloworld を使用し、呼び出すサービス名とメソッドとして helloworld.Greeter/SayHello を指定して、grpcurl ツールを実行します。SayHello メソッドのパラメータは -d オプションで渡します。

    ./grpcurl --plaintext \
      -d '{"name": "world"}' \
      xds:///helloworld helloworld.Greeter/SayHello
    

    出力は次のようになります。INSTANCE_HOST_NAME は Pod のホスト名です。

    Greetings: Hello world, from INSTANCE_HOST_NAME
    

この出力より、プロキシレス gRPC クライアントが Traffic Director に接続され、helloworld のバックエンドが xds の名前解決機能で解決されていることを確認できます。クライアントは、IP アドレスの把握や DNS 解決の実行なしに、サービスのバックエンドの 1 つに対してリクエストを送信しています。

次のステップ