Несколько узлов приложения, как выставить jmx в кубернетах?

  • В kubernetes я могу открыть службы с помощью service. Это нормально.
  • Предположим, что у меня есть 1 веб-экземпляр и 10 экземпляров Java-сервера.
  • У меня есть оконный шлюз, который я использую для доступа к этим 10 экземплярам java-серверов через установленную на нем консоль.
  • Очевидно, что я не показываю все jmx-порты приложений через сервис kubernetes.

Каковы мои варианты здесь? как я могу разрешить этому внешнему по отношению к kubernetes кластеру шлюз доступа к этим 10 портам jmx-портов? Какие-нибудь практики здесь?

Ответ 1

Другой вариант - переслать JMX-порт из K8 pod на ваш локальный ПК с kubectl port-forward.

Я делаю это так:

1). Добавьте следующие параметры JVM в ваше приложение:

-Dcom.sun.management.jmxremote
-Dcom.sun.management.jmxremote.authenticate=false
-Dcom.sun.management.jmxremote.ssl=false
-Dcom.sun.management.jmxremote.local.only=false
-Dcom.sun.management.jmxremote.port=1099
-Dcom.sun.management.jmxremote.rmi.port=1099
-Djava.rmi.server.hostname=127.0.0.1

Критическая часть здесь заключается в следующем:

  • Тот же порт следует использовать как "jmxremote.port" и "jmxremote.rmi.port". Это необходимо для пересылки только одного порта.

  • 127.0.0.1 должен быть передан как имя хоста сервера rmi. Это необходимо для подключения JMX для работы через переадресацию портов.

2). Переместите порт JMX (1099) на ваш looptionscal ПК через kubectl:

kubectl port-forward <your-app-pod> 1099

3). Откройте соединение jconsole с вашим локальным портом 1099:

jconsole 127.0.0.1:1099

Этот способ, потому что позволяет отлаживать любой Java-модуль через JMX без публичного раскрытия JMX через службу K8 (что лучше с точки зрения безопасности).

Ответ 2

Мы сделали это следующим образом

  • Добавьте уникальный ярлык для каждого контейнера. ex: podid = asdw23443
  • Создайте новый сервис с селектором podid = asdw23443. Убедитесь, что в службе вы открываете порты jmx на контейнере через узел или loadbalancer.

Если вы выбираете nodeport в сервисе, потому что вы выполняете операцию NAT, вам может потребоваться предоставить следующий аргумент JVM для каждого jvm, вам необходимо подключиться через jconsole

-Djava.rmi.server.hostname=<your-ip-address>

Ответ 3

Я думаю, что одним из способов является добавление метки к вашему модулю с уникальной строкой \id, например pod_name, и использование команды expose для создания новой службы с помощью селектора этого уникального идентификатора \string.

kubectl label pods <podname> podname=<podname>
kubectl expose pod <podname> --port=9010 --name=<podname>_jmx