原文地址
在利用 VisualVm 和 JMX 远程监控 Java 进程和 VisualVm 利用 SSL 连接 JMX 的方法里介绍了如何使用 VisualVm+JMX 监控远程 Java 进程的方法。那么如何监控一个运行在 K8S 集群中的 Java 进程呢?其实大致方法也是类似的。
非 SSL JMX 连接
如果采用非 SSL JMX 连接,那么你只需要这么几步就可以让你本地的 VisualVm 连接到 K8S 集群里的 Java 进程了。
Step1 修改 Deployment.yaml,添加以下 System Properties
-Dcom.sun.management.jmxremote
-Dcom.sun.management.jmxremote.authenticate=false
-Dcom.sun.management.jmxremote.ssl=false
-Dcom.sun.management.jmxremote.port=1100
-Dcom.sun.management.jmxremote.rmi.port=1100
-Djava.rmi.server.hostname=localhost
注意,-Djava.rmi.server.hostname 一定要设置成 localhost
Step2 修改 Deployment.yaml,添加 Container Port
containers:
– name: …
image: …
ports:
– containerPort: 1100
name: tcp-jmx
Step3 部署 Deployment
Step4 利用 kubectl 转发端口
kubectl -n <namespace> port-forward <pod-name> 1100
Step5 启动 VisualVm,创建 JMX 连接 localhost:1100
SSL JMX 连接
启用 SSL JMX 连接,那么需要增加三个步骤,步骤就稍微复杂一些,假设你已经根据 VisualVm 利用 SSL 连接 JMX 的方法创建好了 java-app 和 visualvm 的 keystore 和 truststore。
Step1 创建一个 Secret 包含 java-app.keystore 和 java-app.truststore
kubectl -n <namespace> create secret generic jmx-ssl \
–from-file=java-app.keystore \
–from-file=java-app.truststore
Step2 修改 Deployment.yaml,把 Secret 挂载到容器内的 /jmx-ssl 目录下
containers:
– name: …
image: …
volumeMounts:
– name: jmx-ssl-vol
mountPath: /jmx-ssl
volumes:
– name: jmx-ssl-vol
secret:
secretName: jmx-ssl
Step3 修改 Deployment.yaml,添加以下 System Properties
-Dcom.sun.management.jmxremote
-Dcom.sun.management.jmxremote.port=1100
-Dcom.sun.management.jmxremote.rmi.port=1100
-Dcom.sun.management.jmxremote.authenticate=false
-Dcom.sun.management.jmxremote.ssl=true
-Dcom.sun.management.jmxremote.registry.ssl=true
-Dcom.sun.management.jmxremote.ssl.need.client.auth=true
-Djavax.net.ssl.keyStore=/jmx-ssl/java-app.keystore
-Djavax.net.ssl.keyStorePassword=<keystore password>
-Djavax.net.ssl.trustStore=/jmx-ssl/java-app.truststore
-Djavax.net.ssl.trustStorePassword=<truststore password>
-Djava.rmi.server.hostname=localhost
注意,-Djava.rmi.server.hostname 一定要设置成 localhost
Step4 修改 Deployment.yaml,添加 Container Port
containers:
– name: …
image: …
ports:
– containerPort: 1100
name: tcp-jmx
…
Step5 部署 Deployment
Step6 利用 kubectl 转发端口
kubectl -n <namespace> port-forward <pod-name> 1100
Step7 启动 VisualVm,创建 JMX 连接 localhost:1100
jvisualvm -J-Djavax.net.ssl.keyStore=<path to visualvm.keystore> \
-J-Djavax.net.ssl.keyStorePassword=<visualvm.keystore 的密码 > \
-J-Djavax.net.ssl.trustStore=<path to visualvm.truststore> \
-J-Djavax.net.ssl.trustStorePassword=<visualvm.truststore 的密码 >
K8S 样例配置文件
相关 K8S 样例配置文件在这里(用 tomcat 做的例子)。