DC/OS JMX访问

3

我部署在Azure上的DC/OS群集。我在群集中部署了一个包含Java应用程序的容器。但是我无法通过JMX访问它。

以部署标准Tomcat镜像为例:

1)根据https://learn.microsoft.com/en-us/azure/container-service/container-service-enable-public-access#open-a-port-portal的说明,我打开了8081端口。

2)我使用下面的JSON部署服务:

{
  "id": "/tomcat",
  "instances": 1,
  "cpus": 1,
  "mem": 512,
  "container": {
    "type": "DOCKER",
    "docker": {
      "image": "tomcat:8.0",
      "network": "BRIDGE",
      "portMappings": [
        { "protocol": "tcp", "hostPort": 8080   , "containerPort": 8080 },
        { "protocol": "tcp", "hostPort": 8081   , "containerPort": 8081 }
      ]
    }
  },
  "requirePorts": true,
  "acceptedResourceRoles": [
    "slave_public"
  ],
  "env": {      
    "JAVA_OPTS": "-Dcom.sun.management.jmxremote -Djava.rmi.server.hostname=10.0.0.4 -Dcom.sun.management.jmxremote.port=8081 -Dcom.sun.management.jmxremote.rmi.port=8081 -Dcom.sun.management.jmxremote.local.only=false -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false"
  },
  "healthChecks": [
    {
      "gracePeriodSeconds": 120,
      "intervalSeconds": 30,
      "maxConsecutiveFailures": 3,
      "path": "/",
      "portIndex": 0,
      "protocol": "HTTP",
      "timeoutSeconds": 5
    }
  ]
}

我使用Oracle Java Mission Control进行连接。我将“主机”和“端口”字段填写为“prefixagents.westeurope.cloudapp.azure.com”和“8081”。但我无法连接,收到一条消息:“无法连接”。
尽管如此,我可以使用telnet客户端成功连接到这个端口:
telnet prefixagents.westeurope.cloudapp.azure.com 8081
此外,我可以连接到端口8080,并可以在以下URL中打开Tomcat Web控制台:http://agents.westeurope.cloudapp.azure.com:8080
我安装了另一个jmx命令行客户端-http://wiki.cyclopsgroup.org/jmxterm/并尝试连接到服务:
java -jar jmxterm-1.0-alpha-4-uber.jar  --url service:jmx:rmi:///jndi/rmi://<prefix>agents.westeurope.cloudapp.azure.com:8081/jmxrmi

我得到了下一个异常:"java.rmi.ConnectException: Connection refused to host: 10.0.0.4"。10.0.0.4是我的公共代理节点的主机名。
我使用https://learn.microsoft.com/en-us/azure/container-service/container-service-connect连接到我的dc/os集群(主节点)。我还在那里安装了jmxterm并尝试通过jmx连接到服务:
java -jar jmxterm.jar --url service:jmx:rmi:///jndi/rmi://10.0.0.4:8081/jmxrmi

我已经成功连接了。

有人知道为什么我可以从我的主节点通过jmx连接到服务,但是我无法从我的本地机器连接吗?端口8081已经打开。


DC/OS代理SSH服务不会暴露在互联网上。您可以通过Master VM ssh到代理。主节点和代理节点使用相同的ssh密钥。您可以将私钥复制到Master VM。ssh -i /id_rsa user@10.0.0.4您还可以使用FileZilla将私钥上传到Master VM。 - Shui shengbao
根据我的经验,看起来您的配置是正确的。您可以尝试将应用部署到Tomcat容器中再次测试吗? - Shui shengbao
curl 10.0.0.4:8081 curl:(52)服务器未返回任何信息 - typik89
似乎出现了相同的结果,看起来您无法访问主VM上的jmx。 - Shui shengbao
让我们在聊天中继续这个讨论 - Shui shengbao
显示剩余6条评论
2个回答

3

我更改了JAVA_OPTS字符串中的属性值-Djava.rmi.server.hostname:-Djava.rmi.server.hostname="公网IP"。这对我有用。

在端口8081开放的情况下,标准Tomcat容器的工作配置如下:

{
  "id": "/tomcat",
  "instances": 1,
  "cpus": 1,
  "mem": 512,
  "container": {
    "type": "DOCKER",
    "docker": {
      "image": "tomcat:8.0",
      "network": "BRIDGE",
      "portMappings": [
        { "protocol": "tcp", "hostPort": 8080   , "containerPort": 8080 },
        { "protocol": "tcp", "hostPort": 8081   , "containerPort": 8081 }
      ]
    }
  },
  "requirePorts": true,
  "acceptedResourceRoles": [
    "slave_public"
  ],
  "env": {      
    "JAVA_OPTS": "-Dcom.sun.management.jmxremote -Djava.rmi.server.hostname=<public agent ip> -Dcom.sun.management.jmxremote.port=8081 -Dcom.sun.management.jmxremote.rmi.port=8081 -Dcom.sun.management.jmxremote.local.only=false -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false"
  },
  "healthChecks": [
    {
      "gracePeriodSeconds": 120,
      "intervalSeconds": 30,
      "maxConsecutiveFailures": 3,
      "path": "/",
      "portIndex": 0,
      "protocol": "HTTP",
      "timeoutSeconds": 5
    }
  ]
}

我可以通过本地机器连接到Tomcat,使用JMX进行连接:主机名为“公共代理IP”,端口为8081。

公共代理IP = "前缀"agents.westeurope.cloudapp.azure.com


为了确保这种方法能够正常工作,关键是容器内使用的端口号与主机上使用的端口号相同(请参见portMappings数组)。如果它们不同,JMX代码将会告诉客户端回连到一个主机没有暴露的端口,从而连接失败。 - Tim

2

有人知道为什么我可以从我的主节点连接到jmx服务,但我无法从本地机器连接吗?端口8081已打开。

您应该使用以下命令连接jmx。

java -jar jmxterm.jar --url service:jmx:rmi:///jndi/rmi://<agent public IP>:8081/jmxrmi 

更新:

主机名应为公共代理IP,然后您可以从本地PC连接JMX。


嗨,Walter-MSFT,我连接到主节点和代理节点没有问题。我可以连接它们。我将一个tomcat容器部署到公共节点,ssh到主节点,结果我可以通过我的主节点从jmx连接到tomcat。但是我的问题在于无法从本地机器(主机:prefixagens.westeurope.cloudapp.azure.com)通过jmx连接到tomcat。JMX端口可以从互联网访问,我可以使用telnet客户端进行连接。但是当我尝试使用jmx客户端连接时,我会收到异常:拒绝连接到主机:10.0.0.4-内部公共代理节点主机名。 - typik89

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接