クライアントからサーバーにgRPC接続する際に以下のようなコードを書くと思います。ローカル環境で開発する際はSERVER_URLとしてlocalhost:ポート番号を指定すれば良かったのですが、Kubernetesにデプロイする際に何を指定すればよいのかについて説明します。terraformで構築するものとして説明します。
client.go
conn, err := grpc.Dial(os.Getenv("SERVER_URL"), grpc.WithTransportCredentials(insecure.NewCredentials()))
解決法
まず、サーバー側のアプリケーションのサービスを以下のように作ります。「cluster_ip = "None"」とするのが重要です。自分は「type = "NodePort"」としていて色々試してずっとうまくいきませんでし。。。
server_service.tf
resource "kubernetes_service_v1" "server_service" {
metadata {
name = "server-service"
namespace = "namespace1"
・
・
・
spec {
・
・
・
port {
name = "http"
port = 80
target_port = 8000
}
cluster_ip = "None"
・
・
・
}
}
}
次に、クライアント側のSERVER_URLの環境変数を以下のように設定します。
client_deployment.tf
resource "kubernetes_deployment_v1" "client_deployment" {
metadata {
name = "client_deployment"
namespace = "namespace1"
labels = {
app = "client_deployment"
}
}
・
・
・
spec {
・
・
・
template {
・
・
・
spec {
・
・
・
container {
・
・
・
env {
name = "SERVER_URL"
value = "server-service.namespace1.svc.cluster.local:8080"
}
・
・
・
}
以上でKubernetesでもgRPC通信ができるようになりました。
参考