プロキシレス gRPC サービス メッシュを設定する
このガイドでは、プロキシレス gRPC サービス メッシュの構成方法について説明します。
構成はプレビュー版をご利用のお客様に対してサポートされていますが、新規の Cloud Service Mesh ユーザーにはおすすめしません。詳細については、Cloud Service Mesh の概要をご覧ください。
始める前に
Envoy サイドカー自動インジェクションが有効になっている名前空間に、プロキシレス gRPC サービス メッシュを作成しないでください。サイドカー インジェクションが有効になっているかどうかを確認するには、次のコマンドを実行します。
kubectl get namespace default --show-labels
サイドカー自動インジェクションが有効になっている場合は、次のコマンドを実行してラベルを削除します。
kubectl label namespace default istio-injection-
gRPC サービスをデプロイする
このセクションでは、gRPC helloworld
サンプル サービスをデプロイします。helloworld
サンプル サービスは、gRPC クライアントのリクエストに応じて簡単なメッセージを返す gRPC サーバー アプリケーションです。helloworld
サービスは、クラスタのポート 8080 で gRPC サービスを公開します。
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
ファイル
grpc-td-helloworld.yaml
を適用します。kubectl apply -f grpc-td-helloworld.yaml
新しい
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..]
アプリケーション Pod が動作していることを確認します。
kubectl get pods -n default
出力 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 サービス メッシュを構成します。
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
メッシュ マニフェストを
gke-1
に適用します。kubectl apply -f td-grpc-mesh.yaml
サンプルの
TDMesh
では、TDGRPCRoute
リソースのみに接続が許可されます。このマニフェストでは、許可されるルートの種類を定義します。新しい
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
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
helloworld-route.yaml
マニフェストをgke-1
に適用します。kubectl apply -f helloworld-route.yaml
新しい
helloworld-route
GRPCRoute
リソースが作成されたことを確認します。kubectl get tdgrpcroute -n default
構成を確認する
構成プロセスが完了したら、プロキシレス gRPC クライアントを使用して helloworld
gRPC サーバーに到達できることを確認します。このクライアントは Cloud Service Mesh に接続して helloworld
サービスに関する情報を取得し、この情報を使用してサービスのバックエンドにトラフィックを送信します。
次の例では、grpcurl
ツールを使用して、Cloud Service Mesh がメッシュ内でトラフィックを正しくルーティングしていることを確認します。クライアント Pod を作成してから、シェルを開き、シェルから検証コマンドを実行します。
環境変数とブートストラップ ファイルを設定する
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.16.0 imagePullPolicy: IfNotPresent name: grpc-td-init volumeMounts: - name: grpc-td-conf mountPath: /tmp/bootstrap/ volumes: - name: grpc-td-conf emptyDir: medium: Memory
gke-1
に Pod マニフェストを適用します。kubectl apply -f grpc-client.yaml
Pod の準備ができたら、クライアント Pod へのシェルを開きます。
kubectl exec -it static-sleeper -- /bin/sh
grpcurl
ツールは、プロキシレス gRPC クライアントとして使用できます。grpcurl
ツールは、環境変数とブートストラップ情報を使用して Cloud Service Mesh に接続します。ツールは、次に Cloud Service Mesh で構成された helloworld
サービスについて学習します。
grpcurl
ツールを使用して構成を確認するには:
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
サービス 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 クライアントが Cloud Service Mesh に正常に接続し、xds
ネームリゾルバを使用して helloworld
サービスのバックエンドについて学習していることを確認します。クライアントは、IP アドレスの把握や DNS 解決の実行なしに、サービスのバックエンドの 1 つに対してリクエストを送信しています。