2017-06-05 49 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