我如何通过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
- 在Docker容器内的Sensu-Client
- 当外部链接的容器实际上使用docker-compose运行时,如何避免“Docker无法链接到非运行容器”错误
- 创buildAWS Batch Managed Compute Environment将UserData传递给容器实例
- 在一个docker集装箱内运行多个服务
- 如何在AWS Elastic Beanstalk中使用docker tomcat来定制rest服务
- Ansible,从Docker容器运行命令时,mysql连接被拒绝
- docker入口点运行bash脚本得到“权限被拒绝”
- Docker容器无法连接到在本地主机上运行的服务器
- ng服务不在Docker容器中工作