【问题标题】:Monitor dockerised Spring Boot application internals via JMX behind a Kubernetes cluster with VisualVM使用 VisualVM 通过 Kubernetes 集群后面的 JMX 监控 dockerised Spring Boot 应用程序内部
【发布时间】:2020-10-03 15:18:16
【问题描述】:

我想在 Docker 中为我的 Spring Boot 应用程序监控 JVM 的内部结构,该应用程序在 Kubernetes 集群中作为 pod 运行。但是即使花费了相当长的时间,我也无法在任何地方找到令人满意的答案。 我尝试在this 上引用已接受的答案,但它仅在我的 docker 在本地运行时才连接,并且在 Kubernetes 集群后面时停止连接。

【问题讨论】:

    标签: spring-boot docker kubernetes jmx visualvm


    【解决方案1】:

    假设我想在我的应用在 8000 上提供服务时在端口 8001 上进行监控。 在本地运行 Docker 并将端口 8001 从我的本地映射到 Docker(-p 8001:8001)

    -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 集群中的 pod。我找到了this,但我的要求是在不通过服务的情况下进行监控,然后通过阅读其他几篇文章我得到了它的工作,因此整理以下这些步骤以节省某人的时间:-

    1. 删除了上述启动脚本中提到的 VM 选项
    2. 更新了我的 application.yaml,如下所示,我启用了 jmx 并添加了运行 JMXMP 连接器服务器的 url
    spring:
      application:
        name: stack-application
      jmx:
        enabled: true
        url: service:jmx:jmxmp://localhost:8001/
    server:
      port: 8000
    
    1. 将部署块下的 Kubernetes 部署 YAML 更新为:
    apiVersion: apps/v1
    kind: Deployment
    ----your content----
              ports:
                - name: stack-app-port
                  containerPort: 8000
                - name: stack-jmx-port
                  containerPort: 8001
    
    1. 在我的 pom.xml 中添加了以下依赖项,用于下载 JMXMP,因为经过研究后我得出结论,通过 RMI 进行 JMX 监控是一项艰巨的工作,因此每个人都建议使用 JMXMP。
            <dependency>
                <groupId>org.glassfish.main.external</groupId>
                <artifactId>jmxremote_optional-repackaged</artifactId>
                <version>5.0</version>
            </dependency>
    
    1. 创建了一个新类 ConnectorServiceFactoryBeanProvider,它从我们的 application.yaml 中获取 URL
    @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;
        }
    }
    
    1. 在 Kubernetes 上构建和部署您的 docker,并找出 pod 的 IP 地址。您可以在 CLI 上使用 kubectl describe pod
    2. 现在要启动 VisualVM,我们还需要将上面下载的 JMXMP jar 添加到类路径中。我创建了一个别名来做同样的事情,因为 JAR 是在我的本地 .m2 目录中下载的,所以命令看起来像这样:-
    alias viz='jvisualvm -cp "$JAVA_HOME:~/.m2/repository/org/glassfish/main/external/jmxremote_optional-repackaged/5.0/jmxremote_optional-repackaged-5.0.jar"'
    
    1. 现在,执行“viz”或您的别名,它将启动 Java 附带的 Visual VM 应用程序。
    2. 点击VisualVM工具栏中的+JMX图标或转到(文件->添加JMX连接...)添加链接
    service:jmx:jmxmp://<IP address obtained in step 6 above>:8001
    

    并选中“不需要 SSL 连接”。点击 OK 后,您应该会在一段时间后在 VisualVM 上看到您的远程应用程序内部结构。下面附上截图。

    VisualVM screenshot monitoring remote app on 8001

    【讨论】:

    • 太好了,这是我在任何地方都能找到的唯一解决方案。非常感谢!
    猜你喜欢
    • 2020-05-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-16
    • 1970-01-01
    • 2016-02-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多