通过具有VisualVM的Kubernetes集群通过JMX监视dockerized Spring Boot应用程序内部信息

问题描述 投票:2回答:1

我想在Docker中监视我的Spring Boot应用程序的JVM内部,该Docker在Kubernetes集群中作为Pod运行。但是即使花了很多时间,我也找不到任何满意的答案。我尝试在this上引用接受的答案,但仅在我的docker在本地运行时才连接,而在Kubernetes集群后面时则停止连接。

spring-boot docker kubernetes jmx visualvm
1个回答
1
投票

假设我的应用程序在8000上运行时,我想在端口8001上进行监控。在本地运行Docker并将端口8001从我的本地映射到Docker(-p 8001:8001)时,将它们添加到我的VM选项工作正常(VisualVM正在显示此监视过程)

-Dcom.sun.management.jmxremote \
-Djava.rmi.server.hostname=localhost \
-Dcom.sun.management.jmxremote.port=8001 \
-Dcom.sun.management.jmxremote.rmi.port=8001 \
-Dcom.sun.management.jmxremote.local.only=false \
-Dcom.sun.management.jmxremote.authenticate=false \
-Dcom.sun.management.jmxremote.ssl=false

但是它不能在远程Kubernetes Cluster中的pod上工作。我找到了this,但我的要求是不通过Service进行监视,然后阅读其他几篇文章,使它正常运行,因此整理以下步骤以节省时间:-

  1. 上面启动脚本中提到的已删除VM选项
  2. 如下更新我的application.yaml,其中启用了jmx并添加了用于运行JMXMP Connector服务器的URL
  3. spring:
      application:
        name: stack-application
      jmx:
        enabled: true
        url: service:jmx:jmxmp://localhost:8001/
    server:
      port: 8000
    
  1. 在“部署”块下将我的Kubernetes部署YAML更新为:
  2. apiVersion: apps/v1
    kind: Deployment
    ----your content----
              ports:
                - name: stack-app-port
                  containerPort: 8000
                - name: stack-jmx-port
                  containerPort: 8001
    
  1. 在我研究后得出结论,对RMI进行JMX监视是一项艰巨的工作,因此JMXMP是每个人的建议。
    JMXMP
    1. [创建了一个新类 <dependency> <groupId>org.glassfish.main.external</groupId> <artifactId>jmxremote_optional-repackaged</artifactId> <version>5.0</version> </dependency> ,该类从我们的application.yaml中获取URL
    ConnectorServiceFactoryBeanProvider
    1. 在Kubernetes上构建并部署docker,并找到pod的IP地址。您可以在CLI上使用@Configuration public class ConnectorServiceFactoryBeanProvider { @Value("${spring.jmx.url}") private String url; @Bean public ConnectorServerFactoryBean connectorServerFactoryBean() throws Exception { final ConnectorServerFactoryBean connectorServerFactoryBean = new ConnectorServerFactoryBean(); connectorServerFactoryBean.setServiceUrl(url); return connectorServerFactoryBean; } } 。>
    2. 现在启动VisualVM,我们还需要在类路径中添加以上下载的JMXMP jar。我创建了一个别名来执行相同的操作,并且由于JAR已下载到本地.m2目录中,因此命令如下所示:-
    kubectl describe pod
    1. 现在,执行“ viz”或您的别名,它将启动Java附带的Visual VM应用程序。
    2. 单击VisualVM工具栏中的+ JMX图标,或转到(文件->添加JMX连接...)添加链接
    alias viz='jvisualvm -cp "$JAVA_HOME:~/.m2/repository/org/glassfish/main/external/jmxremote_optional-repackaged/5.0/jmxremote_optional-repackaged-5.0.jar"'
    

    并选中“不需要SSL连接”。单击确定后,您将在一段时间内在VisualVM上看到您的远程应用程序内部。屏幕截图如下。

    service:jmx:jmxmp://<IP address obtained in step 6 above>:8001

© www.soinside.com 2019 - 2024. All rights reserved.