使用jvm監控工具(jconsole、jvisualvm)通過jmx遠程連接kubernetes上的java應用

      隨着kubernetes大火,工作中部署應用都上了kubernetes,當java應用出現oom時,就需要通過一些jvm監控工具來輔助分析java的堆棧,查出有內存泄漏的代碼,如果java應用的鏡像中安裝的jdk環境有jmap、jstat還好,但是沒有的話怎麼辦呢?使用過jconsole或jvisualvm的同學應該都知道,在連接jvm進程時可以選擇連接本地進程或者遠程jvm進程。 如果遠程的jvm進程是直接在虛機上運行,那麼通過以下配置是可以直接讓本地的jconsole連接的:

完整配置:
-Djava.rmi.server.hostname=<ip>   指定jmx socket服務綁定的ip,必須保證遠程客戶端能夠訪問
-Dcom.sun.management.jmxremote.rmi.port=<port> 指定jmx socket監聽端口
-Dcom.sun.management.jmxremote.host=<ip or hostname> 指定rmi socket服務綁定的網卡
-Dcom.sun.management.jmxremote.port=<port> 指定rmi socket綁定的端口
-Dcom.sun.management.jmxremote.ssl=false 關閉SSL驗證
-Dcom.sun.management.jmxremote.authenticate=false 關閉遠程登錄認證,即允許任何用戶連接

最小配置:
-Dcom.sun.management.jmxremote.rmi.port=<port> 指定jmx socket監聽端口
-Dcom.sun.management.jmxremote.port=<port> 指定rmi socket綁定的端口
-Dcom.sun.management.jmxremote.ssl=false 關閉SSL驗證
-Dcom.sun.management.jmxremote.authenticate=false 關閉遠程登錄認證,即允許任何用戶連接


說明:
     1、rmi服務的監聽端口可以與jmx服務配置同一個端口,便於防火牆端口配置
     2、不指定rmi socket服務綁定的網卡ip時,會根據機器名稱(hostname -i可查看)獲取網卡,如果沒有在/etc/hosts文件中配置機器名稱解析到網卡ip,則java程序啓動會報錯。

使用本地的jconsole工具添加遠程jmx時,填入遠程虛機<ip>:<port>即可成功連接。

如果遠程的jvm進程運行在kubernetes集羣容器中,則與本地的java應用啓動參數稍有不同,配置如下:


-Djava.rmi.server.hostname=<ip>   指定jmx socket服務綁定的ip,必須保證遠程客戶端能夠訪問,因此配置爲集羣節點ip即可
-Dcom.sun.management.jmxremote.rmi.port=<port> 指定jmx socket監聽端口
-Dcom.sun.management.jmxremote.host=<ip or hostname> 指定rmi socket服務綁定的網卡,由於在kubernetes集羣中應用容器的名稱是隨機的,因此不需要指定該參數,默認會取容器名稱,在容器內的hosts文件中已有容器名稱解析到容器ip
-Dcom.sun.management.jmxremote.port=<port> 指定rmi socket綁定的端口
-Dcom.sun.management.jmxremote.ssl=false 關閉SSL驗證
-Dcom.sun.management.jmxremote.authenticate=false 關閉遠程登錄認證,即允許任意用戶訪問

說明:rmi socket監聽端口可以跟jmx socket監聽端口配置同一個,同時在nodeport暴露外部端口時也必須指定與容器中rmi socket監聽端口一致,因爲客戶端訪問時是先連接到rmi服務,然後通過rmi服務查詢到jmx的地址,然後客戶端再請求jmx服務,所以rmi、jmx、nodeport三個端口配置成相同時最方便。

使用本地的jconsole工具添加遠程jmx時,由於rmi的端口通過NodePort的方式暴露外部訪問,所以填入kubernetes集羣中任意節點ip以及NodePort暴露的端口即可成功連接<nodeip>:<nodeport>

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章