我如何通过Kubernetespipe理的Docker容器连接到JMX?

我正尝试使用客户端(如JConsole,Java Mission Control或Java)连接到我的Java应用程序(Java 8和Spring Boot 1.4和Tomcat)上定义的1099(默认情况下)的JMX端口VisualVM,但我遇到一个错误:

java.rmi.ConnectException: Connection refused to host: 10.xxx.xxx.xx, nested exception is: java.net.ConnectException: Connection timed out ... 

请注意,我隐藏了确切的主机IP,但它是我的服务部署在特定Kubernetespipe理的Docker容器的Pod IP。我尝试使用以下服务URL连接到JMX端口:

 jconsole service:jmx:rmi://<nodeIP>:<nodePort>/jndi/rmi://<nodeIP>:<nodePort>/jmxrmi 

我知道JMX会打开一个随机的高端口 ,我试图通过包含一个自定义的@Configuration类来强制这个高端口也服务于端口1099 。 我已经进入了实际的容器和荚运行

 netstat -tulpn 

看到打开的端口,我已经证实,唯一打开的端口是8443(我的应用程序正在运行)和1099(JMX端口); 这表明我的class级工作。 我还确保端口1099在Kubernetes方面是开放的,所以这不是什么阻塞它。

由于围绕JMX远程连接的许多答案都有build议,所以我尝试了以下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 

答案build议强制JMX端口和RMIregistry端口是相同的,但没有一个工作。

我认为这个问题可能是因为主机名(我尝试使用-Djava.rmi.server.hostname = 0.0.0.0进行dynamic化)无法parsing为每次部署服务时创build的不同主机名(pod IP) 。

因此,看起来连接无法完成,因为在部署服务后,JMX无法查看Kubernetes分配的主机名。

有没有办法让JMX识别Kubernetes主机名? 或者,有没有其他方式通过Kubernetes部署的服务远程连接到JMX端口?

编辑1:我已经做了一些额外的研究,也许一个可选的JMXMP而不是RMI可能工作? 有没有人得到这个与Tomcat的工作?

jmx远程连接是一个痛苦的工作,代理从我看来是不可能的。 我有类似的问题,最后我只是用jolokia连接。

Jolokia是一个JMX-HTTP桥梁,可以替代JSR-160连接器。 这是一个基于代理的方法,支持许多平台。 除了基本的JMX操作外,它还增强了JMX远程处理function,并具有独特的function,如批量请求和细粒度的安全策略。 – > http://jolokia.org