2016-02-03 14 views
11
  1. In kubernetes kann ich Dienste mit service aussetzen. Das ist in Ordnung.
  2. Sagen wir, ich habe 1 Web-Instanz und 10 Java-Server-Instanzen.
  3. Ich habe ein Windows-Gateway Ich bin verwendet, um auf diese 10 Java-Server-Instanzen über die jconsole auf ihm installiert zugreifen.
  4. Offensichtlich stelle ich nicht alle Apps jmx-Port über kubernetes-Dienst zur Verfügung.

Was sind meine Optionen hier? Wie sollte ich diesen externen zu klabernetes Cluster Windows Gateway Zugang zu diesen 10 Servern jmx Ports erlauben? Irgendwelche Praktiken hier?mehrere App-Knoten, wie jmx in kubernetes ausgesetzt werden?

Antwort

21

eine weitere Option verbinden müssen, ist weiterleiten JMX-Port von K8 Pod zu Ihrem lokalen PC mit kubectl port-forward.

Ich mache es so:

1). Fügen Sie folgende JVM-Optionen auf Ihre App:

-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 

Der kritische Teil hierbei ist, dass:

  • Der gleiche Port sollte als 'jmxremote.port' verwendet werden und 'jmxremote.rmi.port'. Dies wird benötigt, um nur einen Port weiterzuleiten.

  • 127.0.0.1 sollte als rmi Server Hostname übergeben werden. Dies ist erforderlich, damit die JMX-Verbindung über die Portweiterleitung funktioniert.

2). Leiten Sie die JMX-Port (1099) auf Ihren looptionscal PC über kubectl:

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

3). Öffnen jconsole Verbindung mit der lokal Port 1099:

jconsole 127.0.0.1:1099 

Auf diese Weise, da macht es möglich, via JMX jeden Java-Pod zu debuggen, ohne dass öffentlich JMX aussetzen über K8 Service (was aus Sicht der Sicherheit besser ist).

+0

Dies ist die einfachste Erklärung, die ich kenne und funktioniert perfekt. Vielen Dank! –

0

Ich denke, eine Möglichkeit besteht darin, eine Beschriftung zu Ihrem Pod mit einer eindeutigen Zeichenfolge \ id für pod_name hinzuzufügen und den Befehl expose zu verwenden, um einen neuen Dienst mit dem Selektor dieser eindeutigen ID \ string zu erstellen.

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

Wir haben es in folgenden Weise

  1. für jeden pod eine eindeutige Bezeichnung hinzufügen. ex: podid = asdw23443
  2. Erstellen Sie einen neuen Dienst mit dem Selektor von podid = asdw23443. Stellen Sie sicher, dass Sie im Service die jmx-Ports auf dem Pod über nodeport oder loadbalancer bereitstellen.

Wenn Sie nodeport in Dienst auswählen, weil Sie eine NAT-Betrieb tun können Sie folgende JVM-Argument geben müssen für jede JVM Sie jconsole durch

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

Ich bin mir nicht sicher, dass ich es habe, dass Sie eine Podid für jede Instanz des Pods haben? Wenn Sie also von 10 auf 20 skalieren, haben Sie Zugriff auf alle Pod-Instanzen ohne Load Balancer? Ich möchte Zugriff auf eine bestimmte Pod-Instanz haben. – Jas

+0

Ich bin mir nicht sicher, dass ich es habe, dass du eine Podid für jede Pod-Instanz hast? Wenn Sie also von 10 auf 1000 skalieren, haben Sie 1000 Dienste? – Jas

+0

Ja, bei dieser Methode müssen Sie einen Service pro Pod erstellen. Wenn Sie 1000 Pods haben, sollte es 1000 Dienste geben. – Dimuthu

Verwandte Themen