2017-06-05 51 views
2

我有一个部署到Azure的dc/os群集。我用java应用程序向集群部署了一个容器。但我无法通过jmx访问它。DC/OS JMX访问

让我们部署非标准的Tomcat图像的示例:

1)I打开的端口8081,根据下一个指令:https://docs.microsoft.com/en-us/azure/container-service/container-service-enable-public-access#open-a-port-portal

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任务控制。我将字段'Host'和'Port'填充为'prefixagents.westeurope.cloudapp.azure.com'和'8081'。但我无法连接,我收到一条消息:'无法连接'。

但对于所有这些我可以使用Telnet客户端成功地连接到这个端口:

telnet prefixagents.westeurope.cloudapp.azure.com 8081

我也可以连接到端口8080,我可以打开以下网址的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:连接拒绝主机:10.0.0.4”。 10.0.0.4是我的公共代理节点的主机名。

我使用https://docs.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打开。

+0

DC/OS代理ssh服务不会暴露给Internet。您可以ssh到主虚拟机上的代理。主节点和代理节点使用相同的ssh密钥。您可以将您的私钥复制到主虚拟机。 ssh -i /id_rsa [email protected] 您也可以使用FileZilla将私钥上传到主虚拟机。 –

+0

当我在'docker exec -it 3802221a5808 bash'时,我用'ps -ef | grep jmx'找到了jmx进程。我得到结果'root @ 3802221a5808:/ usr/local/tomcat/bin#ps -ef | grep jmx root 1 0 4 06:50? 00:00:27/docker-java-home/jre/bin/java -Djava.util.logging.config.file =/usr/local/tomcat/conf/logging.properties -Djava.util.logging.manager = org .apache.juli.ClassLoaderLogManager -Dcom.sun.management.jmxremote -Djava.rmi.server.hostname = 0.0.0.0 -Dcom.sun.managem .... ' –

+0

根据我的经验,似乎你的配置是正确。你可以尝试将你的应用程序部署到tomcat容器并再次测试吗? –

回答

2

我在JAVA_OPTS字符串中更改了属性-Djava.rmi.server.hostname的值:-Djava.rmi.server.hostname =“public agent ip”。它适用于我。 工作配置的情况下,一个非标准的Tomcat容器8081端口是开放的:

{ 
    "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 
    } 
    ] 
} 

,我还可以通过JMX从本地机器使用连接到Tomcat:主机=“公共代理IP”和端口= 8081

公共代理ip =“前缀”agents.westeurope.cloudapp.azure.com

1

有没有人有任何想法,为什么我可以通过jmx 从我的主节点连接到服务,但我不能从我的本地机器?端口8081是 已打开。

您应该连接jmx作为以下命令。

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

更新:

主机名应该是public agent ip,那么你可以从你的PC连接JMX。

+0

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