我正在尝试连接到我的Java应用程序(Java 8和SpringBoot1.4和Tomcat)上定义为1099 (默认情况下)的JMX端口,它使用JConsole、JConsole或VisualVM等客户端,但我遇到了一个错误:
java.rmi.ConnectException: Connection refused to host: 10.xxx.xxx.xx, nested exception is:
java.net.ConnectException: Connection timed out
...请注意,我隐藏了确切的主机IP,但部署我的服务的是特定Kubernetes管理的Docker容器的pod。我尝试使用以下服务URL连接到JMX端口:
jconsole service:jmx:rmi://<nodeIP>:<nodePort>/jndi/rmi://<nodeIP>:<nodePort>/jmxrmi 我知道JMX打开了一个random high port,我试图通过包含一个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动态)无法解决每次部署我的服务时创建的不同主机名(pod )。
因此,看起来连接无法完成,因为JMX无法看到在部署我的服务之后,Kubernetes分配了什么主机名。
是否有办法让JMX识别Kubernetes主机名?或者,还有其他方法可以通过Kubernetes部署的服务远程连接到JMX端口吗?
编辑1:我做了一些额外的研究,也许一个可选的JMXMP (而不是)可能有效?有人和Tomcat合作过吗?
发布于 2016-12-10 09:36:18
在我看来,jmx远程连接是一个痛苦的工作,代理它是不可能的。我也遇到了类似的问题,最后我只是用罗洛基亚来连接。
Jolokia是一种JMX桥,它为JSR-160连接器提供了一个替代方案。它是一种基于代理的方法,支持许多平台。除了基本的JMX操作之外,它还以独特的特性增强了JMX,比如批量请求和细粒度的安全策略。-> http://jolokia.org
https://stackoverflow.com/questions/41069686
复制相似问题