利用VisualVm和JMX遠端監控K8S裡的Java程式

店家小二發表於2018-12-17

利用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-appvisualvm的keystore和truststore。

Step1 建立一個Secret包含java-app.keystorejava-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做的例子)。

本文轉自中文社群-利用VisualVm和JMX遠端監控K8S裡的Java程式


相關文章