🚁

GKE上にあるgRPCサービスへローカル環境からリクエストを送る方法

2022/08/16に公開

はじめに

Magic Momentでバックエンドをメインに開発している浅野です。
「外部公開していないGKE上のgRPCサービスに直接リクエストしたい」ときはありませんか。

先日弊社の開発業務のなかで、検証のためにgRPCのインターフェースからのレスポンスを確認したいことがありました。
しかし、弊社のサービスMagic Moment Playbookでは、gRPC通信はk8sのネットワーク内で行うマイクロサービス間通信でしか利用していないので外部に公開していません。
とはいえ、local環境ではデータを用意しにくく、直接開発環境のサービスにgRPC通信して検証したい。

local環境に直接リクエストするにはlocalで稼働しているgRPCサービスに対して直接リクエストを送ればよいのですが、GKE上にデプロイされている環境のサービスは口が公開されておらず通常直接アクセスできません。
しかし、kubectlのポートフォワード機能を利用することで、直接GKE上のpodにgRPC通信でリクエストを送ることができたので本記事でご紹介いたします。

kubectlのセットアップ

1. kubectlのインストール

まずはkubectlをインストールします。
kubectlは、Kubernetesを扱うコマンドラインツールです。

$ brew install kubectl

参考:kubectlのインストールおよびセットアップ

2. バージョン確認

ポートフォワードを利用して、Kubernetesサーバに接続するにはバージョンv1.10以降である必要があるようです。
コマンドの動作確認ついでにバージョンを確認してみます。

$ kubectl version 

Client Version: version.Info{Major:"1", Minor:"24", GitVersion:"v1.24.2", GitCommit:"f66044f4361b9f1f96f0053dd46cb7dce5e990a8", GitTreeState:"clean", BuildDate:"2022-06-15T14:14:10Z", GoVersion:"go1.18.3", Compiler:"gc", Platform:"darwin/arm64"}
Kustomize Version: v4.5.4

コマンドも無事実行でき、バージョンの問題もなさそうです。

3. GKEクラスタ情報を取得して設定

kubectlを実行する対象のクラスタを設定する必要があります。
下記のコマンドを実行しましょう。

$ gcloud container clusters get-credentials <cluster> --region <region> --project <project>

Fetching cluster endpoint and auth data.
kubeconfig entry generated for <cluster>.

上記を実行すると $HOME/.kube/config が作成され、GKEの特定のクラスタのkubeconfigを指すように適切なクレデンシャルとエンドポイント情報が書き込まれます。
すでにファイルが存在する場合は更新されます。

4. contextの確認

問題なく設定が反映されているか、現在のcontextを確認します。
contextとは下記を組み合わせたものです。

  • クラスタの情報
  • ユーザ
  • ネームスペース

この組み合わせでどのクラスタに接続するかが決まります。

$ kubectl config current-context

<context名>

適当なcontextが設定されているのが確認できればOKです。

異なる場合はcontextを変更しましょう。
下記が参考になると思います。

参考:kubectlチートシート - Kubectlコンテキストの設定

ポートフォワードを実行

さあ、準備ができたところでポートフォワードを実行しましょう!

$ kubectl port-forward <pod などのリソース名> <host-port>:<pod-pord> 

Forwarding from 127.0.0.1:<host-port> -> <pod-pord> 

設定やportに誤りがなければ、上記のコマンドの実行によってホストとpodが繋がるはずです。
あとは、<host-port>に向けてgRPCでリクエストを送ってみましょう。

参考:Use Port Forwarding to Access Applications in a Cluster

開けたポートにリクエストを送る

gRPCクライアントツールを使って先ほど繋げた<host-port>に向けてリクエストを送ってみましょう。
CLI、GUIお好みでどうぞ。

CLI:gRPCurl
GUI:BloomRPC

ここではツールの詳細な説明は割愛させていただきますが、どちらも簡単に使えます。

gRPCurl

# json形式でリクエストを送る
$ grpcurl --plaintext  -d '
{
    "user":
    {
        "id": "hoge",
        "name": "fuga"
    }
}' localhost:<host-port> <サービス名>/<メソッド名>

# json形式でレスポンスが返ってくる
{
  "foo": "bar"
}

BloomRPC

サンプル程度の画像ですが、非常にわかりやすいUIなのはお分かりいただけるかと思います。
broomrpc.png

おわりに

いかがでしたでしょうか。
思っている以上に簡単にGKE上のサービスにもgRPCでリクエストを送ることができますね。

ぜひ快適な開発ライフを!

最後に

弊社 Magic Moment では、フロントエンド・バックエンドにかかわらず全方位的にエンジニアを募集中です!Magic Momentに少しでも興味を持っていただけたら是非エントリーください!

8/30にはFindy様主催のイベントにMagic Momentから石田さんが登壇されます!
よろしければぜひご視聴ください!

さらに、こちらのイベントも8/29開催予定です!こちらはオンラインイベントです。Magic Momentの開発がどんなものか興味を持っていただいた方は是非ご参加ください!

Discussion