Kubernetes の Pod で、クラスタの内部にだけ公開している gRPC の管理 API があり、それをクラスタの外から叩きたいことがありました。このようなとき、ポートフォワードが候補になります。
kubectl port-forward pod/mypod 15051:50051
https://kubernetes.io/docs/reference/kubectl/generated/kubectl_port-forward
上記のポートフォワードのコマンドを実行するとシェルが待ち状態になり、次のコマンドを実行することができません。シェルスクリプトなどで自動化をするときに不便です。
そんなときには以下のように、ポートフォワードのコマンドをバックグラウンドで実行します。
kubectl port-forward pod/mypod 15051:50051 & PF_PID=$!
こうすることで、同じシェルで別のコマンドが実行できます。
docker run --rm fullstorydev/grpcurl \
grpcurl -plaintext host.docker.internal:15051 my.service.Admin/HealthCheck
処理が終わったらポートフォワードのプロセスを終了させます。
kill $PF_PID
シェルスクリプトにする場合は trap を使って、スクリプト終了時にポートフォワードを終了させるようにするのがおすすめです。
kubectl port-forward pod/mypod 15051:50051 & PF_PID=$!
trap "kill $PF_PID" EXIT