【问题标题】:Monitor JVM in AWS Fargate在 AWS Fargate 中监控 JVM
【发布时间】:2020-02-19 11:40:21
【问题描述】:

我目前一直在尝试将 VisualVM(一个监控 JVM、堆和内存使用等的程序)连接到在 Docker 容器中的 AWS Fargate 上运行的 Spring Boot 应用程序(Java 应用程序)。

我已经相应地公开了 JMX 端口,并且在本地运行 Docker 容器时能够通过 JMX 端口进行连接。但是,在 Fargate 上运行 Java App 时,我还没有找到通过 JMX 连接到 Container 的方法。我试过设置 VM 参数 -Djava.rmi.server.hostname 到容器的 IP 地址,但是当我尝试通过 JMX 连接时,它仍然无法连接。有没有人有这方面的经验?

JMX 命令供参考:

-Dcom.sun.management.jmxremote \
-Dcom.sun.management.jmxremote.local.only=false \
-Dcom.sun.management.jmxremote.authenticate=false \
-Dcom.sun.management.jmxremote.ssl=false \
-Djava.rmi.server.hostname=172.17.0.2 \
-Dcom.sun.management.jmxremote.port=9090\
-Dcom.sun.management.jmxremote.rmi.port=9090\
-jar java-api.jar server```

【问题讨论】:

  • 您使用的是哪个 JVM 版本?如果它是 8,那么由于解析 localhost 的问题,似乎不可能让 JMX 服务器运行。我已经使用 JVM 11 在 Fargate 容器中成功设置了远程 JMX 连接。确保端口在任务定义中公开,并且安全组允许此端口上的入站连接。另外,为了连接你的容器需要有一个公共 IP,并且你需要使用公共 IP 来连接到容器(它可以在容器的任务详细信息中找到)。
  • 我使用的是 Java 11,JMX 端口也相应地暴露出来。然而,由于安全原因,容器只有一个私有 IP,我想这就是它失败的原因。

标签: java spring docker jmx aws-fargate


【解决方案1】:

以下更改对我有用,可将 Visual VM 连接到部署在 AWS Fargate(私有 VPC)中的 Spring Boot 应用程序

  • jvm 参数
-Dcom.sun.management.jmxremote \
-Dcom.sun.management.jmxremote.port=1099 \
-Dcom.sun.management.jmxremote.rmi.port=1099 \
-Dcom.sun.management.jmxremote.ssl=false \
-Dcom.sun.management.jmxremote.authenticate=false \
-Dcom.sun.management.jmxremote.local.only=false \
-Djava.rmi.server.hostname=127.0.0.1
  • 导出端口 1099(在 dockerfile 和 cloudformation 模板中 - PortMappings->ContainerPort)

  • 容器安全组在 1099(tcp 和 udp)上接受来自 vpc(跳转服务器)中现有 EC2 之一的传入流量

  • 使用 EC2(跳转服务器)将 ssh 端口转发到在 fargate 中运行的任务(使用在 fargate 中运行的任务的私有 ip)

在本地运行以下命令

ssh -l <user> -L 127.0.0.1:1099:<task-private-ip-in-fargate>:1099 <ec2-ip(jump server)>
  • 在 127.0.0.1:1099 上使用 JMX 连接连接 VisualVM

【讨论】:

    猜你喜欢
    • 2021-11-21
    • 1970-01-01
    • 1970-01-01
    • 2016-05-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多