【发布时间】:2022-01-30 03:40:04
【问题描述】:
我在一个 pod 中运行了两个 Kubernetes 容器,分别称为容器 A 和 B。A 运行了一个 JMX 服务器。用于运行服务器的 Java 选项是:
-Dcom.sun.management.jmxremote=true
-Dcom.sun.management.jmxremote.host=127.0.0.1
-Dcom.sun.management.jmxremote.port=1234
-Dcom.sun.management.jmxremote.ssl=false
-Dcom.sun.management.jmxremote.authenticate=false
-Dcom.sun.management.jmxremote.host=localhost 标志是专门设置的,因此 JMX 服务器不会暴露给外部客户端。
容器 B 想通过 localhost only 使用 JMX 监控 A。使用以下代码建立与 A 中 JMX 服务器的连接:
String serverUrl = "service:jmx:rmi:///jndi/rmi://127.0.0.1:1234/jmxrmi";
JMXConnector jmxConnector = JMXConnectorFactory.connect(serviceUrl, null);
MBeanServerConnection mBeanConn = jmxConnector.getMBeanServerConnection();
我希望代码能够毫无问题地运行,因为我能够使用 telnet 从 B 连接到 A 的 JMX 端口。但是,当Java代码运行时,会抛出一个异常,前几行是:
java.rmi.ConnectException: Connection refused to host: 10.8.0.88; nested exception is:
java.net.ConnectException: Connection refused (Connection refused)
at sun.rmi.transport.tcp.TCPEndpoint.newSocket(TCPEndpoint.java:623) ~[na:1.8.0_312]
at sun.rmi.transport.tcp.TCPChannel.createConnection(TCPChannel.java:216) ~[na:1.8.0_312]
at sun.rmi.transport.tcp.TCPChannel.newConnection(TCPChannel.java:202) ~[na:1.8.0_312]
at sun.rmi.server.UnicastRef.invoke(UnicastRef.java:132) ~[na:1.8.0_312]
客户端使用私有 IP 连接到 RMI 服务器,而不是使用 127.0.0.1 连接,并且由于 JMX 服务器仅在 localhost 上侦听而失败。我需要帮助找出允许容器 A 和 B 之间通过 localhost 进行通信的最佳方式。
【问题讨论】:
-
2009 年的 stackoverflow.com/questions/834581/remote-jmx-connection 和 stackoverflow.com/questions/856881/… 以及 2014 年的 stackoverflow.com/questions/27565320 -- 适合那些看起来而不是跌跌撞撞的人。
-
见this Answer末尾的更新。
-
@BasilBourque 与您链接的问题相同。我可能找不到答案,因为我没有搜索关键字 jconsole。感谢您的帮助!