[JAVA] VisualVM (JMX-Verbindung) mit Kubernetes

Einführung

Dieses Mal werde ich VisualVM verwenden, um eine Verbindung zu einer Java-App herzustellen, die auf k8s ausgeführt wird. Ich denke, es wird bei der Überwachung und Analyse von Java-Anwendungen verwendet. Da es sich um einen Container handelt, ist es meiner Meinung nach üblich, Metriken mit Prometheus zu erfassen. Dieses Mal werde ich jedoch das von Java bereitgestellte Tool verwenden, da es Java-Entwicklern vertraut ist.

Umweltinformationen

Kubernetes:1.18 helm:v3.2 ※https://helm.sh/docs/intro/quickstart/ Java:1.8 Jenkins:2.235

Jenkins Behältervorbereitung

Stellen Sie den Jenkins-Container mit Helm bereit.

Erstellen Sie zunächst eine Parameterdatei für die Bereitstellung.

IP-Adresse des Worker-Knotens


$ kubectl get nodes --namespace jenkins -o jsonpath="{.items[0].status.addresses[0].address}"

values.yaml


master:
  serviceType: NodePort
  javaOpts: >
    -Djava.rmi.server.hostname=0.0.0.0
    -Dcom.sun.management.jmxremote=true
    -Dcom.sun.management.jmxremote.port=32000
    -Dcom.Sun.management.jmxremote.local.only=false
    -Dcom.sun.management.jmxremote.rmi.port=32000
    -Dcom.sun.management.jmxremote.ssl=false
    -Dcom.sun.management.jmxremote.authenticate=false
    -Djava.rmi.server.hostname=192.168.10.51
  jmxPort: 32000

Erstellen Sie außerdem eine Yaml-Datei, die den Dienst für den JMX-Zugriff definiert.

svc.yaml


apiVersion: v1
kind: Service
metadata:
  name: jenkins-jmx
  namespace: jenkins
spec:
  ports:
  - name: jmx
    nodePort: 32000
    port: 32000
    protocol: TCP
    targetPort: 32000
  selector:
    app.kubernetes.io/component: jenkins-master
    app.kubernetes.io/instance: jenkins
  type: NodePort

Sofort bereitstellen.

deploy_jenkins


#Erstellen Sie einen Jenkins-Namespace
$ kc create ns jenkins

#k8s Verbindungseinstellungen(context)Bestätigung
$ kc config current-context
sandbox

#k8s Verbindungseinstellungen(context)Namespace-Einstellung
$ kc config set-context sandbox --namespace jenkins

#Bestätigung des Verbindungsziel-Namespace k8s
$ kc config get-contexts
CURRENT   NAME                CLUSTER             AUTHINFO   NAMESPACE
*         sandbox             sandbox             sandbox    jenkins

#Helm-Repository hinzugefügt / Repository-Informationen aktualisiert
$ helm repo add stable https://kubernetes-charts.storage.googleapis.com
"stable" has been added to your repositories

$ helm repo update
Hang tight while we grab the latest from your chart repositories...
...Successfully got an update from the "stable" chart repository
Update Complete. ? Happy Helming!?

#Jenkins Container-Bereitstellung
# helm install <Veröffentlichungsname> <Diagrammname> -f <parameter file> --namespace <Namespace des Bereitstellungsziels>
#Versionsname: Helms Verwaltungsname für die Bereitstellung
#Diagrammname: Zu verwendender Vorlagenname
$ helm install jenkins stable/jenkins -f values.yaml --namespace jenkins
NAME: jenkins
LAST DEPLOYED: Sat Jul 25 hh:mm:ss 2020
NAMESPACE: jenkins
STATUS: deployed
REVISION: 1
NOTES:
1. Get your 'admin' user password by running:
  printf $(kubectl get secret --namespace jenkins jenkins -o jsonpath="{.data.jenkins-admin-password}" | base64 --decode);echo
2. Get the Jenkins URL to visit by running these commands in the same shell:
  export NODE_PORT=$(kubectl get --namespace jenkins -o jsonpath="{.spec.ports[0].nodePort}" services jenkins)
  export NODE_IP=$(kubectl get nodes --namespace jenkins -o jsonpath="{.items[0].status.addresses[0].address}")
  echo http://$NODE_IP:$NODE_PORT/login

