gpt4 book ai didi

java - 如何通过 Kubernetes 管理的 Docker 容器连接到 JMX?

转载 作者:行者123 更新时间:2023-11-30 10:35:35 31 4
gpt4 key购买 nike

我正在尝试使用 JConsole、Java Mission Control 等客户端在我的 Java 应用程序(Java 8 和 Spring Boot 1.4 和 Tomcat)上连接到我定义为 1099(默认值)的 JMX 端口,或 Java 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 IP。我尝试使用以下服务 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 来解决这个问题.我进入了实际的容器和 pod 并运行了

netstat -tulpn

查看打开的端口,我确认打开的端口只有 8443(我的应用程序正在运行)和 1099(JMX 端口);这表明我的类(class)有效。我还确保端口 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 IP)服务已部署。

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

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

编辑 1: 我已经做了一些额外的研究,也许一个可选的 JMXMP 而不是 RMI 可能会起作用?有没有人在 Tomcat 上使用过这个?

最佳答案

jmx 远程连接使用起来很痛苦,在我看来代理它是不可能的。我有类似的问题,最后我只是使用 jolokia 连接。

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

关于java - 如何通过 Kubernetes 管理的 Docker 容器连接到 JMX?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41069686/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com