web-dev-qa-db-fra.com

plusieurs nœuds d'application comment exposer jmx dans kubernetes?

  1. Dans kubernetes, je peux exposer des services avec service. C'est bon.
  2. Disons que j'ai 1 instance Web et 10 instances de serveur Java.
  3. J'ai une passerelle Windows. Je suis habitué à accéder à ces 10 instances de serveurs Java via la console jconsole installée dessus.
  4. Évidemment, je n'expose pas toutes les applications du port jmx via le service kubernetes.

Quelles sont mes options ici? comment dois-je autoriser cet accès externe à la passerelle Windows de cluster kubernetes à ces 10 ports jmx de serveurs? Des pratiques ici?

22
Jas

Une autre option consiste à transférer le port JMX du pod K8 vers votre PC local avec kubectl port-forward

Je le fais comme ça:

1). Ajoutez les options JVM suivantes à votre application:

-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

La partie critique ici est que:

  • Le même port doit être utilisé comme "jmxremote.port" et "jmxremote.rmi.port". Ceci est nécessaire pour transférer un seul port.

  • 127.0.0.1 doit être passé en tant que nom d’hôte du serveur rmi. Cela est nécessaire pour que la connexion JMX fonctionne via le transfert de port.

2) Transférez le port JMX (1099) sur votre PC local via kubectl:

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

3) Ouvrez la connexion jconsole sur votre port local 1099:

jconsole 127.0.0.1:1099

Cela permet de déboguer n'importe quel pod Java via JMX sans avoir à exposer publiquement JMX via le service K8 (ce qui est préférable du point de vue de la sécurité).

Une autre option qui peut également être utile consiste à attacher l’agent Jolokia ( https://jolokia.org/ ) au processus Java à l’intérieur du conteneur afin qu’il proxise le port JMX sur HTTP et expose ou transfère ce port HTTP port pour interroger JMX sur HTTP.

48
daniilyar

Nous l'avons fait de la manière suivante 

  1. Ajoutez une étiquette unique pour chaque pod. ex: podid = asdw23443
  2. Créez un nouveau service avec le sélecteur podid = asdw23443. Assurez-vous que, dans le service, vous exposez les ports jmx sur le pod via nodeport ou loadbalancer.

Si vous sélectionnez nodeport dans le service, étant donné que vous effectuez une opération NAT, vous devrez peut-être donner l'argument JVM suivant pour chaque JVM que vous devez connecter via jconsole.

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

Je pense qu'une solution consiste à ajouter une étiquette à votre pod avec une chaîne unique\id, par exemple, nom_pod et à utiliser la commande expose pour créer un nouveau service avec le sélecteur de cet identificateur unique\string.

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