3. Login with the password from step 1 and the username: admin
・ ・ ・

#Bestätigen Sie die Bereitstellung
$ helm list
NAME    NAMESPACE       REVISION        UPDATED                                 STATUS          CHART         APP VERSION
jenkins jenkins         1               2020-MM-DD hh:mm:ss.950509962 +0900 JST deployed        jenkins-2.4.1 lts

Der von helm erstellte Container verfügt nicht über eine Definition des Dienstes für die Verbindung mit JMX. Stellen Sie den Dienst daher separat bereit.

deploy_service


$ kubectl get svc
NAME            TYPE        CLUSTER-IP     EXTERNAL-IP   PORT(S)          AGE
jenkins         NodePort    10.43.173.89   <none>        8080:31036/TCP   12m
jenkins-agent   ClusterIP   10.43.130.60   <none>        50000/TCP        12m

$ kubectl apply -f svc.yaml
service/jenkins-jmx created

# kubectl get svc
NAME            TYPE        CLUSTER-IP     EXTERNAL-IP   PORT(S)           AGE
jenkins         NodePort    10.43.173.89   <none>        8080:31036/TCP    12m
jenkins-agent   ClusterIP   10.43.130.60   <none>        50000/TCP         12m
jenkins-jmx     NodePort    10.43.97.82    <none>        32000:32000/TCP   19s

Stellen Sie eine Verbindung mit Java Visual VM her

Stellen Sie jetzt eine JMX-Verbindung zum gestarteten Jenkins-Container her. Starten wir Java VisualVM und stellen Sie eine Verbindung zum Jenkins-Container her. Es ist auch im JDK usw. enthalten, aber dieses Mal werde ich mich mit der 1.8 Java VisualVM verbinden, die mit Plejaden geliefert wird (alles in einer Sonnenfinsternis). https://mergedoc.osdn.jp/

image.png

  1. Klicken Sie im linken Menü mit der rechten Maustaste auf "Remote". ⇒ Klicken Sie auf "Remote-Host hinzufügen".
  2. Geben Sie den in javaOpts angegebenen Hostnamen (IP-Adresse) unter "Hostname" ein und klicken Sie auf "OK".
  3. Vergewissern Sie sich, dass der Remote-Computer zum linken Menü hinzugefügt wurde
  4. Klicken Sie im linken Menü mit der rechten Maustaste auf den registrierten Computer. ⇒ Klicken Sie auf "JMX-Verbindung hinzufügen".
  5. Da der Hostname unter "Verbinden" eingegeben wird, geben Sie die Portnummer (in diesem Fall 32000) nach dem: (Doppelpunkt) ein.
  6. Aktivieren Sie "Keine SSL-Verbindung verwenden" und klicken Sie auf "OK".
  7. Vergewissern Sie sich, dass die Verbindung unter dem registrierten Remote-Computer im linken Menü hinzugefügt wurde.
  8. Doppelklicken Sie auf die hinzugefügte Verbindung und bestätigen Sie, dass die Informationen auf dem Hauptbildschirm angezeigt werden.

** Bildschirm nach Verbindung **

image.png

** Registerkarte Überwachung **

image.png

** Thread-Registerkarte **

image.png

Als Bonus sieht es so aus, wenn ich versuche, mich mit jconsole zu verbinden.

image.png

Zusammenfassung

Dieses Mal habe ich versucht, mit VisualVM oder jconsole eine Verbindung zu einem Container herzustellen, der auf k8s ausgeführt wird. Ich konnte keine Verbindung herstellen, indem ich einen gemeinsamen Port öffnete. Deshalb habe ich Folgendes hinzugefügt und festgelegt.

Bitte verwenden Sie dies als Referenz, wenn Sie eine Verbindung mit einem vertrauten Tool anstelle von Prometheus herstellen.

Recommended Posts

VisualVM (JMX-Verbindung) mit Kubernetes
[Vorlage] MySQL-Verbindung mit Java
Versuchen Sie eine DB-Verbindung mit Java
[PDO → DB-Verbindung mit Docker, PHP]
JDBC-Verbindung mit MySQL 8.x * Hinweise *