kubernetes
,我可以用service
公开服务。这可以。我有什么选择?我应该如何允许这个外部的kubernetes集群windows网关访问那些10个服务器的jmx端口?有什么做法吗?
另一个选择是使用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
这里的关键部分是:
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。
我们是按照以下方式做到的
如果您在服务中选择nodeport,因为您正在执行NAT操作,您可能必须为每个需要通过jconsole连接的jvm提供以下JVM参数
-Djava.rmi.server.hostname=<your-ip-address>
我认为一种方法是使用唯一的字符串\ id为pod添加标签,例如pod_name,并使用expose命令创建一个具有此唯一id \ string选择器的新服务。
kubectl label pods <podname> podname=<podname>
kubectl expose pod <podname> --port=9010 --name=<podname>_jmx
添加到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。一世