2016-02-03 13 views
11
  1. In kubernetes Posso esporre servizi con service. Questo va bene.
  2. Diciamo che ho 1 istanza web e 10 istanze del server Java.
  3. Ho un gateway di Windows sono abituato a accedere a tali istanze 10 server Java tramite il jconsole installato su di esso.
  4. Ovviamente non esporre tutto porto applicazioni tramite il servizio JMX kubernetes.

Quali sono le opzioni qui? come dovrei consentire a questo esterno di accedere al gateway di windows cluster di kubernetes su quelle porte jmx di quei 10 server? Qualche pratica qui?più nodi app come esporre jmx in kubernetes?

risposta

21

Un'altra opzione è quella di inoltrare porta JMX da K8 pod to PC locale con kubectl port-forward.

lo faccio in questo modo:

1). Aggiungere seguenti opzioni JVM per la vostra applicazione:

-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 parte critica è che:

  • La stessa porta dovrebbe essere usato come 'jmxremote.port' e 'jmxremote.rmi.port'. Questo è necessario per inoltrare solo una porta.

  • 127.0.0.1 deve essere passato come nome host del server rmi. Questo è necessario per la connessione JMX per funzionare tramite port forwarding.

2). Inoltrare la porta JMX (1099) al PC tramite looptionscal kubectl:

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

3). Aperto il collegamento JConsole alla porta locale 1099:

jconsole 127.0.0.1:1099 

questo modo perché rende possibile eseguire il debug di qualsiasi pod Java tramite JMX senza dover esporre pubblicamente JMX tramite il servizio K8 (che è meglio dal punto di vista della sicurezza).

+0

Questa è la spiegazione più semplice che ho incontrato e funziona perfettamente. Grazie! –

0

Penso che un modo è quello di aggiungere un'etichetta al pod con una stringa \ id univoca, ad esempio nome_caffa e utilizzare il comando expose per creare un nuovo servizio con il selettore di questo ID esclusivo \ string.

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

abbiamo fatto in modo seguente

  1. Aggiungere un'etichetta univoca per ogni pod. es: podid = asdw23443
  2. creare un nuovo servizio con il selettore di podid = asdw23443. Assicurati che nel servizio esporti le porte jmx sul pod tramite nodeport o loadbalancer.

Se si seleziona nodeport in servizio, perché un fare un'operazione di NAT potrebbe essere necessario dare seguente argomento JVM per ogni JVM è necessario collegarsi tramite jconsole

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

Non sono sicuro di averlo capito è che hai un podid per ogni istanza del pod? quindi se lo riduci da 10 a 20 allora hai accesso a tutte le istanze dei pod senza un load balancer? Voglio accedere a un'istanza di pod specifica. – Jas

+0

Non sono sicuro di averlo capito è che hai un podid per ogni istanza del pod? quindi se lo riduci da 10 a 1000 allora hai 1000 servizi? – Jas

+0

Sì in questo approccio è necessario creare un servizio per pod. Se hai 1000 pod allora dovrebbero esserci 1000 servizi. – Dimuthu