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

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

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

docker kubernetes kubernetes-service
4个回答
59
投票

另一个选择是使用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

这里的关键部分是:

  • 相同的端口应该用作'jmxremote.port'和'jmxremote.rmi.port'。这只需要转发一个端口。
  • 127.0.0.1应作为rmi服务器主机名传递。这是JMX连接通过端口转发工作所必需的。

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

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

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

jconsole 127.0.0.1:1099

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

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


2
投票

我们是按照以下方式做到的

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

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

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

1
投票

我认为一种方法是使用唯一的字符串\ id为pod添加标签,例如pod_name,并使用expose命令创建一个具有此唯一id \ string选择器的新服务。

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

1
投票

添加到https://stackoverflow.com/a/39927197/1387184,我想一次监视同一个pod的所有实例,因为我们将端口硬编码为1099,因为我只能通过该端口只有一个端口到一个pod,所以很难。

我使用Shell脚本在运行docker时动态分配pod

Dockerfile CMD /run.sh

润.是

JMX_PORT=$(((RANDOM % 20)+1099))

echo "Running JMX on Port $JMX_PORT"

java ``eval echo $JAVA_OPTS`` ...

env: - name: JAVA_OPTS value: "-Xms256m -Xmx6144m -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=$JMX_PORT -Dcom.sun.management.jmxremote.rmi.port=$JMX_PORT -Djava.rmi.server.hostname=127.0.0.1" deployment.yml

eval会将JMX_PORT评估为bash值,每个pod在启动时可能会获得不同的pod。一世

© www.soinside.com 2019 - 2024. All rights reserved.