はじめに
Google Kubernetes Engine + Java (Spring Boot)環境における、jvisualvmの利用方法について試したことを記載しています。
環境
+--------+ +-------------------------+ +-----------------------+
| | | | | |
| PC | +--> | GCE: tunnel serever | +-> | GKE: applications |
| | | | | |
+--------+ +-------------------------+ +-----------------------+
- PC:GCEにssh接続可能なマシン。PCにてjconsole,jvisualvmを実行する。
- tunnel serverは、GKEと同一ネットワーク(通信可能なネットワーク)に存在する適当なインスタンス。Cent OS 7。
- GKE:applicationsは、
openjdk:8u171-jre-alpine
ベースのcontainerイメージを利用している。
※コンテナ内に、jps,jconsoleコマンドが存在しない。
この前提となるSpring Bootアプリケーションは、、https://github.com/h-r-k-matsumoto/spring-boot-sample となります。jibを使ってdockerイメージまで作成しちゃっています。
細かい設定などは、上記アプリケーションのpom.xml、kubernetsの設定を参照してください。
事前準備
java起動時オプションの設定
jmxのリモート接続を許可するように設定する必要があります。
起動時オプションとして下記を設定します。
-Dcom.sun.management.jmxremote.port=7199
-Dcom.sun.management.jmxremote.rmi.port=7199
-Dcom.sun.management.jmxremote.authenticate=false
-Dcom.sun.management.jmxremote.ssl=false
※jibを使う場合は
https://github.com/h-r-k-matsumoto/spring-boot-k8s-jib/blob/master/pom.xml#L67-L70
を参考にしてください。
podのIP確認
podのipを確認しておく必要があります。
kubectl get pod -o wide
コマンドにて各podのipを確認しておきます。
$ kubectl get pod -o wide
NAME READY STATUS RESTARTS AGE IP NODE
spring-boot-sample-7d4448cf7b-9nh8v 1/1 Running 0 29m 10.36.2.8 gke-cluster-example-default-pool-26c288d4-vn4x
spring-boot-sample-7d4448cf7b-czqpj 1/1 Running 0 29m 10.36.1.5 gke-cluster-example-default-pool-26c288d4-mcdh
$
以降に記載する手順は、監視対象のアプリケーションのIPとして 10.36.2.8
として記載しています。
ツールの利用
sshでトンネル接続
下記コマンドにて、PCとtunnel serverの接続を行います。
--
の前のコマンド部分は、Google Cloud Consoleにて[Compute Engine]→[VMインスタンス]→[SSH]→[gcloudコマンドを表示]からコピペすればOKです。
--
の後ろのコマンドは、通常のsshコマンドのオプションです。7199に対する動的ポート転送となります。
$ gcloud compute --project xxxxx ssh --zone xxxxx "tunnnel-server" -- -N -D 7199
jvisualvmでの接続
- 下記コマンドでjvisualvmを起動します。
$ jvisualvm -J-DsocksProxyHost=localhost -J-DsocksProxyPort=7199 -J-DsocksNonProxyHosts=
- [リモートホストを追加]をクリックします。
-
podのIP確認 で確認したIPを入力します。
- [JMX接続を追加]をクリックします。
- 接続として、
10.36.2.8:7199
を入力します。これ以外はデフォルトのままで大丈夫です。
- [開く]をクリックします。
- これで接続環境です。CPUプロファイリングなども問題なく利用できます。
参考
- https://cloud.google.com/community/tutorials/ssh-tunnel-on-gce
- https://docs.oracle.com/javase/jp/8/docs/technotes/guides/net/proxies.html
- https://docs.oracle.com/javase/jp/8/docs/technotes/tools/windows/jvisualvm.html
- https://github.com/GoogleContainerTools/jib
- https://github.com/h-r-k-matsumoto/spring-boot-sample