2016-12-09 6 views
2

JConsole, Java Mission Control과 같은 클라이언트를 사용하여 Java 응용 프로그램 (Java 8 및 Spring Boot 1.4 및 Tomcat)에서 1099 (기본값)로 정의 된 JMX 포트에 연결하려고합니다. 또는 Java VisualVM과, 그러나 나는 오류에 도달하고있다 : 나는 정확한 호스트 IP를 숨겨Kubernetes에서 관리하는 Docker 컨테이너를 통해 JMX에 어떻게 연결할 수 있습니까?

java.rmi.ConnectException: Connection refused to host: 10.xxx.xxx.xx, nested exception is: 
    java.net.ConnectException: Connection timed out 
    ... 

참고하지만, 내 서비스에 배포 된 특정는 Kubernetes 관리 도커 컨테이너의 포드 IP입니다 내가하려고합니다.

jconsole service:jmx:rmi://<nodeIP>:<nodePort>/jndi/rmi://<nodeIP>:<nodePort>/jmxrmi 

내가 JMX는 random high port을 엽니 다 알고 : 다음과 같은 서비스 URL을 사용하여 JMX 포트에 연결 나는 custom @Configuration class that forces that high port to also serve on port 1099을 포함하여이를 해결하려고 노력했습니다. 내가 실제 컨테이너와 포드에 사라와 열려있는 포트를 볼 수

netstat -tulpn 

을 달리고, 내가 열 수있는 유일한 포트 (내 응용 프로그램이 실행되고있는) 8443 및 1099 있음을 확인했습니다했다합니다 (JMX 포트); 이것은 내 수업이 작동 함을 나타냅니다. 나는 또한 포트 1099가 Kubernetes쪽에 열려 있음을 확인 했으므로 차단하지 않습니다. 대답은 JMX 포트와 RMI 레지스트리 포트를 강제 제안

-Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.port=1099 -Dcom.sun.management.jmxremote.jmi.port=1099 -Djava.rmi.server.hostname=0.0.0.0 

하십시오 JMX 원격 연결을 둘러싼

로 많은 대답은 내가 아무 소용이 다음과 같은 Java 옵션의 많은 변화를 시도했다 제안 동일하지만, 이들 중 어느 것도 효과가 없습니다.

호스트 이름 (-Djava.rmi.server.hostname = 0.0.0.0으로 동적으로 만들려고 했으므로)이 매번 생성 된 다른 호스트 이름 (포드 IP)을 확인할 수 없기 때문에이 문제가 발생할 수 있다고 생각합니다. 내 서비스가 배포됩니다.

따라서 JMX는 내 서비스가 배포 된 후 Kubernetes가 할당 한 호스트 이름을 볼 수 없기 때문에 연결을 완료 할 수없는 것처럼 보입니다.

JMX가 Kubernetes 호스트 이름을 인식 할 수있는 방법이 있습니까? 아니면 Kubernetes가 배포 한 서비스를 통해 JMX 포트에 원격으로 연결할 수있는 다른 방법이 있습니까?

EDIT 1 : 추가 조사를 해본 결과, RMI 대신 선택적 JMXMP가 작동 할 수 있습니까? Tomcat에서이 작업을하는 사람이 있습니까?

+0

'kubectl port-forward [podname] 1099 : 1099'를 사용하여 듣고 있는지 테스트 해 보셨습니까? – 3ocene

+0

또한 [10.xxx.xxx.xxx IP 범위가 예약되어 있습니다] (https://en.wikipedia.org/wiki/Private_network). 공개 IP가 아니기 때문에 연결할 수 없습니다. 노드의 IP 주소를 통해 대화 상대와 통신하려면 서비스 및 수신을 설정해야합니다. – 3ocene

+0

우리의 경우 @3cene 포트 포워드는 옵션이 아닙니다. 우리는 상황에 맞게 노드 포트를 사용할 수 있어야합니다. 10.xxx.xxx.xxx 주소는 개인 IP이며 클러스터는 개인 네트워크의 일부입니다.클러스터의 노드에서 podIP : 1099와 연결 작업까지 ssh-tunnel을했지만 node : nodePort와는 작동하지 않습니다. – realgenob

답변

1

jmx 원격 연결은 작동하기에 고통 스럽습니다. 내 생각으로는 프록시를 사용할 수 없습니다. 비슷한 문제가 있었고 결국 jolokia를 사용하여 연결했습니다.

Jolokia는 JSR-160 커넥터 대신 사용할 수있는 JMX-HTTP 브리지입니다. 이것은 많은 플랫폼을 지원하는 에이전트 기반 접근 방식입니다. 기본 JMX 작업 외에도 대량 요청 및 세분화 된 보안 정책과 같은 고유 기능으로 JMX 리모팅을 향상시킵니다. ->http://jolokia.org

+0

Jolokia를 공유해 주셔서 감사합니다. 컨테이너에 에이전트를 설치하게 되었습니까? (Java 응용 프로그램에 .jar 파일의 경로가 포함 된 인수가있는 것처럼 보입니다)? 또는 Spring 애플리케이션 컨텍스트가있는 경우 간단한 Maven 종속성을 추가 했습니까? – Tremaine

+0

내 경우에는 전쟁 버전 만 사용합니다. 내 요구에 잘 맞습니다. –

+0

반가워요. 내가 가진 현재의 접근 방식으로 다른 모든 것이 실패한다면 나는이 길로 들어갈 수있다. (소켓을 통한) 지속적인 모니터링이 필요합니까 아니면 단순히 요청과 응답입니까? – Tremaine

관련 문제