多个应用程序节点如何在kubernetes中暴露jmx?
- 在
kubernetes
我可以暴露与service
。 这可以。 - 可以说我有1个Web实例和10个Java服务器实例。
- 我有一个Windows网关,我习惯通过安装在它上面的jconsole来访问这10个Java服务器实例。
- 显然,我不通过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。
我们以下面的方式做了
- 为每个吊舱添加一个唯一的标签。 例如:podid = asdw23443
- 用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