多个app节点如何在kubernetes中公开jmx?

Jas*_*Jas 29 docker kubernetes kubernetes-service

  1. kubernetes我可以公开服务service.这可以.
  2. 假设我有1个Web实例和10个java服务器实例.
  3. 我有一个Windows网关,我用它通过安装在它上面的jconsole访问这10个java服务器实例.
  4. 显然我没有通过kubernetes服务公开所有应用程序jmx端口.

我有什么选择?我应该如何允许这个外部的kubernetes集群windows网关访问那些10个服务器的jmx端口?有什么做法吗?

dan*_*yar 70

另一个选择是使用kubectl port-forward将JMX端口从K8 pod转发到本地PC .

我是这样做的:

1).将以下JVM选项添加到您的应用程序:

-Dcom.sun.management.jmxremote
-Dcom.sun.management.jmxremote.authenticate=false
-Dcom.sun.management.jmxremote.ssl=false
-Dcom.sun.management.jmxremote.local.only=false
-Dcom.sun.management.jmxremote.port=1099
-Dcom.sun.management.jmxremote.rmi.port=1099
-Djava.rmi.server.hostname=127.0.0.1
Run Code Online (Sandbox Code Playgroud)

这里的关键部分是:

  • 相同的端口应该用作'jmxremote.port'和'jmxremote.rmi.port'.这只需要转发一个端口.

  • 127.0.0.1应作为rmi服务器主机名传递.这是JMX连接通过端口转发工作所必需的.

2).通过kubectl将JMX端口(1099)转发到本地PC:

kubectl port-forward <your-app-pod> 1099
Run Code Online (Sandbox Code Playgroud)

3).打开与本地端口1099的jconsole连接:

jconsole 127.0.0.1:1099
Run Code Online (Sandbox Code Playgroud)

这种方式可以通过JMX调试任何Java pod,而无需通过K8服务公开公开JMX(从安全角度来看更好).

另一个可能有用的选项是将Jolokia(https://jolokia.org/)代理附加到容器内的Java进程,以便它通过HTTP端口代理JMX并公开或端口转发此HTTP端口以查询JMX通过HTTP.

  • 这是我遇到过的最直接的解释,而且效果很好。谢谢! (3认同)
  • 我欠你一杯咖啡! (3认同)
  • 设置`-Djava.rmi.server.hostname = 127.0.0.1`可以解决我们的问题。 (2认同)