JConsole、Java Mission Controlなどのクライアントを使用して、Javaアプリケーション(Java 8とSpring Boot 1.4およびTomcat)で1099(デフォルト)を定義したJMXポートに接続しようとしていますが、またはJava VisualVMは、私はエラーに達しています:私は、正確なホストIPを隠しKubernetesが管理するDockerコンテナを使用してJMXに接続するにはどうすればよいですか?
java.rmi.ConnectException: Connection refused to host: 10.xxx.xxx.xx, nested exception is:
java.net.ConnectException: Connection timed out
...
注意が、それは私のサービスが展開されて、特定のKubernetes管理のドッカーコンテナのポッドIPである私が試してみてください。
jconsole service:jmx:rmi://<nodeIP>:<nodePort>/jndi/rmi://<nodeIP>:<nodePort>/jmxrmi
私はJMXがrandom high portを開くことを知っている:以下のサービスのURLを使用してJMXポートに接続するには私はcustom @Configuration class that forces that high port to also serve on port 1099を含めることでそれを解決しようとしました。私は、実際のコンテナとポッドに入ったと開かれているポートを確認するために
netstat -tulpn
を走った、と私は開いたポートのみが(私のアプリケーションが実行されている)8443および1099であることを確認しているしている(JMXポート);これは私のクラスが動作することを示します。また、ポート1099がKubernetes側で開かれていることを確認しました。 JMXリモート接続を取り巻く
として多くの答えが示唆している、私は無駄に次のJavaオプションの多くのバリエーションを試してみました:
-Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.port=1099 -Dcom.sun.management.jmxremote.jmi.port=1099 -Djava.rmi.server.hostname=0.0.0.0
答えがにJMXポートおよびRMIレジストリポートを強制的に示唆しています同じであるが、これらのどれも働いていない。
私は、ホスト名(-Djava.rmi.server.hostname = 0.0.0.0でダイナミックにしようとすると)が毎回作成される異なるホスト名(ポッドIP)に解決できないため、私のサービスが展開されます。
このように、サービスが展開された後にKubernetesが割り当てているホスト名をJMXが認識できないため、接続が完了できないように見えます。
JMXがKubernetesホスト名を認識する方法はありますか?あるいは、Kubernetesがデプロイしたサービスを通じてJMXポートにリモートで接続する方法がありますか?
EDIT 1:私はいくつかの追加調査を行いましたが、RMIの代わりにオプションのJMXMPが機能するかもしれませんか? Tomcatを使ってこれを手に入れた人はいますか?
あなたが聞いているかどうかをテストするために 'kubectl port-forward [podname] 1099:1099'を使ってみましたか? – 3ocene
また、[10.xxx.xxx.xxxのIPの範囲は予約されています](https://en.wikipedia.org/wiki/Private_network)。これはパブリックIPではないため、接続できない可能性があります。おそらくノードのIPアドレスを介してポッドに話すためのサービスと入力を設定する必要があります。 – 3ocene
@ 3oceneポートフォワードは私たちの場合はオプションではありません。私たちは状況のためにノードポートを使用できる必要があります。 10.xxx.xxx.xxxアドレスはプライベートIPであり、クラスタはプライベートネットワークの一部です。クラスタ内のノードからpodIP:1099へのsshトンネルと接続は動作しますが、node:nodePortでは動作しません。 – realgenob