Доступ к DC/OS JMX

У меня есть кластер dc/os, развернутый в Azure. Я развернул в кластере контейнер с моим Java-приложением. Но я не могу получить к нему доступ через jmx.

Давайте рассмотрим пример развертывания стандартного образа tomcat:

1) Я открыл порт 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 Mission Control. Я заполняю поля «Хост» и «Порт» как «prefixagents.westeurope.cloudapp.azure.com» и «8081». Но я не могу подключиться и получаю сообщение: «Невозможно подключиться».

Но при всем этом я могу успешно подключиться к этому порту с помощью клиента telnet:

telnet prefixagents.westeurope.cloudapp.azure.com 8081

Также я могу подключиться к порту 8080 и открыть веб-консоль tomcat по следующему URL-адресу: 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 — это имя узла моего публичного агента.

Я подключился к своему кластеру dc/os (главный узел) с помощью https://docs.microsoft.com/en-us/azure/container-service/container-service-connect. Я также установил туда jmxterm и попытался подключиться к сервису через jmx:

java -jar jmxterm.jar --url service:jmx:rmi:///jndi/rmi://10.0.0.4:8081/jmxrmi

И я успешно подключился.

У кого-нибудь есть идеи, почему я могу подключиться к сервису через jmx с моего главного узла, но не могу с моей локальной машины? Порт 8081 открыт.


person typik89    schedule 05.06.2017    source источник
comment
Служба ssh агентов DC/OS не подключена к Интернету. Вы можете использовать ssh для агентов на Master VM. Главный узел и узел агента используют один и тот же ключ ssh. Вы можете скопировать свой закрытый ключ на основную виртуальную машину. ssh -i ‹путь›/id_rsa [email protected] Вы также можете использовать FileZilla для загрузки закрытого ключа на главную виртуальную машину.   -  person Shui shengbao    schedule 06.06.2017
comment
Когда я docker exec -it 3802221a5808 bash, я нахожу процесс jmx с ps -ef|grep 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....   -  person Shui shengbao    schedule 06.06.2017
comment
Исходя из моего опыта, кажется, что ваша конфигурация правильная. Не могли бы вы попробовать развернуть свое приложение в контейнере tomcat и снова протестировать?   -  person Shui shengbao    schedule 06.06.2017
comment
Does anybody have any ideas why I can connect to the service via jmx from my master node but I can't from my local machine? Port 8081 is opened. Вы имеете в виду, что можете получить доступ к jmx на главной ВМ curl 10.0.0.4:8081 на главной ВМ?   -  person Shui shengbao    schedule 06.06.2017
comment
Да, я имею в виду, что я могу получить доступ к jmx на главной виртуальной машине. Я не могу получить доступ к jmx с моей локальной машины, но я могу получить доступ к порту jmx с помощью клиента telnet.   -  person typik89    schedule 06.06.2017
comment
В главной виртуальной машине какой результат curl 10.0.0.4:8081?   -  person Shui shengbao    schedule 06.06.2017
comment
Я предлагаю вам лучше проверить, включаете ли вы jmx на главной виртуальной машине, главная виртуальная машина не открывает порт 8081.   -  person Shui shengbao    schedule 06.06.2017
comment
curl 10.0.0.4:8081 curl: (52) Пустой ответ с сервера   -  person typik89    schedule 06.06.2017
comment
Тот же результат, похоже, вы не смогли получить доступ к jmx на главной виртуальной машине.   -  person Shui shengbao    schedule 06.06.2017
comment
Зачем? Я могу подключиться, и я подключился с помощью клиента jmx jmxterm:java -jar jmxterm.jar --url service:jmx:rmi:///jndi/rmi://10.0.0.4:8081/jmxrmi Добро пожаловать в терминал JMX. Введите help для доступных команд. $›azureuser@dcos-agent-public-...:~$   -  person typik89    schedule 06.06.2017
comment
Давайте продолжим обсуждение в чате.   -  person Shui shengbao    schedule 06.06.2017


Ответы (2)


Я изменил значение свойства -Djava.rmi.server.hostname в строке JAVA_OPTS: -Djava.rmi.server.hostname="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
    }
  ]
}

И я могу подключиться к tomcat через jmx, используя с локальной машины: host="public agent ip" и port=8081

IP-адрес публичного агента = «префикс» agent.westeurope.cloudapp.azure.com

person typik89    schedule 06.06.2017
comment
Чтобы этот подход работал, крайне важно, чтобы номер порта, используемый внутри контейнера, совпадал с номером порта, используемым на хосте (см. массив portMappings). Если они отличаются, код JMX сообщит клиенту о необходимости обратного подключения к порту, отличному от того, который был открыт хостом, и подключение завершится ошибкой. - person Tim; 20.07.2018

У кого-нибудь есть идеи, почему я могу подключиться к сервису через jmx с моего главного узла, но не могу с моей локальной машины? Порт 8081 открыт.

Вы должны подключить jmx как следующую команду.

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

Обновлять:

имя хоста должно быть public agent ip, тогда вы можете подключить jmx с вашего локального ПК.

person Shui shengbao    schedule 06.06.2017
comment
Привет, Walter-MSFT, у меня нет проблем с подключением к главному узлу и узлу агентов. Я могу подключиться к ним. Я развернул контейнер tomcat на общедоступном узле, подключил sshed к главному узлу, и в результате я смог подключиться к tomcat через jmx с моего главного узла. Но моя проблема заключается в подключении к tomcat через jmx с моей локальной машины (хост: prefixagens.westeurope.cloudapp.azure.com). Порт JMX доступен из Интернета, и я могу подключиться с помощью клиента telnet. Но когда я пытаюсь подключиться с помощью jmx, я получаю исключение: в соединении отказано хосту: 10.0.0.4- внутреннее имя хоста узла публичного агента. - person typik89; 06.06.2017