使用 AdoptOpenJDK OpenJ9 在 Kubernetes 上拒绝 JMX 连接

JMX Connection refused on Kubernetes with AdoptOpenJDK OpenJ9

我的团队正在尝试将微服务迁移到 openj9,它们 运行 在 kubernetes 上。但是,我们在 JMX 的配置上遇到了问题。 (openjdk8-openj9) 当我们尝试与 jvisualvm 连接(以及与 Kubernetes 的端口转发)时,我们遇到了连接被拒绝的情况。 除了从 Hotspot 切换到 OpenJ9 之外,我们没有更改配置。

错误:

E0312 17:09:46.286374   17160 portforward.go:400] an error occurred forwarding 1099 -> 1099: error forwarding port 1099 to pod XXXXXXX, uid : exit status 1: 2020/03/12 16:09:45 socat[31284] E connect(5, AF=2 127.0.0.1:1099, 16): Connection refused

我们使用的 java 选项:

-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

我们正在使用最后一张 adoptopenjdk/openjdk8-openj9 docker 图片。 你有什么想法吗?

谢谢!

此致。

我设法弄清楚为什么它不起作用。 事实证明,为了将 JMX 选项传递给我们在 YAML 中使用 Kubernetes 服务描述符的服务。它看起来像这样:

  - name: _JAVA_OPTIONS
        value:  -Dzipkinserver.listOfServers=http://zipkin:9411 -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

我意识到当应用程序未使用 docker 容器中的 ENTRYPOINT 启动时,_JAVA_OPTIONS 未考虑 JMX 属性。 所以我像这样将属性直接传递到 Dockerfile 并且它有效。

CMD ["java", "-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", "-cp","app:app/lib/*","OurMainClass"]

也可以保留 _JAVA_OPTIONS 并在 docker 文件中设置一个入口点。

谢谢!