多个应用程序节点如何在kubernetes中暴露jmx?

  1. kubernetes我可以暴露与service 。 这可以。
  2. 可以说我有1个Web实例和10个Java服务器实例。
  3. 我有一个Windows网关,我习惯通过安装在它上面的jconsole来访问这10个Java服务器实例。
  4. 显然,我不通过kubernetes服务公开所有的应用程序jmx端口。

我在这里有什么select? 我应该如何让这个外部的kubernetes集群windows网关访问那10台服务器的jmx端口? 这里的任何做法?

另一个select是转发JMX端口从K8吊舱到您的本地PC与kubectl端口转发

我这样做:

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 

这里的关键部分是:

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

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

2)。 通过kubectl将JMX端口(1099)转发到您的looptionscal PC:

 kubectl port-forward <your-app-pod> 1099 

3)。 打开jconsole连接到您的本地端口1099:

 jconsole 127.0.0.1:1099 

这样做是因为可以通过JMXdebugging任何Java Pod,而无需通过K8服务(从安全angular度来看更好)公开地公开JMX。

我们以下面的方式做了

  1. 为每个吊舱添加一个唯一的标签。 例如:podid = asdw23443
  2. 用select器podid = asdw23443创build一个新的服务。 确保在服务中通过nodeport或loadbalancer公开了pod上的jmx端口。

如果您select服务中的nodeport,因为您正在执行NAT操作,您可能必须为每个需要通过jconsole连接的jvm提供以下JVM参数

 -Djava.rmi.server.hostname=<your-ip-address> 

我想一种方法是使用唯一的string\ id为pod添加一个标签(例如pod_name),并使用expose命令创build一个新的服务,并使用此唯一id \string的select器。

 kubectl label pods <podname> podname=<podname> kubectl expose pod <podname> --port=9010 --name=<podname>_jmx