2016-12-09 5 views
2

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を使ってこれを手に入れた人はいますか?

+0

あなたが聞いているかどうかをテストするために 'kubectl port-forward [podname] 1099:1099'を使ってみましたか? – 3ocene

+0

また、[10.xxx.xxx.xxxのIPの範囲は予約されています](https://en.wikipedia.org/wiki/Private_network)。これはパブリックIPではないため、接続できない可能性があります。おそらくノードのIPアドレスを介してポッドに話すためのサービスと入力を設定する必要があります。 – 3ocene

+0

@ 3oceneポートフォワードは私たちの場合はオプションではありません。私たちは状況のためにノードポートを使用できる必要があります。 10.xxx.xxx.xxxアドレスはプライベートIPであり、クラスタはプライベートネットワークの一部です。クラスタ内のノードからpodIP:1099へのsshトンネルと接続は動作しますが、node:nodePortでは動作しません。 – realgenob

答えて

1

jmxリモート接続は、私の視点からはプロキシできない痛みです。私も同様の問題を抱えていました。

Jolokiaは、JSR-160コネクタに代わるJMX-HTTPブリッジです。これは、多くのプラットフォームをサポートするエージェントベースのアプローチです。基本的なJMX操作に加えて、バルクリクエストやきめ細かなセキュリティポリシーなどの独自の機能を備えたJMXリモーティングを強化しています。 - >http://jolokia.org

+0

Jolokiaを共有してくれてありがとう。コンテナにエージェントをインストールしたのですか(Javaアプリケーションに.jarファイルへのパスを引数として与えるように見えます)あるいは、Springのアプリケーションコンテキストがあれば、単純なMaven依存関係を追加しましたか? – Tremaine

+0

私の場合、私は戦争バージョンを使用しています。私の必要性のために非常にうまく動作します。 –

+0

よろしくお願いします。私が持っていた現在の方法で他のすべてが失敗した場合、私はこの道を下るかもしれません。 (ソケットなどの)継続的な監視が必要なのか、それとも単なる要求と応答なのか? – Tremaine

関連する問題